Se você usa parâmetros posicionais, o array de parâmetros que você passa para
execute()
deve ser uma matriz ordinal. Da mesma forma, se você usar parâmetros nomeados, a matriz deverá ser uma matriz associativa. Aqui está um teste para confirmar o 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());
}
Observe que nas versões atuais do PHP, as chaves de matriz associativa não tem que ser prefixado com
:
como comentários @prodigitalson. O :
prefixo costumava ser necessário em chaves de array em versões mais antigas do PHP. Também vale a pena mencionar que encontrei bugs e comportamento imprevisível quando tentei misturar parâmetros posicionais e parâmetros nomeados em uma única consulta. Você pode usar qualquer um dos estilos em diferentes consultas em seu aplicativo, mas escolheu um estilo ou outro para uma determinada consulta.