我很难找到关于这个问题的解决方案:(
我正在使用多个关键字和其他子句进行多次搜索
我在BDD中的表存储MYISAM和collation 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).....";
我没有任何错误,但查询返回错误结果
答案 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();
干杯