php mysql搜索引擎用逗号和不同的表

时间:2015-01-28 19:21:08

标签: php mysql search

表:文塔

+------------+---------------+------------+---------------+
| Zona       | localidad     |  punto     | direccion     |
+------------+---------------+------------+---------------+
| Santiago   | Quilicura     |  prueba1   | Casa Royal    |
| Santiago   | Tortal        |  test1     | Ferreteria    |
| Valparaiso |  Viña         |  asdf1     | Monitor       |
|Osorno      |  Queso        |  qwerty    | Listado       |
+------------+---------------+------------+---------------+  

我在mysql中有这个数据库,我正在使用php进行搜索引擎,这取决于搜索结果。

这必须承认逗号,例如,如果我搜索“Santiago,Quilicura”应该留下第一行所有信息“Santiago,Quilicura,prueba1,Casa Royal”

这是我的代码

$value = $_POST['search'];
$value = explode(",", $value);

$values = $value[0];
$valor = $value[1];

print_r($value);
print_r($valor);

if($values != "" and $valor == ""){
$query = mysql_query("SELECT zona, localidad, punto, direccion FROM venta WHERE zona LIKE '%$values%' or localidad LIKE '%$values%' or punto LIKE '%$values%' or direccion LIKE '%$values%' ");
}
if($values != "" and $valor != ""){
$query = mysql_query("SELECT zona, localidad, punto, direccion FROM venta WHERE zona LIKE '%$values%' or localidad LIKE '%$values%' or punto LIKE '%$values%' or direccion LIKE '%$values%' AND localidad LIKE '%$valor%' or punto LIKE '%$valor%' or direccion LIKE '%$valor%'");
}   

<table>
        <th>Zona</th>
        <th>Localidad</th>
        <th>Punto de venta</th>
        <th>Direccion</th>
        <?php
        while($run = mysql_fetch_array($query)){
        $zona = $run['zona'];   
        $localidad = $run['localidad'];
        $punto = $run['punto'];
        $direccion = $run['direccion'];
        echo '<tr>';
            echo '<td>'.$zona.'</td>';
            echo '<td>'.$localidad.'</td>';
            echo '<td>'.$punto.'</td>';
            echo '<td>'.$direccion.'</td>';
        echo '</tr>';
    }?>
    </table>

如果寻求“圣地亚哥,Quilicura”的所有结果都有“圣地亚哥”而没有指定“Quilicura”,那么我带来了什么

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

我想我找到了一个非常好的解决方案:

$value = $_POST['search'];
$value = explode(",", $value);
foreach($value as $key=>$val) {
   $value[$key] = trim($val);
}
$param = "'".implode("','",$value)."'"

$params = count($value);

if($params==0 || $params>4){
   echo 'Wrong number of search parameters!';
} else {

$query = mysql_query("
SELECT  `zona`, `localidad`, `punto`, `direccion` FROM (
  SELECT  `zona`, `localidad`, `punto`, `direccion`,
  zona in ($param) as m1,
  localidad in ($param) as m2,
  punto in ($param) as m3,
  direccion in ($param) as m4

   FROM `venta`) AS v WHERE v.m1+v.m2+v.m3+v.m4>=$params
");
} 

并尝试使用PDO和bind_param而不是mysql直接查询

答案 1 :(得分:1)

您可能希望使用布尔全文搜索来进行此类查询。

这将采取这样的查询:

SELECT zona, localidad, punto, direccion
FROM venta 
WHERE MATCH (zona, localidad, punto, direccion)
AGAINST ('keyword1 keyword2 [...]' IN BOOLEAN MODE);

有关全文搜索的更多信息,请查看此链接 - http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

首先会向您返回最相关匹配的匹配列表。

答案 2 :(得分:0)

我认为你需要写一些东西,看看列表中是否有东西:

SELECT zona, localidad, punto, direccion FROM venta 
WHERE 
  zona IN ('Santiago', 'Quilicura') or 
  localidad IN ('Santiago', 'Quilicura') or 
  punto IN ('Santiago', 'Quilicura') or
  direccion ('Santiago', 'Quilicura')

这就是你的查询的样子 - 关键是将$ _POST [&#39;]&#39;]字符串转换为看起来像sql查询中的数组的东西。

这意味着,无论用户输入搜索类别的顺序如何,您都可以找到匹配项。 OR确保即使用户只输入zona,localidad,punto或direccion中的一个,您仍然可以获得匹配。

所以在php中你必须做这样的事情:

$words = explode(",", $_POST['search']);

$sql_array = "('".$words[0]."'";
for($i=1;$i<count($words);$i++){
  $sql_array .= ",'".$words[$i]."'";
}
$sql_array .= ")";

$sql = "SELECT zona, localidad, punto, direccion FROM venta WHERE zona IN $sql_array or localidad IN $sql_array or punto IN $sql_array or direccion IN $sql_array";

}

好的,经过一些讨论,我建议尝试加入:

SELECT * FROM venta
JOIN 
  (SELECT * FROM venta WHERE zona IN ('Santiago','Quilicura')) zonas ON zonas.zona = venta.zona
WHERE 
  venta.localidad IN ('Santiago','Quilicura')