Jeśli używasz parametrów pozycyjnych, tablica parametrów, które przekazujesz do execute()
musi być tablicą porządkową. Podobnie, jeśli używasz nazwanych parametrów, tablica musi być tablicą asocjacyjną.
Oto test potwierdzający zachowanie:
$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());
}
Zauważ, że w obecnych wersjach PHP klucze tablicy asocjacyjnej nie muszą być poprzedzone :
jak komentuje @prodigitalson. :
prefiks był wymagany w kluczach tablicowych w starszych wersjach PHP.
Warto również wspomnieć, że napotkałem błędy i nieprzewidywalne zachowanie, gdy próbowałem mieszać parametry pozycyjne i parametry nazwane w jednym zapytaniu. Możesz użyć obu stylów w różnych zapytań w Twojej aplikacji, ale wybierz taki lub inny styl dla danego zapytania.