Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PDO vários espaços reservados nomeados não recuperam dados

bindParam Requer uma referência


O problema é causado pela maneira como você vincula os parâmetros no loop foreach.
foreach($bindings as $placeholder=>$bound){
    echo $placeholder . " - " . $bound."<br/>";
    $stmt->bindParam($placeholder, $bound);
}

bindParam requer uma referência. Ele liga a variável, não o valor, à instrução. Como a variável em um loop foreach é redefinida no início de cada iteração, apenas a última referência a $bound é deixado intacto e você acaba vinculando todos os seus espaços reservados a ele.

É por isso que seu código funciona quando $query['where'] contém apenas uma entrada, mas falha quando contém mais de uma.

Você pode resolver o problema de 2 maneiras:

Passe por referência

foreach($bindings as $placeholder => &$bound) {  //pass $bound as a reference (&)
    $stmt->bindParam($placeholder, $bound);     // bind the variable to the statement
}

Passar por valor


Use bindValue em vez de bindParam :
foreach($bindings as $placeholder => $bound) {  
    $stmt->bindValue($placeholder, $bound);     // bind the value to the statement
}