php-Mysql多个搜索列

时间:2014-10-03 07:44:31

标签: php mysql sql

我很难找到关于这个问题的解决方案:(

我正在使用多个关键字和其他子句进行多次搜索

我在BDD中的表存储MYISAM和collat​​ion utf8

ad { id,type,title,description,categorie,sub_cat,departement.... }


 $query="SELECT * FROM AD WHERE";

  $keywords=explode(",",$key);

 foreach ($query as $value) {

        $value=trim($value);
        $query.=" (title REGEXP '".$value."' OR description REGEXP '".$value."') OR";
        }
 $query=rtrim($qur,"OR");
 $query.="AND";
 if(!empty($categorie))$query=" (categorie LIKE '".$categorie."') AND";
 foreach ($sub_cat as $value) {
        $query.=" (sub_cat REGEXP '".$value."') OR";
    }
  $query=rtrim($qur,"OR");
  $query.="AND";

   foreach ($departementS as $value) {
        $valuedepartement=(int)$valuedepartement;
        $query.=" (departementAnn=".$valuedepartement." ) OR";

    }
   $query=rtrim($qur,"OR");
   $query.="AND";

   query results:
   $query="SELECT * FROM ad WHERE (title REGEXP 'key1') OR (description REGEXP 'key1')OR (title REGEXP 'key2') OR (description REGEXP 'key2') AND (categorie LIKE 'exmple1') AND (sub_cat=12 OR sub_cat=17).....";

我没有任何错误,但查询返回错误结果

1 个答案:

答案 0 :(得分:0)

有一些问题。

首先,您正在浏览$query,就像它是一个数组一样。我认为你打算迭代$keywords

您在多个位置引用$qur(大概应为$query

如果按类别搜索,您可以重置查询而不是附加查询。 ($query=...代替$query.=...

除了最后一件事之外,通过使用错误报告可以很容易地发现这些,这在开发过程中是一个好主意:

error_reporting(E_ALL);

您应该在括号中包含OR的每个部分以正确分隔它们。这需要检查是否为空,因此您不会以AND () AND ...

结束

您最后添加了额外的AND而没有其他内容。这应该改为rtrim" ANDWHER"所以最终的AND被删除,如果没有标准,WHERE也被删除。

$valuedepartement=(int)$valuedepartement应为$valuedepartement=(int)$value;。调用此方法时,$valuedepartement尚未定义。

所以最终的代码是:

$query="SELECT * FROM AD WHERE";

$keywords=explode(",",$key);

if (!empty($keywords)) {
        $query .= ' (';
        foreach ($keywords as $value) {

                $value=trim($value);
                $query.=" (title REGEXP '".$value."' OR description REGEXP '".$value."') OR";
        }
        $query=rtrim($query,"OR") . ') AND ';
}
if(!empty($categorie))$query.=" (categorie LIKE '".$categorie."') AND ";
if (!empty($sub_cat)) {
        $query .= '(';
        foreach ($sub_cat as $value) {
                $query.=" (sub_cat REGEXP '".$value."') OR";
        }
        $query=rtrim($query,"OR") . ') AND ';
}
if (!empty($departementS)) {
        $query .= '(';
        foreach ($departementS as $value) {
                $valuedepartement=(int)$value;
                $query.=" (departementAnn=".$valuedepartement." ) OR";

        }
        $query=rtrim($query,"OR") . ')';
}
$query = rtrim($query, 'ANDWHER ');
echo $query;

这会生成我认为您正在寻找的查询:

SELECT * FROM AD WHERE ( (title REGEXP 'key1' OR description REGEXP 'key1') OR (title REGEXP 'key2' OR description REGEXP 'key2') ) AND  (categorie LIKE 'exmple1') AND ( (sub_cat REGEXP '12') OR (sub_cat REGEXP '17') )

我使用了以下输入数据:

$key = 'key1,key2';
$categorie = 'exmple1';
$sub_cat=array(12, 17);
$departementS = array();

干杯