2013-01-23 47 views
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支持,这就是为什么我没有使用准备好的语句,但我的变量之前逃脱。

+1

日志中的任何信息? –

回答

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

+0

它提供了一个错误'功能名称必须是一个字符串'$ orQuery = implode('OR',$ orArray());' – kira423

+0

你应该开始找出你自己的基本错误。问题是我有'$ orArray()'而不是'$ orArray'(它不是函数:P)。现在修复,再试一次 –

1

我认为这个问题实际上是你在“ors”之后有“和”。你应该把所有的Ors放在额外的括号内。

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

<?php 

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

输出:

[email protected] ~/sp $ php -q a.php 
bool(true) 
bool(false) 

||是或,&&是和