SQL for keyword Search

Search options are common in web pages and we can give option to visitors to search for keywords to locate the article or data within a site. Here we will apply the search to an existing table. The visitors will enter one or more than one keywords in the search box and we have to develop a query based on the selection of the visitor. Here we will discuss how to create a sql query to apply to the database with multiple keywords. Basically we will focus on construction of sql using keywords and will not go into details of getting the result or displaying in proper format with page breaks.

Here we will give the option to the visitor to search for exact match or any where match on the table. For this we will use our student table and apply the search to the name field of the MySQL table. Based on the selected type of search we will generate the sql. Here are the steps required to develop a keyword search.

If the visitor has asked for exact match then create the query using simple where condition. Else ..

If the visitor has asked for any where matching of keywords then read the search term and break it into array of keywords using split command. Then loop through all the element of the array of words and create the sql command using like command for each word or the element of the array. Here is the code for this.

$kt=split(" ",$search_text);//Breaking the string to array of words
// Now let us generate the sql
while(list($key,$val)=each($kt)){
if($val<>" " and strlen($val) > 0){$q .= " name like '%$val%' or ";}
}// end of while

You can see we have broken the search text using split command and then looped through the keywords. Here using one if condition we have taken care that blank space are removed in formatting the sql string.
This way we will be adding one sql like command with OR combination for each word used.

We will be adding each like command to the string with an SQL OR command. This way we will end with an extra OR command. This extra OR command we can remove from the end by using substr and strlen string functions.

$q=substr($q,0,(strlen($q)-3));

In the above line we have first calculated the length of the string by using strlen and then used that value inside the substr function after subtracting 3 from it. The 3 is subtracted as length of OR with one blank space is 3. This way we will get the string after removing 3 chars from the end. ( that is extra OR with a blank space )

Once this sql is formatted then we can print it to the screen to check the syntax of the sql to match our requirement. Beyond this point you can use any server side script to collect the results from the table. You can read the tutorial on how to display data from mysql using php. You can down load the PHP version of this tutorial in a zip file at the end of this page. Here is the code till now.

<?Php
//ini_set('display_errors', true);//Set this display to display all erros while testing and developing the script
error_reporting(0);// With this no error reporting will be there
include "include/z_db.php";

</form>
";

echo "</td></tr>";

/////////// if form is submitted the data processing is done here///////////////
echo "<tr><td width='600' valign=top>";

if(isset($todo) and $todo=="search"){

$type=$_POST['type'];

$search_text=ltrim($search_text);
$search_text=rtrim($search_text);

if($type<>"any"){
$query="select * from student where name='$search_text'";
}else{
$kt=split(" ",$search_text);//Breaking the string to array of words
// Now let us generate the sql
while(list($key,$val)=each($kt)){
if($val<>" " and strlen($val) > 0){$q .= " name like '%$val%' or ";}

}// end of while
$q=substr($q,0,(strLen($q)-3));
// this will remove the last or from the string.
$query="select * from student where $q ";
} // end of if else based on type value
echo "<span style='background-color= #FFFF00'>$query</span><br>";
$count=$dbo->prepare($query);
$count->execute();
$no=$count->rowCount();
if($no > 0 ){echo " No of records = ".$no."<br><br>";
echo "<table><tr><th>ID</th><th>Name</th><th>Class</th><th>Mark</th><th>Sex</th></tr>";
foreach ($dbo->query($query) as $row){
echo "<tr><td>$row[id]</td><td>$row[name]</td><td>$row[class]</td>
<td>$row[mark]</td><td>$row[sex]</td></tr>";
}
echo "</table>";
}else {
echo " No records found ";
}

Thanks for your code on search-keyword.php. I've extended it to include an 'all' type for the search which is probably the most useful of the three, that returns results if all keywords are found in a record. If you want to use it or any part you're most welcome. It's on my site (see email address) in the miscellaneous section.

Ragz

10-03-2009

Thanks for the code.. it saved my academic life

A Marie

14-04-2009

Where do you put the "all" to search all tables?

A Marie

15-04-2009

When I do a search the search string also shows up.. how do I hide this without damaging the code?

smo

15-04-2009

There is a line saying
echo $query;
Remove this line or comment it like this
//echo $query;
This line is kept so before integrating the developer can know what is going to come

ramesh dudala

23-07-2009

hai
this is code is easly and good
so thank u

chris

02-08-2009

This is Great lesson. I was wondering also how I could add a message in case the return is false?

Hugh

21-08-2009

Where do I put the connect??

sangi

08-12-2009

hey this is really good thanks dude

Pranjal

14-01-2010

how do i display the data which is not found?

glaize

17-01-2010

tnx plus2net!i have learned a lot.

Lashan

07-02-2010

Excellent tutorial. Explained very clearly. All the best and keep it up.

Lashan Jayawardhana

13-02-2010

Excellent code plus2net. It is very useful. Fantastic work and great explanation. Keep up the good work. All the best !!!

Thajul Hussain

02-03-2010

its very usefull, working fine. thanks a lot.........

Mangal

08-04-2010

thanks for sharing this script.

sunil

11-04-2010

how to match mysql database table vlaue whose given by user in php text..

spencalot

14-04-2010

This is a great search engine. Thanks. my SQL table contains a field with key words such as: "apples fruits john doe car keys John Smith"
How can I make the search engine search for "John Doe"? thanks!