Type:
code fragment
Version:
version 1.0
Requires:
no_search_words.txt, no_search_tables.txt
<?PHP
/***************************************************************************
JHsearch() was written by James R Hartford
JHsearch() may be used and modified freely, but I ask that you please note
the original author (James R Hartford) and refer to the function by its
original name (JHsearch())
If you do make changes that I may find useful, please email them to jim@jarzion.com and I will include your name in later versions of JHsearch()
database connection is set up for MySQL but can be changed if needed.
****************************************************************************/
//use these globals to set up your database connection.
global $dbhost; $dbhost = '';
global $dbname; $dbname = '';
global $dbuser; $dbuser = '';
global $dbpass; $dbpass = '';
/*******************************************************************
Below is an example of how the JHsearch function can be used and
display the results of the search. You can test for the table name
and display the result accordingly for that table.
*********************************************************************/
$searchResult = JHsearch("test a");
if (count($searchResult) < 1){
$output .= "No results for search 'test a'";
}else{
$SR = array_keys($searchResult);
for($i = 0; $i < count($SR); $i++){
if($SR[$i] == "site_info"){//this is checking to see if the table name is media
for($c=0; $c < count($searchResult[$SR[$i]]); $c++){
echo "Siteinfo: ".$searchResult[$SR[$i]][$c]['description']."<br>";
}
}
if($SR[$i] == "class"){//this is checking to see if the table name is media
for($c=0; $c < count($searchResult[$SR[$i]]); $c++){
echo "Class: ".$searchResult[$SR[$i]][$c]['title']."<br>";
}
}
}
}
/*##############################################################
################################################################*/
/***********************************************************
Function: JHsearch($search_string)
Purpose: search an entire database and return the results in a
3 dimensional array. Words found in no_search_words.txt
will not be searched. Table names found in
no_search_tables.txt will not be searched.
result example: $result[table_name][row][field_name]
Author: James R Hartford
************************************************************/
function JHsearch( $string ){
$newstring = $string;
$searchcrit = explode(" ", $newstring); //get the words to be searched
$dontsearchwords = JHgetnos("words"); //get the words not to search into an array
//get the actual search criteria
$searchcrit = array_diff($searchcrit, $dontsearchwords);
$searchcrit = JHarray_reindex($searchcrit);
//get the tables to search
$query = "Show Tables";
$tables = JHRquery($query);
for($i = 0; $i < count($tables); $i++){
$gettables[$i] = $tables[$i][0];
}
$tables = $gettables;
$tabletakeout = JHgetnos("tables"); //tables to leave out of search
$tables = array_diff($tables, $tabletakeout);
$tables = JHarray_reindex($tables);
$resultcount = 0;
//Build the search query
for($i = 0; $i < count($tables) && count($searchcrit) > 0; $i++){
$query = "SELECT * FROM ";
$query .= $tables[$i]." WHERE ";
$qt = "SHOW FIELDS FROM ".$tables[$i];
$fields = JHRquery($qt);
for($m = 0; $m < count($fields); $m++){
if(substr($fields[$m]['Type'], 0, 3) != "int" && substr($fields[$m]['Type'], 0, 4) != "date"){
if($m > 0 ){
$query.= " (";
}
for( $sc = 0; $sc < count($searchcrit); $sc++){
$query .= $fields[$m]['Field']." LIKE '%".$searchcrit[$sc]."%'";
if($sc != count($searchcrit) - 1){
$query.= " AND ";
}
}
if($m > 0 && $m < count($fields)){
$query.= ") OR ";
}
}
}
//this if statement is for if the query ended in WHERE because the only
//field types in the table are ints or dates
if(substr($query, strlen($query) - 6, 6) != "WHERE " || $tempResult[$tables[$i][0]][0] != ""){
$query = substr($query,0,strlen($query) - 4);
//echo $query."<br><br>";
$tempResult[$tables[$i]] = JHRquery($query);
}
if($tempResult[$tables[$i]][0] != ""){
$realResult[$tables[$i]] = $tempResult[$tables[$i]];
}
}
return $realResult;
}
/*********************************************************
Function: JHgetnos($where);
Purpose: Pares a text file to find out what not to search
Author: James R Hartford
**********************************************************/
function JHgetnos($where){
//get the words that should not be searched for
if($where == "words"){$filename = "no_search_words.txt";}
//get the tables that should not be searched
else if($where == "tables"){$filename = "no_search_tables.txt";}
$handle = fopen ($filename, "r");
$contents = explode(" ", fread ($handle, filesize ($filename)));
fclose ($handle);
return $contents;
}
/*********************************************************
Function: JHarray_reindex($array);
Purpose: reindex an array
Author: James R Hartford
**********************************************************/
function JHarray_reindex($somearray){
$keys = array_keys($somearray);
for($i = 0; $i < count($keys);$i++){
$result[$i] = $somearray[$keys[$i]];
}
return $result;
}
/*********************************************************
Function: JHRquery($sql_string);
Purpose: Execute query and return results in a 2d array
Author: James R Hartford
**********************************************************/
function JHRquery ( $query ){
global $dbhost;global $dbname;global $dbuser;global $dbpass;
$link = mysql_connect ( $dbhost, $dbuser, $dbpass );
mysql_select_db($dbname) or die("Could not select database $dbhost");
$result = mysql_query($query, $link) or die("Could not execute query $query");
$resultArray = array();
for ($i = 0; $temp = mysql_fetch_array ( $result ); $i++) {
if ($temp){$resultArray [$i] = $temp;}
}
return $resultArray;
}
?>