Mysql
 sql >> Base de données >  >> RDS >> Mysql

PDO PHP bindValue ne fonctionne pas

Le problème est là :

$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);

Je suppose que $regGUID est une liste de chaînes entre guillemets séparées par des virgules.

Chaque paramètre de requête n'accepte qu'une seule valeur scalaire. Pas des listes de valeurs.

Vous avez donc deux choix :

  1. Continuez à interpoler la chaîne $regGUID, même si vous utilisez des paramètres pour d'autres valeurs scalaires. Mais vous voulez toujours faire attention à éviter l'injection SQL, vous devez donc former correctement la chaîne $regGUID. Vous ne pouvez pas simplement appeler PDO::quote() sur toute la chaîne, cela en ferait une seule chaîne entre guillemets contenant des UUID et des virgules. Vous devez vous assurer que chaque chaîne UUID est échappée et entre guillemets individuellement, puis imploser la liste ensemble et l'interpoler dans la clause IN.

    $regGUIDs = explode(',', $regGUID);
    $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs);
    $regGUID = implode(',', $regGUIDs);
    $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
    
  2. explode() le $regGUID dans un tableau et ajoutez un paramètre de requête pour chaque élément du tableau. Interpolez la liste dynamique des espaces réservés des paramètres de requête.

    $regGUIDs = explode(',', $regGUID);
    $params = array_fill(1, count($regGUIDs), '?');
    $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
    

Vous pouvez bindValue() dans une boucle pour le tableau, mais gardez à l'esprit que les autres paramètres doivent également être liés par position, et non par nom. PDO a des bogues qui ne le rendent pas heureux lorsque vous essayez de mélanger les deux styles de paramètres différents dans la même requête.

Au lieu d'utiliser bindValue(), je passe simplement un tableau de valeurs de paramètres à PDOStatement::execute(), ce qui est beaucoup plus simple.

$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);