New Help - Search Engine PHP/mySQL

Hey hows it going? Okay so I am EXTREMELY new to PHP, as in, this my first venture into it haha. I have a lot of experience with HTML and CSS, so codings not new to me, just PHP. I have a pretty basic code I got from a “tutorial” site, that I am trying to alter to fit what I am trying to do. I’ll give you as much detail as possible because I know thats very important in getting the help I need.

First off, I am building a search engine. But to search only fields I have input myself.

So I have page 1 which is “search.php”. This is just a simple search form. It “GETS”, and displays the results on “search_result.php”.

I also have a mySQL table setup called “news”. Which consists of:
ID: Int11, NOT NULL, Auto Increment, and Primary Key
Name: Varchar(255), NULL
Message: Varchar(255), NULL
Website: Varchar(255), NULL
Keywords: Varchar(255), NULL
Address: Varchar(255), NULL
Phone: Varchar(255), NULL

I want it to use Name, Message, and Keywords as the keywords. However, in the Search_result.php, I want “Keywords” omitted from the display, just used as a reference.

Now I’ve run into a couple problems. I had 1 very simple PHP code that was letting me display the results on “search_results.php”, but it wasnt actually searching. It would just display everything that I had input into my tables. So I went to a much more complex code (I know, the simple code wont work, so lets try an advanced one right?) I found on a tutorial site, and tried to edit to fit my criteria.

But I end up with the error:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/content/d/j/m/djmac14/html/mcpin/search_result2.php on line 37 Couldn't execute query

Where line 37 is:

$row_num_links_main =mysql_num_rows ($numresults);

Here is the 2nd set of code I tried. Please if anyone can offer any help. I’m using this basically as my “introduction” to PHP, and damn its complex!

<?php //connect to mysql

mysql_connect(“server”,“dbname”,“dbpass”);
mysql_select_db(“dbname”);

//specify how many results to display per page
$limit = 10;

// 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 = “

Search Error

Please enter a search…

” ;
}
// check for a search parameter
if (!isset($var)){
$resultmsg = “

Search Error

We don’t seem to have a search parameter!

" ;
}
// 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 FROM news WHERE keywords LIKE ‘%$trimm%’ OR name like ‘%$trimm%’ OR message like ‘%$trimm%’ ORDER BY keywords*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{
     $adid_array[] = $row[ 'id' ];
      }while( $row= mysql_fetch_array($numresults));

} //end foreach

if($row_num_links_main == 0 && $row_set_num == 0){
$resultmsg ="

Search results for: ". $trimmed.“

Sorry, your search returned zero results

” ;
}
//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
?>
<?php // display what the person searched for. if( isset ($resultmsg)){ echo $resultmsg; exit(); }else{ echo "Search results for: " . $var; } foreach($newarr as $value){ // EDIT HERE and specify your table and field names for the SQL query $query_value = "SELECT * FROM*news WHERE*keywords = '$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. //Replace field $titlehigh = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'keywords' ] ); $linkhigh = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'name' ] ); $linkdesc = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'message' ] ); foreach($trimmed_array as $trimm){ if($trimm != 'b' ){ $titlehigh = preg_replace( "'($trimm)'si" , " //1" , $titlehigh); $linkhigh = preg_replace( "'($trimm)'si" , " //1" , $linkhigh); $linkdesc = preg_replace( "'($trimm)'si" , " //1" , $linkdesc); } //end highlight ?>

<?php echo $titlehigh; ?>
<?php echo $linkhigh; ?>
<?php echo $linkhigh; ?>

<?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 "
Previous " .$limit. "
"; } // 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 "
Next " .$limit. "
"; } } } //end foreach $newarr ?>

And yes, I obviouslt omitted my mySQL information for security purposes. I’m connecting fine so thats not the problem, however I’m not sure about my table settings on the database.

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/content/d/j/m/djmac14/html/mcpin/search_result2.php on line 37

This error means that it’s getting passed an invalid result set as an argument. You’ll need to make sure that $numresults is a valid result set. The easiest way to do that is to make sure the query is run correctly. I see you using 'or die(“couldn’t execute query”) in the latter part of your script, but not the former. You should use that to make sure your query isn’t causing issues.

Hey thanks for the help!
Unfortunately I’m such a noob to PHP I’m not too sure what you mean. How do I check that $numresults is a valid result set? You said the easiest way is to make sure the Query is run correctly, but I’m not familiar with doing this. I also went and put in the “or die” code everyone it applied. Heres my up to date code:

<?php //connect to mysql

mysql_connect(“xxxx”,“xxx1”,“xxxx”);
mysql_select_db(“xxxx”);

//specify how many results to display per page
$limit = 10;

// 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 = “

Search Error

Please enter a search…

” ;
}
// check for a search parameter
if (!isset($var)){
$resultmsg = “

Search Error

We don’t seem to have a search parameter!

" ;
}
// 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 FROM news WHERE keywords LIKE ‘%$trimm%’ OR name like ‘%$trimm%’ OR message like ‘%$trimm%’ ORDER BY keywords*DESC” ;
// Execute the query to get number of rows that contain search keywords
$numresults=mysql_query ($query) or die ( “Couldn’t execute 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 s” );
$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{
     $adid_array[] = $row[ 'id' ];
      }while( $row= mysql_fetch_array($numresults));

} //end foreach

