2013-01-23 86 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) 

||是或,&&是和