Pokud používáte poziční parametry, pole parametrů, které předáte execute()
musí být řadové pole. Podobně, pokud použijete pojmenované parametry, pole musí být asociativní pole.
Zde je test k potvrzení chování:
$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());
}
Všimněte si, že v aktuálních verzích PHP se klíče asociativního pole nedělají musí mít předponu :
jak komentuje @prodigitalson. :
prefix býval vyžadován v klíčích pole ve starších verzích PHP.
Za zmínku také stojí, že jsem se setkal s chybami a nepředvídatelným chováním, když jsem se snažil smíchat poziční parametry a pojmenované parametry v jediném dotazu. Oba styly můžete použít v různých dotazy ve vaší aplikaci, ale pro daný dotaz zvolili ten či onen styl.