if($row_num_links_main == 0 && $row_set_num == 0){
$resultmsg ="

Search results for: ". $trimmed.“

Sorry, your search returned zero results

” ;
}
//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
?>
<?php // display what the person searched for. if( isset ($resultmsg)){ echo $resultmsg; exit(); }else{ echo "Search results for: " . $var; } foreach($newarr as $value){ // EDIT HERE and specify your table and field names for the SQL query $query_value = "SELECT * FROM*news WHERE*keywords = '$value'"; $num_value=mysql_query ($query_value) or die ( "Couldn't execute query" ); $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. //Replace field $titlehigh = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'keywords' ] ); $linkhigh = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'name' ] ); $linkdesc = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'message' ] ); foreach($trimmed_array as $trimm){ if($trimm != 'b' ){ $titlehigh = preg_replace( "'($trimm)'si" , " //1" , $titlehigh); $linkhigh = preg_replace( "'($trimm)'si" , " //1" , $linkhigh); $linkdesc = preg_replace( "'($trimm)'si" , " //1" , $linkdesc); } //end highlight ?>

<?php echo $titlehigh; ?>
<?php echo $linkhigh; ?>
<?php echo $linkhigh; ?>

<?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 "
Previous " .$limit. "
"; } // 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 "
Next " .$limit. "
"; } } } //end foreach $newarr ?>

So what’s the result this time? Are you still getting errors? Have you tried using the debugging tips and tricks that you can find by clicking the link in my signature? Have you used error_reporting(E_ALL) to make sure there’s nothing else messing up your script?

We’re all trying to help each other out but you can imagine us not being too motivated when someone just copy-pastes their entire script and says ‘please fix my script’, no matter how new you are to PHP or coding in general. We don’t mind basic questions, but we expect some effort :)

Hey, yeah I completely understand the whole “oh $#%! this doesnt work, fix it for me!” type thing. I get bent out of shape with that on some forums in areas I’m more familiar with.

The thing is though, I’m not doing this on “localhost” or anything, so I have to keep upload via FTP to my host and then checking and then going back and repeating. Given that, and the fact that this is what I was using to learn PHP, I’m not familiar with the whole debugging and testing type stuff. I’ve actually picked up a lot of info about PHP and mySQL but just using the “Search” function of this and other forums trying to find a solution to my problem. Although I havent found my solution yet, I’ve picked up some other stuff that will help down the road when I can start to wrap my head around whats going on.

Back to the script. I added the “or die” everywhere it pertained and I’m still getting the same error of:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/content/d/j/m/djmac14/html/mcpin/search_result2.php on line 37

I’ve been told to make sure the “Query is being run correctly” and things that, but my knowledge of PHP is still so little I’m not sure how to do that. I know the script is connecting to my mySQL database if thats what you mean. I had a previous script that was very small that would display my mySQL tables.

I’m also not familiar with “error_reporting(E_ALL)” or how to use it to my advantage. I’m at work right now so I wont be able to test anything. But I’ll take a look at your sig. Thanks again for taking your time to help out

If you don’t know what (the function) error_reporting() does, then this page should be able to provide you with some more information.

On the validating queries issue, here’s a way to make sure you’re running what you think you’re running:

$query = "SELECT * FROM $table"; echo "Running this query: ".$query; $result = mysql_query($query) or die("<br>Query Failed: ".mysql_error());

Posting the result of using these constructions should help us better define where your problem is.

Actually I’ve been able to get through most of the errors. Now I’m left with a strange one thats got me stumped.
Say I type in a search that doesnt exist in my mySQL table. I get

Sorry, your search returned zero results
or whatever. But now if I search for something I know exists I get:
Search results for: whatever Keyword
Then no results display. I know its finding the information on the mySQL table since its telling me it found something, it just wont display it. I've looked over the PHP code where the display results is and nothing jumps out to me. Heres my up to date code [code] Search Results <?php //connect to mysql

mysql_connect(“xxxx”,“xxxx”,“xxx”);
mysql_select_db(“xxxx”);

//specify how many results to display per page
$limit = 10;

// 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 = “

Search Error

Please enter a search…

” ;
}
// check for a search parameter
if (!isset($var)){
$resultmsg = “

Search Error

We don’t seem to have a search parameter!

" ;
}
// 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 * FROM news WHERE keywords LIKE ‘%$trimm%’ OR name like ‘%$trimm%’ OR message like ‘%$trimm%’ ORDER BY keywords DESC” ;
// Execute the query to get number of rows that contain search keywords
$numresults=mysql_query ($query) or die(mysql_error());
$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 s” );
$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{
     $adid_array[] = $row[ 'id' ];
      }while( $row= mysql_fetch_array($numresults));

} //end foreach

if($row_num_links_main == 0 && $row_set_num == 0){
$resultmsg ="

Search results for: ". $trimmed.“

Sorry, your search returned zero results

” ;
}
//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
?>
<?php // display what the person searched for. if( isset ($resultmsg)){ echo $resultmsg; exit(); }else{ echo "Search results for: " . $var; } foreach($newarr as $value){ // EDIT HERE and specify your table and field names for the SQL query $query_value = "SELECT * FROM news WHERE keywords = '$value'"; $num_value=mysql_query ($query_value) or die(mysql_error()); $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. //Replace field $titlehigh = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'keywords' ] ); $linkhigh = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'name' ] ); $linkdesc = preg_replace ( "'($var)'si" , " //1" , $row_linkcat[ 'message' ] ); foreach($trimmed_array as $trimm){ if($trimm != 'b' ){ $titlehigh = preg_replace( "'($trimm)'si" , " //1" , $titlehigh); $linkhigh = preg_replace( "'($trimm)'si" , " //1" , $linkhigh); $linkdesc = preg_replace( "'($trimm)'si" , " //1" , $linkdesc); } //end highlight ?>

<?php echo $titlehigh; ?>
<?php echo $linkhigh; ?>
<?php echo $linkhigh; ?>

<?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 "
Previous " .$limit. "
"; } // 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 "
Next " .$limit. "
"; } } } //end foreach $newarr ?> [/code]

Try doing some debugging. Echo statements for example, should be able to help you out.

Sponsor our Newsletter | Privacy Policy | Terms of Service