PDO IN() 陣列語句 AND 佔位符
P粉832490510
P粉832490510 2023-10-23 21:43:13
0
2
631

我在 SO 上找到了這段程式碼,它非常適合一起使用 PDO 和 IN() 語句。

$values = explode(',', $values) ; # 1,4,7

$placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ;
$query = "SELECT * FROM table WHERE id IN ($placeholders)";

$stm = $db->prepare($query) ;
$stm->execute($values) ;

但是,如何在查詢中混合其他內容,讓查詢看起來像這樣:

$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";
$stm = $db->prepare($query) ;
$stm->execute(array($values,$product)) ; //error happens when adding product placeholder

我認為這會起作用,但我得到:

警告: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: 無效參數數量:綁定變數數量與第3 行中的標記數量不符($stm線)

知道如何讓它如預期運作嗎?

更新執行到數組,仍然不起作用..

P粉832490510
P粉832490510

全部回覆(2)
P粉216807924

這裡的問題是 execute 需要一個單一陣列。您不能傳遞多個數組,更糟的是,您不能嵌套數組。

我們已經有了一個完美的 $values 數組,所以讓我們在創建佔位符字串之後重用它。

$values = explode(',', $values) ; # 1,4,7

$placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ;
$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";

// New!
$values[] = $product;

$stm = $db->prepare($query);
$stm->execute($values);
P粉501007768

解決方案

如果 $values 是一個數組,這應該可以工作:

$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";
$stm->execute(array_merge($values, array($product)));

說明

execute() 需要提供一個參數(在本例中是一個陣列)。透過新增 array_merge($values, array($product)),您可以建立一個數組,並在末尾新增 $product,因此查詢應該可以正常運作。

在此處查看示範:http://ideone.com/RcClX

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板