Vấn đề ở đây là bạn ràng buộc các tham số với bindParam
, sử dụng ràng buộc bằng tham chiếu. Trong trường hợp của bạn, bạn nên sử dụng bindValue
thay vào đó:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Hoặc bạn có thể chuyển trực tiếp mảng của mình tới execute()
phương pháp:
$sql->execute( $binders );
Như được mô tả trong sách hướng dẫn:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Vì vậy, khi vòng lặp foreach của bạn kết thúc $value
có giá trị của mục mảng cuối cùng Apple
. Vì vậy, khi execute
chạy, cả :ctid
và :p1
các giá trị đang trở nên bằng với Apple
. Chắc chắn, đây không phải là điều bạn muốn)