2012-09-04 149 views
0

我想提出一個搜索框的功能,有此查詢:爲什麼我的PDO查詢使用LIKE&LIMIT不起作用?

$query="SELECT * FROM article WHERE title LIKE ? OR description LIKE ?"; 

然後在foreach循環中,我有這樣的數組:

$params[]= "%".$keyword."%"; 
$params[]= "%".$keyword."%"; 

然後我執行:

$stmt=$cxn->prepare($query); 
$stmt->execute($params); 

這工作,但...

如果,在foreach循環後,我想添加「LI ??MIT」,我這樣做:

$query.=" LIMIT ?, ?"; 
$params[]=$row_number; 
$params[]=$items_per_page; 

然後我執行腳本,並拋出這個致命錯誤:

PHP Fatal error: Uncaught exception 'PDOException' with message 
'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax 
to use near ''0', '2'' at line 1' in ..../index.php:247 
    Stack trace: 
    #0 .../index.php(247): PDOStatement->execute(Array) 
#1 {main} 
thrown in ..../index.php on line 247 

我試圖做加引號圍繞兩個關鍵詞:$params= "'%".$keyword."%'"; 但這沒有奏效。

此外,我試着在PHPMyAdmin內完全相同的查詢,它的工作。

有沒有人知道爲什麼這是拋出一個錯誤?

非常感謝。

+0

什麼是'$ keyword'的價值? – Kermit

+1

可能重複[PHP的PDO bindValue在極限](http://stackoverflow.com/questions/2269840/php-pdo-bindvalue-in-limit) – jeroen

+0

嗨,值是一個字符串,只是字母。 – alexx0186

回答

3

更新:

$query="SELECT * FROM article WHERE title LIKE ? OR description LIKE ?"; 
$query.=" LIMIT ?, ?"; 
$stmt=$cxn->prepare($query); 
$stmt->bindValue(1, "%".$keyword."%"); 
$stmt->bindValue(2, "%".$keyword."%"); 
$stmt->bindValue(3, $row_number, PDO::PARAM_INT); 
$stmt->bindValue(4, $items_per_page, PDO::PARAM_INT); 

$stmt->execute(); 
+0

先生的問題,你可以混合數組中的'PHP'數據類型? :) –

+2

@JohnWoo是的,你可以。 – xdazz

+1

@JohnWoo PHP就像那樣美好。 – Kermit

1

的原因等沒有工作,是因爲當你使用綁定參數與喜歡它的治療「%值%」作爲一個字符串。

你將不得不使用:

$query="SELECT * FROM article WHERE title LIKE CONCAT('%',?,'%') OR description LIKE CONCAT('%',?,'%')"; 
+0

嗨,感謝您的回覆。我的文章中的第一個SQL查詢確實有效。當我添加「LIMIT?,?」時,麻煩開始了在查詢結束時。 Regards – alexx0186

0

我想你需要你有你的極限子句中傳遞的變量轉化。看到這個...to use near ''0', '2''上有值單引號LIMIT條款

在嘗試

$query.=" LIMIT ?, ?"; 
$params[] = intval($row_number); 
$params[] = intval($items_per_page); 
+0

嗨,謝謝你的迴應。我嘗試過,但無法使其工作。我想弄清楚如何將BindValues和'?'混合在一起。問候 – alexx0186

+0

@ alexx0186你爲什麼不這樣做?每個值一個參數(*我的意思是不使用數組*)'$ stmt-> bindParam(':name',$ name); $ stmt-> bindParam(':value',$ value);' –

+0

嗨,我不確定我能這樣做的原因是因爲我不知道用戶要輸入多少個關鍵字。所以在我的foreach循環中,我只是根據需要添加儘可能多的'?'(而不是綁定值)。不知道我可以用BindParam做這個..? – alexx0186