2014-01-26 136 views
-1

我在PHP腳本中面臨的一個問題,在()子句,我在POST請求如下接收來自另一頁的數據:PHP編寫的語句使用WHERE IN子句(...)子句

if(isset($_POST['mycountry'])){   
    if($_POST['mycountry']) $where[] = 'pays in (:pays)'; 
}; 

$ _ POST [「mycountry」]:包含由用戶選擇的國家(用戶可以選擇零個或多個國家)

如果用戶選擇國家/國家,我所關注的列和值(國家)增加IN子句。

if(isset($_POST['mycountry'])){ 
$tags = implode(', ', $_POST['mycountry']); 
$stmt->bindParam(':pays', $tags, PDO::PARAM_BOOL); 
} 

當用戶選擇零或只有一個國家它工作正常,一旦用戶選擇多個它不會返回任何!

有什麼想法?

+0

PDO參數無法綁定任意字符串來構造SQL - 它們在預準備語句中爲變量值提供1:1替換。因此,傳遞單個佔位符':pays'將導致所有逗號分隔標籤的單個字符串值一起發送到查詢中。在鏈接問題中提出了一些替代解決方案。 –

+0

對於一個選定的項目而不是當用戶選擇多個項目時工作的問題! – MDIT

+0

對。因爲當只選擇一個時,MySQL最終看到的查詢是WHERE支付IN('1') - - 這是有效的並返回結果。但是當選擇倍數時,MySQL會看到'WHERE支付IN('1,2,3,4,5')'注意,這是一個帶有數字和逗號的單個字符串值,而不是逗號分隔的值列表。該查詢在語法上不是無效的,但絕不會匹配您的行。你不能做你正在寫的東西。請參閱鏈接問題中的高分答案。 –

回答

0

嗯,我知道在oracle中,你不能將一個數組綁定到一個var。我認爲這對於PDO是一樣的。

您需要做的是爲每個循環運行一個並創建一對一綁定,並將新綁定替換爲您生成的一個綁定。 (並且更新綁定數組以獲得您生成的鍵 - 值對)