0

我正在尝试进行一个查询,该查询将获取输入的项目并搜索数据库。我知道我是怎么做到的,但是这个查询就是不想工作。

这是查询

$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 个,它会正常工作,但是一旦我开始添加它,它就会中断,即使我在前 3 个周围加上括号,我只是不确定我在做什么错误的。

另外请注意,我的主机没有 mysqlnd 支持,这就是为什么我没有使用准备好的语句,但我的变量事先被转义了。

4

2 回答 2

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:这可能不是问题,但我指出它是因为这是您的脚本逻辑中的缺陷。

于 2013-01-23T08:46:42.337 回答
1

我相信这个问题实际上是,你在“or”之后有“and”。您应该将所有 ors 放入额外的括号中。

为了更好地说明考虑这个 php 代码:

<?php

var_dump(1 || 2 && 0);
var_dump((1 || 2 ) && 0);

和输出:

xxx@www0 ~/sp $ php -q a.php 
bool(true)
bool(false)

注意||是或,&&是和

于 2013-01-23T08:58:50.657 回答