Forum Moderators: coopster

Message Too Old, No Replies

mysql search with php

         

xguy2k

8:29 am on Jul 4, 2007 (gmt 0)

10+ Year Member



can someone please help me fix this code? there is no result from the search.

my db structure is:


CREATE TABLE `buzzword_blog_entries` (
`blog_entry_key` int(10) unsigned NOT NULL default '0',
`permissions` tinyint(1) unsigned NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`title` varchar(128) NOT NULL default '',
`body` longtext NOT NULL,
`link` varchar(128) NOT NULL default '',
`source` varchar(128) NOT NULL default '',
PRIMARY KEY (`blog_entry_key`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

AND.. I want to do search on these fields : TITLE, BODY

and then display result with: TITLE, BODY, LINK, CREATED

I tried with the following codes.
Do I need to break it into a form.htm & a backend search.php page?


<?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
$hostname_logon = "localhost" ;
$database_logon = "chsjj" ;
$username_logon = "login" ;
$password_logon = "pass" ;
//open database connection
$connections = mysql_connect($hostname_logon, $username_logon, $password_logon) or die ( "Unabale to connect to the database" );
//select database
mysql_select_db($database_logon) or die ( "Unable to select database!" );

//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 = "<p>Search Error</p><p>Please enter a search...</p>" ;
}

// check for a search parameter
if (!isset($var)){
$resultmsg = "<p>Search Error</p><p>We don't seem to have a search parameter! </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 * FROM buzzword_blog_entries WHERE title LIKE \"%$trimm%\" OR body LIKE \"%$trimm%\" ORDER BY created 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[ 'blog_entry_key' ];
}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>

<?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 buzzword_blog_entries WHERE title = '$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 keywords 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[ 'field1' ] );
$linkhigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'field2' ] );
$linkdesc = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'field3' ] );

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);
$linkdesc = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $linkdesc);
}
//end highlight

?>
<p>
<?php echo $titlehigh;?><br>
<?php echo $linkhigh;?><br>
<?php echo $linkhigh;?>
</p>

<?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
?>

phparion

4:36 am on Jul 5, 2007 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



wohoo! This is a lot of code...

let me give you a quick and good tip that will help you fix your code.

are you getting empty results from the search query? if yes then print your query on the php page before it is executed against the database and check its shape if it has any problem e.g missing values etc. then execute this query directly using command line or phpmyadmin etc to check if you get any result OR error. if no error and no results too then it means you either have logical problem with the query or the results in fact are not present in the db.

if this doesn't solve the problem then exclude any un-necessary code and just post your exact code where you are getting problem and I will try to figure it out for you. of course cant do it for this much code.

eelixduppy

5:08 pm on Jul 5, 2007 (gmt 0)



Try turning up error_reporting [php.net]. And change the following line:

$numresults=mysql_query ($query);

to this:


$numresults=mysql_query($query) or die(mysql_error());

Also, we have a great thread about extracting data from mysql [webmasterworld.com] that you may want to take a look at to get some ideas.

good luck and welcome to webmasterworld! :)