Многопользовательский поиск в PHP / MySQL

Я пытаюсь создать поиск, который ищет несколько слов. Моя первая попытка не дала никаких результатов и выглядит следующим образом:

require_once('database_conn.php'); if($_POST){ $explodedSearch = explode (" ", $_POST['quickSearch']); foreach($explodedSearch as $search){ $query = "SELECT * FROM jobseeker WHERE forename like '%$search%' or surname like '%$search%' ORDER BY userID LIMIT 5"; $result = mysql_query($query); } while($userData=mysql_fetch_array($result)){ $forename=$userData['forename']; $surname=$userData['surname']; $profPic=$userData['profilePicture']; $location=$userData['location']; echo "<div class=\"result\"> <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/> <p class=\"quickName\">" . $forename . " " . $surname . "</p> <p class=\"quickLocation\"> " . $location . "</p> </div>"; } } 

Я также пробовал следующее, что дало результаты, но, как вы можете себе представить, я получал повторяющиеся результаты для каждого введенного слова:

 if($_POST){ $explodedSearch = explode (" ", $_POST['quickSearch']); foreach($explodedSearch as $search){ $query = "SELECT * FROM jobseeker WHERE forename like '%$search%' or surname like '%$search%' ORDER BY userID LIMIT 5"; $result .= mysql_query($query); while($userData=mysql_fetch_array($result)){ $forename=$userData['forename']; $surname=$userData['surname']; $profPic=$userData['profilePicture']; $location=$userData['location']; echo "<div class=\"result\"> <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/> <p class=\"quickName\">" . $forename . " " . $surname . "</p> <p class=\"quickLocation\"> " . $location . "</p> </div>"; } } } в if($_POST){ $explodedSearch = explode (" ", $_POST['quickSearch']); foreach($explodedSearch as $search){ $query = "SELECT * FROM jobseeker WHERE forename like '%$search%' or surname like '%$search%' ORDER BY userID LIMIT 5"; $result .= mysql_query($query); while($userData=mysql_fetch_array($result)){ $forename=$userData['forename']; $surname=$userData['surname']; $profPic=$userData['profilePicture']; $location=$userData['location']; echo "<div class=\"result\"> <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/> <p class=\"quickName\">" . $forename . " " . $surname . "</p> <p class=\"quickLocation\"> " . $location . "</p> </div>"; } } } 

Я в значительной степени не понимаю, как это сделать, любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ:

 if($_POST){ $quickSearch = $_POST['quickSearch']; $explodedSearch = explode (" ", trim($quickSearch)); $queryArray = array(); foreach($explodedSearch as $search){ $term = mysql_real_escape_string($search); $queryArray[] = "forename like '%" . $term . "%' surname like '%" . $term . "%'"; } $implodedSearch = implode(' or ', $queryArray); $query="SELECT * FROM jobseeker WHERE ($implodedSearch) ORDER BY userID LIMIT 5"; $result = mysql_query($query); while($userData=mysql_fetch_array($result, MYSQL_ASSOC)){ $forename=$userData['forename']; $surname=$userData['surname']; $profPic=$userData['profilePicture']; $location=$userData['location']; echo "<div class=\"result\"> <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/> <p class=\"quickName\">" . $forename . " " . $surname . "</p> <p class=\"quickLocation\"> " . $location . "</p> </div>"; } } 

Я работал над тем же вопросом (поиск по ключевым словам) некоторое время, и вот как я это сделал:

 $words = $_POST['keywords']; if(empty($words)){ //redirect somewhere else! } $parts = explode(" ",trim($words)); $clauses=array(); foreach ($parts as $part){ //function_description in my case , replace it with whatever u want in ur table $clauses[]="function_description LIKE '%" . mysql_real_escape_string($part) . "%'"; } $clause=implode(' OR ' ,$clauses); //select your condition and add "AND ($clauses)" . $sql="SELECT * FROM functions WHERE user_name='{$user_name}' AND ($clause) "; $results=mysql_query($sql,$connection); if(!$results){ redirect("errors/error_db.html"); } else if($results){ $rows = array(); <?php while($rows = mysql_fetch_array($results, MYSQL_ASSOC)) { // echo whatever u want ! } ?> 

– Вот как это выглядит, когда я пытался запустить его с помощью поиска FULLTEXT: Но вы должны установить тип таблицы как «MyISAM»,

 <?php $words = mysql_real_escape_string($_POST['function_keywords']); if(empty($words)){ redirect("welcome.php?error=search_empty"); } //if the columns(results)>1/2(columns) => it will return nothing!(use "NATURAL LANGUAGE"="BOOLEAN") $sql="SELECT * FROM functions WHERE MATCH (function_description) AGAINST ('{$words}' IN NATURAL LANGUAGE MODE)"; $results=mysql_query($sql,$connection); if(!$results){ redirect("errors/error_db.html"); } else if($results){ $rows = array(); while($rows = mysql_fetch_array($results, MYSQL_ASSOC)) { // echo } } ?> 

Возможно, вы ищете полнотекстовый поиск MySQL .

Например, вы можете сделать что-то вроде:

 if ($_SERVER['REQUEST_METHOD'] == 'POST') { $search = $_POST['quickSearch']; // Todo: escape $search $sql = " SELECT *, MATCH (`forename`) AGAINST ('{$search}' IN NATURAL LANGUAGE MODE) AS `score` FROM `jobseeker` WHERE MATCH (`forename`) AGAINST ('{$search}' IN NATURAL LANGUAGE MODE)"; // Todo: execute query and gather results } 

Обратите внимание, что вам нужно будет добавить индекс FULLTEXT в forename столбца.

Взгляните на полнотекстовый поиск MySQL, если вы должны использовать MySQL. В противном случае взгляните на SOLR , который является полнотекстовой поисковой системой. Вы можете использовать MySQL и SOLR в сочетании, чтобы обеспечить возможности поиска на уровне предприятия для ваших приложений.

вот что я сделал

 if (isset($_POST['search'])){ $words = mysql_real_escape_string($_POST['searchfield']); $arraySearch = explode(" ", trim($words)); $countSearch = count($arraySearch); $a = 0; $query = "SELECT * FROM parts WHERE "; $quote = "'"; while ($a < $countSearch) { $query = $query."description LIKE $quote%$arraySearch[$a]%$quote "; $a++; if ($a < $countSearch) { $query = $query." AND "; } } $result=mysql_query($query) or die(error); 

// вы можете просто оставить его здесь, коротким и сладким, но я добавил дополнительный код, если он не имеет никаких результатов, тогда он ищет слово, а не слова обоих //

 $num = mysql_num_rows($result); if ($num == 0){ $a = 0; $query = "SELECT * FROM parts WHERE "; while ($a < $countSearch) { $query = $query."description LIKE $quote%$arraySearch[$a]%$quote "; $a++; if ($a < $countSearch) { $query = $query." OR "; $msg = "No exact match for: $words. Maybe this is what you're looking for though? If not please try again."; } } } $result=mysql_query($query) or die($query); if (mysql_num_rows($result) == 0){ $msg = "No results, please try another search"; } }