Mysql
 sql >> Database >  >> RDS >> Mysql

Avvertenza:PDOStatement::execute():SQLSTATE[HY093]:Numero parametro non valido:parametro non definito in...filetext

Se utilizzi parametri posizionali, l'array di parametri che passi a execute() deve essere un array ordinale. Allo stesso modo, se si utilizzano parametri denominati, l'array deve essere un array associativo.

Ecco un test per confermare il comportamento:

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

Nota che nelle versioni correnti di PHP, le chiavi di array associative non devono essere preceduti da : come commenta @prodigitalson. Il : prefisso era richiesto nelle chiavi dell'array nelle versioni precedenti di PHP.

Vale anche la pena ricordare che ho riscontrato bug e comportamenti imprevedibili quando ho provato a combinare parametri posizionali e parametri denominati in un'unica query. Puoi utilizzare entrambi gli stili in diversi query nella tua app, ma scegli uno stile o un altro per una determinata query.