<?
#############################################################
#
# -=[ MySQL Search Class ]=-
#
# version 1.5
#
# (c) 2002 Stephen Bartholomew
#
# Functionality to search through a MySQL database, across
# all columns, for multiple keywords
#
# Usage:
#
# Required:
# $mysearch = new MysqlSearch;
# $mysearch->setidentifier("MyPrimaryKey");
# $mysearch->settable("MyTable");
# $results_array = $mysearch->find($mysearchterms);
#
# Optional:
# This will force the columns that are searched
# $mysearch->setsearchcolumns("Name, Description");
#
# Set the ORDER BY attribute for SQL query
# $mysearch->setorderby("Name");
#
##############################################################
class MysqlSearch
{
function find($keywords)
{
# Create a keywords array
$keywords_array = explode(" ",$keywords);
# Select data query
if(!$this->searchcolumns)
{
$this->searchcolumns = "*";
$search_data_sql = "SELECT ".$this->searchcolumns." FROM ".$this->table;
}
else
{
$search_data_sql = "SELECT ".$this->entry_identifier.",".$this->searchcolumns." FROM ".$this->table;
}
# Run query, assigning ref
$search_data_ref = mysql_query($search_data_sql);
# Define $search_results_array, ready for population
# with refined results
$search_results_array = array();
if($search_data_ref)
{
while($all_data_array = mysql_fetch_array($search_data_ref))
{
# Get an entry indentifier
$my_ident = $all_data_array[$this->entry_identifier];
# Cycle each value in the product entry
foreach($all_data_array as $entry_key=>$entry_value)
{
# Cycle each keyword in the keywords_array
foreach($keywords_array as $keyword)
{
# If the keyword exists...
if($keyword)
{
# Check if the entry_value contains the keyword
if(stristr($entry_value,$keyword))
{
# If it does, increment the keywords_found_[keyword] array value
# This array can also be used for relevence results
$keywords_found_array[$keyword]++;
}
}
else
{
# This is a fix for when a user enters a keyword with a space
# after it. The trailing space will cause a NULL value to
# be entered into the array and will not be found. If there
# is a NULL value, we increment the keywords_found value anyway.
$keywords_found_array[$keyword]++;
}
unset($keyword);
}
# Now we compare the value of $keywords_found against
# the number of elements in the keywords array.
# If the values do not match, then the entry does not
# contain all keywords so do not show it.
if(sizeof($keywords_found_array) == sizeof($keywords_array))
{
# If the entry contains the keywords, push the identifier onto an
# results array, then break out of the loop. We're not searching for relevence,
# only the existence of the keywords, therefore we no longer need to continue searching
array_push($search_results_array,"$my_ident");
break;
}
}
unset($keywords_found_array);
unset($entry_key);
unset($entry_value);
}
}
$this->numresults = sizeof($search_results_array);
# Return the results array
return $search_results_array;
}
function setidentifier($entry_identifier)
{
# Set the db entry identifier
# This is the column that the user wants returned in
# their results array. Generally this should be the
# primary key of the table.
$this->entry_identifier = $entry_identifier;
}
function settable($table)
{
# Set which table we are searching
$this->table = $table;
}
function setsearchcolumns($columns)
{
$this->searchcolumns = $columns;
}
}
?>