Php mysql在带有空格的多列中匹配(多个)单词

时间:2014-10-25 21:52:40

标签: php mysql

我试图找出我的查询需要的方式和功能,仍然不确定使用Like,concat或什么部分等。

我的情况就是这样

1。)我有多个栏目(国家,城市,州,地点) 2.)只有1个搜索输入 3.)搜索输入可以是1个单词,或者多个单词也可以忽略间距(例如,#34;中心城市或中心城市或费城中心城市等)

它将返回与不同列中的单词匹配的行。

以下是我的尝试,但此刻并没有返回任何内容。谢谢你的时间

腓:

<?php

ini_set('display_errors', 1); error_reporting(E_ALL);

include 'connect.php';

if($_POST) 
{
$searchaddress = ($_POST['searchaddress']);



 $result=mysqli_query($con,"SELECT * 
FROM Listing WHERE CONCAT(country,state,city,Location) LIKE '%$searchaddress%' AND Status='Open'") or die( mysqli_error($con));


        $output = array();

// fetch your results
while( $row = mysqli_fetch_assoc($result) )
{
    // add result row to your output's next index
    $output[] = $row;
}

// echo the json encoded object
echo json_encode( $output ); 




        }

?>

2 个答案:

答案 0 :(得分:2)

在不知道您的确切数据以及$searchaddress是什么的情况下,很难说它失败的原因。

您正在谈论加入空格,但只传入一个搜索标签 - 表达式LIKE '%something something else%'不会忽略空格。

如果您希望所有给定单词匹配的结果数量最少,则应该付出更多努力并使用or/and searchtags / columns组合。您可以通过编程方式执行此操作。

假设您输入了2个关键字:Center Detroid,您基本上想要生成搜索查询:

FROM Listing WHERE 
 ( 
   country LIKE '%Center%' OR
   state LIKE '%Center%' OR 
   city LIKE '%Center%' OR 
   Location LIKE '%Center%'
 ) 
 AND
 ( 
   country LIKE '%Detroid%' OR
   state LIKE '%Detroid%' OR 
   city LIKE '%Detroid%' OR 
   Location LIKE '%Detroid%'
 )

要实现这一目标,您需要了解两件事:

  • 您要搜索的字段名称。
  • 关键字。

然后,以下代码段将根据需要生成where部分:

$search = "Detroid City Center";
$keywords = explode (" ", $search);
$columns = array("country", "state", "city", "location");

$andParts = array();
foreach ($keywords AS $keyword){
  $orParts = array();
    foreach($columns AS $column){
      $orParts[] = $column . " LIKE '%" . mysql_real_escape_string($keyword) . "%'";
    }
    $andParts[]= "(" . implode($orParts, " OR ") . ")";
}
$and = implode ($andParts, " AND ");

echo $and;

数组中给出的示例将产生

(
  country LIKE '%Center%' OR 
  state LIKE '%Center%' OR 
  city LIKE '%Center%' OR 
  location LIKE '%Center%'
) 
AND 
(
   country LIKE '%City%' OR 
   state LIKE '%City%' OR 
   city LIKE '%City%' OR
   location LIKE '%City%'
 ) 
 AND 
 (
   country LIKE '%Detroid%' OR 
   state LIKE '%Detroid%' OR 
   city LIKE '%Detroid%' OR 
   location LIKE '%Detroid%'
 )

这将匹配任何行,其中中心城市 Detroid 在其中一个(搜索)字段中至少出现一次每行。

答案 1 :(得分:0)

更新了搜索地址字段中每个单词的答案:

$searchaddress = "some address to find";
$address_parts = explode(" ", trim($searchaddress));
$sql_parts = array();
foreach($address_parts as $part) {
    $sql_parts[] = 'full_address LIKE "%'.$part.'%"';
}
$query = 'SELECT *, CONCAT(country,state,city,Location) AS full_address FROM Listing WHERE `Status` = "Open" HAVING '.implode(' OR ', $sql_parts);