Nếu bạn sử dụng tham số vị trí, mảng tham số bạn chuyển cho execute()
phải là một mảng thứ tự. Tương tự như vậy, nếu bạn sử dụng các tham số được đặt tên, mảng phải là một mảng kết hợp.
Đây là bài kiểm tra để xác nhận hành vi:
$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());
}
Lưu ý rằng trong các phiên bản PHP hiện tại, các phím mảng kết hợp không phải có tiền tố là :
như @prodigitalson nhận xét. :
tiền tố được sử dụng để bắt buộc trong các khóa mảng trong các phiên bản PHP cũ hơn.
Cũng cần nhắc lại rằng tôi đã gặp phải lỗi và hành vi không thể đoán trước khi tôi cố gắng kết hợp các tham số vị trí và các tham số được đặt tên trong một truy vấn duy nhất. Bạn có thể sử dụng một trong hai kiểu ở khác nhau truy vấn trong ứng dụng của bạn, nhưng đã chọn kiểu này hay kiểu khác cho một truy vấn nhất định.