PHP explode and MySQL query to search in multiple columns

僤鯓⒐⒋嵵緔 提交于 2021-02-11 12:16:17

问题


I have a form where I want a user to enter one or more words. These words should then match mutiple columns in a MySQL database.

I have started to build some code but I'm stuck.

<?php
  $term = $_SESSION['session_searchstring']; //Let's say that session is John Doe
  $searchterm = explode(' ',$term);

  $searchFieldName = "name";
  $searchCondition = "$searchFieldName LIKE '%" . implode("%' OR $searchFieldName LIKE '%", $searchterm) . "%'";

  $sql = "SELECT * FROM students WHERE $searchCondition;";

  echo $sql; //Echo to test what mysql_query would look like

?>

The above code will output:

SELECT * FROM students WHERE name LIKE '%John%' OR name LIKE '%Doe%'; 

The problem is that I want to search in multiple columns ($searchFieldName). I have for example

customer_firstname
customer_lastname

And I want to match my searchstring against the content of both columns.. How would I continue?


回答1:


Perhaps

  $term = $_SESSION['session_searchstring']; //Let's say that session is John Doe
  $searchterm = explode(' ',$term);

  $searchColumns = array("customer_firstname","customer_lastname");

  for($i = 0; $i < count($searchColumns); $i++)
    {
        $searchFieldName = $searchColumns[$i];
        $searchCondition .= "($searchFieldName LIKE '%" . implode("%' OR $searchFieldName LIKE '%", $searchterm) . "%')";
        if($i+1 < count($searchColumns)) $searchCondition .= " OR ";
     }

  $sql = "SELECT * FROM students WHERE $searchCondition;";

  echo $sql; //Echo to test what mysql_query would look like

Produces

SELECT * FROM students WHERE (customer_firstname LIKE '%John%' OR customer_firstname LIKE '%Doe%') OR (customer_lastname LIKE '%John%' OR customer_lastname LIKE '%Doe%');




回答2:


If your table is of MyIsam type or you can convert it to MyIsam, use MySQL Fulltext Search. if not, anyway, you can build a long query like

SELECT * FROM students WHERE name LIKE '%John%' OR name LIKE '%Doe%' OR lastname LIKE "%John%" OR lastname LIKE "%Doe%"

or union your columns into one another just for search (but this both are not prefered). Also a good approach is to use fulltext search engines like Sphinx.




回答3:


In my case I needed all search phrases/terms to match at least one column, no search phrase/term could be a no-match.

I ended up tweaking the example from Kermit in the following way:

public function getRawWhereFilterForColumns($filter, $search_columns)
{
  $search_terms = explode(' ', $filter);
  $search_condition = "";

  for ($i = 0; $i < count($search_terms); $i++) {
    $term = $search_terms[$i];

    for ($j = 0; $j < count($search_columns); $j++) {
      if ($j == 0) $search_condition .= "(";
      $search_field_name = $search_columns[$j];
      $search_condition .= "$search_field_name LIKE '%" . $term . "%'";
      if ($j + 1 < count($search_columns)) $search_condition .= " OR ";
      if ($j + 1 == count($search_columns)) $search_condition .= ")";
    }
    if ($i + 1 < count($search_terms)) $search_condition .= " AND ";
  }
  return $search_condition;
}

I only needed the contents of the Where-clause since I'm using Laravel and could put that into the rawWhere-method.

usage:

$search_condition = $this->getRawWhereFilterForColumns
    ("John Doe", array("column1", "column2"));

which produces

    (column1 LIKE '%John%' OR column2 LIKE '%John%') 
AND (column1 LIKE '%Doe%' OR column2 LIKE '%Doe%')

And finally you use this $search_condition in whatever way suits you, for example:

 $sql = "SELECT * FROM students WHERE $search_condition;";

Or in my Laravel-case:

 $modelInstances = Model::whereRaw
     ($search_condition)->paginate(self::ITEMS_PER_PAGE);

Perhaps this is an improved solution for either David or anybody else visiting this thread, like me, even if it's almost two years after the original post.



来源:https://stackoverflow.com/questions/11543088/php-explode-and-mysql-query-to-search-in-multiple-columns

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!