我正在尝试进行查询以获取输入的项目并搜索数据库。我知道我多次这样做了,但这个查询只是不想工作。
这是查询
$getcamp = $db->query("SELECT * FROM `campaigns`
WHERE `requirements` LIKE '%$keyw%' OR `description` LIKE '%$keyw%' OR `name`
LIKE '%$keyw%' OR `countries` LIKE '%$country%' OR `id` LIKE '%$camp%' OR `category`
LIKE '%$cat%' AND `active` = '1' ORDER BY `added`")
or die($db->error);
有很多OR
休息时间,我已尝试在括号中包装几个不同的变体,但查询仍然不起作用,并且没有错误,它只是仍然显示表中的所有内容被搜查的内容。我不是最好的这类查询,因为通常我只写1或2项,这个搜索了很多。
如果我只是在那个声明中搜索前三个它会工作正常,但是一旦我开始添加它就会在它打破的时候,即使我把括号放在前3个,我只是不确定是什么我做错了。
另外只是旁注,我的主机没有mysqlnd支持,这就是为什么我没有使用预准备语句,但我的变量在手前被转义。
答案 0 :(得分:3)
如果您的某个变量为空,则会选择所有行。
您应该执行以下操作(这是一个基本示例,以便您理解这个想法):
$orArray = array();
$orQuery = "";
if (!empty($keyw) && strlen($keyw) > 2) { // and other SQL injection checks
$orArray[] = "`requirements` LIKE '%{$keyw}%' ";
}
if (!empty($orArray())) {
$orQuery = implode(' OR ', $orArray);
}
$query = "SELECT * FROM `campaigns` WHERE ( {$orQuery} ) AND active = 1 ";
// You also should check if $orQuery is empty, if it is, you need to remove AND.
// Well, in that case you wouldn't do the query at all.
这样的事情应该做,但你需要对每个变量进行检查。
PS:我建议设置字符串搜索的最小值(3是一个很好的起点)。
PS2:这可能不是问题,但我指出它是因为它是你的脚本逻辑中的一个缺陷。
答案 1 :(得分:1)
我认为问题实际上是你在“ors”之后有“和”。你应该把所有的东西放在额外的括号内。
为了更好地说明考虑这个PHP代码:
<?php
var_dump(1 || 2 && 0);
var_dump((1 || 2 ) && 0);
并输出:
xxx@www0 ~/sp $ php -q a.php
bool(true)
bool(false)
注意||
是或,&&
是和