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.