isign4jc Posted March 20, 2008 Share Posted March 20, 2008 I'm working with PHP/MySQL to create a search box for a website. The problem I'm having is that when the results are more than the maximum allowed per page (2), it displays the "next 2" button after every result like below. How do I make it so that it only appears once at the bottom of all the results for the given page? orange you glad you picked this? a movie a day keeps the doctor away a movie a day keeps the docto... -------------------------------------------------------------------------------- Next 2 test hello there, doctor. hello nice to see you hats hats dogs dogs -------------------------------------------------------------------------------- Next 2 Here is the code at the end of my search code that I think is the culprit: <hr> <?php } //end foreach $trimmed_array if($row_num_links_main > $limit){ // next we need to do the links to other search result pages if ($s>=1) { // do not display previous link if 's' is '0' $prevs=($s-$limit); echo "<div align='left'><a href='$PHP_SELF?s=$prevs&q=$var&catid=$catid'>Previous " .$limit. "</a></div>"; } // check to see if last page $slimit =$s+$limit; if (!($slimit >= $row_num_links_main) && $row_num_links_main!=1) { // not last page so display next link $n=$s+$limit; echo "<div align='right'><a href='$PHP_SELF?s=$n&q=$var&catid=$catid'>Next " .$limit. "</a></div>"; } } } //end foreach $newarr ?> Quote Link to comment Share on other sites More sharing options...
soycharliente Posted March 20, 2008 Share Posted March 20, 2008 Take the link outside the foreach loop. Quote Link to comment Share on other sites More sharing options...
isign4jc Posted March 20, 2008 Author Share Posted March 20, 2008 Hm...I tried that before, but then it listed the next and previous links regardless of whether there was a next or previous page. Quote Link to comment Share on other sites More sharing options...
soycharliente Posted March 20, 2008 Share Posted March 20, 2008 Then make the echo in a conditional. If first, only next. If last, only prev. Quote Link to comment Share on other sites More sharing options...
isign4jc Posted March 20, 2008 Author Share Posted March 20, 2008 Thanks for trying to help. I'm guessing you're second solution would have worked as well, but I looked at my script again and realized that the entirety of the snippet that i posted was inside another larger loop that was including the whole search script. Once I placed it outside as you suggested, while being careful not to delete the necessary closing tags, it worked! Now i'm having another problem. When I search two words, and both words are contained within one search result, it shows that result twice, matching both words individually. I may be asking for too much help with this one, because I feel like it must be a bigger issue. I'll post my super long search code here in case anyone can help me out with this second issue. <?php //This is a working script //Make sure to go through it and edit database table filelds that you are seraching //This script assumes you are searching 3 fields require_once ('path for my mysql connect file goes here'); // Connect to the db. //specify how many results to display per page $limit = 2; // Get the search variable from URL $var = @$_GET['q'] ; //trim whitespace from the stored variable $trimmed = trim($var); //separate key-phrases into keywords $trimmed_array = explode(" ",$trimmed); // check for an empty string and display a message. if ($trimmed == "") { $resultmsg = "<p>Please enter a search...</p>" ; } // check for a search parameter if (!isset($var)){ $resultmsg = "<p>Please enter a search...</p>" ; } // Build SQL Query for each keyword entered foreach ($trimmed_array as $trimm){ // EDIT HERE and specify your table and field names for the SQL query $query = "SELECT DISTINCT page_id, heading, SUBSTRING(main_text,1,75) AS main_text FROM content WHERE heading LIKE \"%$trimm%\" OR main_text LIKE \"%$trimm%\" ORDER BY heading DESC" ; // Execute the query to get number of rows that contain search kewords $numresults=mysql_query ($query); $row_num_links_main =mysql_num_rows ($numresults); // next determine if 's' has been passed to script, if not use 0. // 's' is a variable that gets set as we navigate the search result pages. if (empty($s)) { $s=0; } // now let's get results. $query .= " LIMIT $s,$limit" ; $numresults = mysql_query ($query) or die ( "Couldn't execute query" ); $row= mysql_fetch_array ($numresults); //store record id of every item that contains the keyword in the array we need to do this to avoid display of duplicate search result. do{ //EDIT HERE and specify your field name that is primary key $adid_array[] = $row[ 'page_id' ]; }while( $row= mysql_fetch_array($numresults)); } //end foreach if($row_num_links_main == 0 && $row_set_num == 0){ $resultmsg = "<p>Search results for:" . $trimmed ."</p><p>Sorry, your search returned zero results</p>" ; } //delete duplicate record id's from the array. To do this we will use array_unique function $tmparr = array_unique($adid_array); $i=0; foreach ($tmparr as $v) { $newarr[$i] = $v; $i++; } // now you can display the results returned. But first we will display the search form on the top of the page ?> <form action="search.php" method="get" name="search"> <div align="center"> <input name="q" type="text" value=" <?php echo $q; ?> " size="15"> <input name="search" type="submit" value="Search"> </div> </form> <p><?php // display what the person searched for. if( isset ($resultmsg)){ echo $resultmsg; exit(); }else{ echo "Search results for: " . $var; } ?> </p> <?php foreach($newarr as $value){ // EDIT HERE and specify your table and field names for the SQL query $query_value = "SELECT DISTINCT page_id, heading, SUBSTRING(main_text,1,75) AS main_text FROM content WHERE page_id = '$value'"; $num_value=mysql_query ($query_value); $row_linkcat= mysql_fetch_array ($num_value); $row_num_links= mysql_num_rows ($num_value); //now let's make the keywods bold. To do that we will use preg_replace function. //EDIT parts of the lines below that have fields names like $row_linkcat[ 'field1' ] //This script assumes you are searching only 3 fields. If you are searching more fileds make sure that add appropriate line. $titlehigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'heading' ] ); $linkhigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'main_text' ] ); foreach($trimmed_array as $trimm){ if($trimm != 'b' ){ //IF you added more fields to search make sure to add them below as well. $titlehigh = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $titlehigh); $linkhigh = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $linkhigh); } //end highlight switch ($value) { case '1': echo '<a href="http://www.leppdesign.com/index.html"target="_blank"><h4>' . $titlehigh . '</h4></a>'; break; case '2': echo '<a href="http://www.leppdesign.com/aboutus.html"target="_blank"><h4>' . $titlehigh . '</h4></a>'; break; case '3': echo '<a href="http://www.leppdesign.com/contact.html"target="_blank"><h4>' . $titlehigh . '</h4></a>'; break; case '4': echo '<a href="http://www.leppdesign.com/resources.html"target="_blank"><h4>' . $titlehigh . '</h4></a>'; break; case '5': echo '<a href="http://www.leppdesign.com/services.html"target="_blank"><h4>' . $titlehigh . '</h4></a>'; break; } ?> <p> <?php echo $linkhigh; ?>... </p> <hr> <?php } //end foreach $trimmed_array } //end foreach $newarr ?> <?php if($row_num_links_main > $limit){ // next we need to do the links to other search result pages if ($s>=1) { // do not display previous link if 's' is '0' $prevs=($s-$limit); echo "<div align='left'><a href='$PHP_SELF?s=$prevs&q=$var&catid=$catid'>Previous " .$limit. "</a></div>"; } // check to see if last page $slimit =$s+$limit; if (!($slimit >= $row_num_links_main) && $row_num_links_main!=1) { // not last page so display next link $n=$s+$limit; echo "<div align='right'><a href='$PHP_SELF?s=$n&q=$var&catid=$catid'>Next " .$limit. "</a></div>"; } } ?> Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.