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

Avertissement :PDOStatement::execute() :SQLSTATE[HY093] :Numéro de paramètre invalide :le paramètre n'a pas été défini dans...filetext

Si vous utilisez des paramètres positionnels, le tableau de paramètres que vous passez à execute() doit être un tableau ordinal. De même, si vous utilisez des paramètres nommés, le tableau doit être un tableau associatif.

Voici un test pour confirmer le comportement :

$stmt = $db->prepare("SELECT ?, ? ,?");

$params = array( 'a', 'b', 'c' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$stmt = $db->prepare("SELECT :A, :B, :C");

$params = array( 'a', 'b', 'c' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

Notez que dans les versions actuelles de PHP, les clés de tableau associatif ne le font pas doit être préfixé par : comme @prodigitalson commente. Le : le préfixe était requis dans les clés de tableau dans les anciennes versions de PHP.

Il convient également de mentionner que j'ai rencontré des bogues et un comportement imprévisible lorsque j'ai essayé de mélanger des paramètres positionnels et des paramètres nommés dans une seule requête. Vous pouvez utiliser l'un ou l'autre style dans différent requêtes dans votre application, mais choisissez un style ou un autre pour une requête donnée.