Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warnung:PDOStatement::execute():SQLSTATE[HY093]:Ungültige Parameternummer:Parameter wurde nicht definiert in...Dateitext

Wenn Sie Positionsparameter verwenden, das Array von Parametern, das Sie an execute() übergeben muss ein ordinales Array sein. Ebenso muss das Array ein assoziatives Array sein, wenn Sie benannte Parameter verwenden.

Hier ist ein Test, um das Verhalten zu bestätigen:

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

Beachten Sie, dass die assoziativen Array-Schlüssel in aktuellen Versionen von PHP nicht muss : vorangestellt werden wie @prodigitalson kommentiert. Der : Präfix war früher in Array-Schlüsseln in älteren PHP-Versionen erforderlich.

Erwähnenswert ist auch, dass ich auf Fehler und unvorhersehbares Verhalten gestoßen bin, als ich versuchte, Positionsparameter und benannte Parameter in einer einzigen Abfrage zu mischen. Sie können beide Stile verschieden verwenden Abfragen in Ihrer App, aber wählen Sie den einen oder anderen Stil für eine bestimmte Abfrage aus.