suchen

Heim  >  Fragen und Antworten  >  Hauptteil

PDO IN()-Array-Anweisung UND Platzhalter

Ich habe diesen Code auf SO gefunden, der sich hervorragend für die gemeinsame Verwendung von PDO- und IN()-Anweisungen eignet.

$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) ;

Aber wie mische ich andere Dinge in die Abfrage ein, damit sie so aussieht:

$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

Ich dachte, das würde funktionieren, aber ich bekomme:

Warnung: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Ungültige Anzahl von Argumenten: Die Anzahl der Bindevariablen stimmt nicht mit der Anzahl der Tags in Zeile 3 ($stm-Zeile) überein

Irgendeine Idee, wie es wie erwartet funktioniert?

Updateexecute to array, funktioniert immer noch nicht..

P粉832490510P粉832490510406 Tage vor651

Antworte allen(2)Ich werde antworten

  • 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);

    Antwort
    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

    Antwort
    0
  • StornierenAntwort