sql >> Base de Datos >  >> RDS >> Mysql

Advertencia:PDOStatement::execute():SQLSTATE[HY093]:número de parámetro no válido:el parámetro no se definió en... el texto del archivo

Si usa parámetros posicionales, la matriz de parámetros que pasa a execute() debe ser una matriz ordinal. Del mismo modo, si usa parámetros con nombre, la matriz debe ser una matriz asociativa.

Aquí hay una prueba para confirmar el comportamiento:

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

Tenga en cuenta que en las versiones actuales de PHP, las claves de matriz asociativas no debe tener el prefijo : como comenta @prodigitalson. El : El prefijo solía ser necesario en las claves de matriz en versiones anteriores de PHP.

También vale la pena mencionar que encontré errores y un comportamiento impredecible cuando intenté mezclar parámetros posicionales y parámetros con nombre en una sola consulta. Puede usar cualquier estilo en diferente consultas en su aplicación, pero eligió un estilo u otro para una consulta determinada.