Ако използвате позиционни параметри, масивът от параметри, който предавате на execute()
трябва да бъде порядков масив. По същия начин, ако използвате именувани параметри, масивът трябва да е асоциативен масив.
Ето тест за потвърждение на поведението:
$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());
}
Имайте предвид, че в текущите версии на PHP, асоциативните клавиши за масив не трябва да има префикс с :
като коментари на @prodigitalson. :
префиксът се изискваше в ключовете на масива в по-старите версии на PHP.
Също така си струва да споменем, че срещнах грешки и непредвидимо поведение, когато се опитах да смеся позиционни параметри и наименувани параметри в една заявка. Можете да използвате всеки стил в различен заявки във вашето приложение, но сте избрали един или друг стил за дадена заявка.