首頁  >  問答  >  主體

PDO IN() 陣列語句 AND 佔位符

我在 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粉832490510P粉832490510383 天前622

全部回覆(2)我來回復

  • P粉216807924

    P粉2168079242023-10-24 17:57:03

    這裡的問題是 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);

    回覆
    0
  • P粉501007768

    P粉5010077682023-10-24 09:30:01

    解決方案

    如果 $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

    回覆
    0
  • 取消回覆