<?
#############################################################
#
# -=[ 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");
# $mysearch->setwhere("WHERE id=1");
#
# Set the ORDER BY attribute for SQL query
# $mysearch->setorderby("Name");
#
##############################################################
class MysqlSearch
{
function find($keywords){
$obj_tempdbarray = new CTempDBArray();
$obj_tempdbengine = new CTempDBEngine();
# 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;
}
if ($this->where_data_sql!=null)
$search_data_sql .= " ".$this->where_data_sql;
$obj_tempdbarray = $obj_tempdbengine->GetRows($search_data_sql);
# Define $search_results_array, ready for population
# with refined results
$search_results_array = array();
while( $all_data_array = $obj_tempdbarray->get() ){
$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;
}
function setwhere($where_data_sql){
$this->where_data_sql = $where_data_sql;
}
}
class CSearchDBEngine {
function SearchResults($identifier, $table, $columns, $mysearchterms, $where_data_sql) {
$o_dataaccess = new CDataAccess();
return $o_dataaccess->SearchResults($identifier, $table, $columns, $mysearchterms, $where_data_sql);
}
}
?>