Multi word search in PHP/MySQL

前端 未结 4 1465
故里飘歌
故里飘歌 2020-12-03 16:43

I\'m struggling to create a search that searches for multiple words. My first attempt yielded no results whatsoever and is as follows:

  require_once(\'datab         


        
相关标签:
4条回答
  • 2020-12-03 16:48

    I've been working on the same subject (search with keywords) for a while and this how i did it :

    $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 !
    }
    ?>
    

    -- Now this is how it look when i tried to run it with FULLTEXT search : But you should set the table type as "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 
    }
    }
    ?>
    
    0 讨论(0)
  • 2020-12-03 16:51

    here's what i did

    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);
    

    //you could just leave it here, short and sweet but i added some extra code for if it doesnt turn up any results then it searches for either word rather than boths words//

    $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";
        }
    
    }
    
    0 讨论(0)
  • 2020-12-03 17:05

    Take a look at MySQL fulltext searches, if you must use MySQL. Otherwise take a look at SOLR, which is a fulltext search engine. You can use MySQL and SOLR in combination to provide enterprise level search capabilities for your apps.

    0 讨论(0)
  • 2020-12-03 17:11

    Perhaps what you are looking for is a MySQL full-text search.

    For your example, you could do something like:

    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
    }
    

    Note that you will need to add a FULLTEXT index to the column forename.

    0 讨论(0)
提交回复
热议问题