Jika Anda menggunakan parameter posisi, larik parameter yang Anda berikan ke execute()
harus berupa array ordinal. Demikian juga, jika Anda menggunakan parameter bernama, lariknya harus berupa larik asosiatif.
Berikut tes untuk mengonfirmasi perilaku tersebut:
$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());
}
Perhatikan bahwa dalam versi PHP saat ini, kunci array asosiatif tidak harus diawali dengan :
seperti komentar @prodigitalson. :
awalan dulu diperlukan dalam kunci larik di versi PHP yang lebih lama.
Perlu juga disebutkan bahwa saya menemukan bug dan perilaku yang tidak dapat diprediksi ketika saya mencoba menggabungkan parameter posisi dan parameter bernama dalam satu kueri. Anda dapat menggunakan salah satu gaya dalam berbeda kueri di aplikasi Anda, tetapi pilih satu gaya atau lainnya untuk kueri tertentu.