用户搜索查询

时间:2013-01-23 08:41:28

标签: php mysqli

我正在尝试进行查询以获取输入的项目并搜索数据库。我知道我多次这样做了,但这个查询只是不想工作。

这是查询

$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支持,这就是为什么我没有使用预准备语句,但我的变量在手前被转义。

2 个答案:

答案 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)

注意||是或,&&是和