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.