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)