Đối với tôi, điều này có vẻ là một lỗi (n chưa được báo cáo?) Trong mô phỏng tuyên bố chuẩn bị của PDO:
-
triển khai của
PDOStatement::execute()
cuối cùng gọipdo_parse_params()
; -
ngược lại, cố gắng trích dẫn / thoát giá trị dựa trên kiểu dữ liệu của thông số có liên quan (như được chỉ ra bởi
$data_type
đối số choPDOStatement::bindValue()
vàPDOStatement::bindParam()
—Tất cả các tham số được cung cấp dưới dạng$input_parameters
tớiPDOStatement::execute()
được coi làPDO::PARAM_STR
, như đã nêu trong tài liệu của chức năng đó); -
các giá trị kiểu chuỗi được ký tự thoát / trích dẫn bằng gọi trình điều khiển cơ sở dữ liệu liên quan
quoter()
bất kể chúng cónull
:trong trường hợp của PDO_MySQL, đó làmysql_handle_quoter()
, mà (cuối cùng) chuyển giá trị chomysqlnd_cset_escape_quotes()
hoặcmysql_cset_escape_slashes()
, tùy thuộc vàoNO_BACKSLASH_ESCAPES
của máy chủ Chế độ SQL; -
đưa ra một
null
đối số, cả hai hàm đó đều trả về một chuỗi trống.
Ý kiến của tôi là, trước khi bật tham số gõ
(ở bước 2 ở trên), pdo_parse_params()
nên đặt loại thành PDO::PARAM_NULL
nếu giá trị là null
. Tuy nhiên, một số người có thể cho rằng điều này sẽ ngăn cản việc xử lý theo kiểu cụ thể đối với null
các giá trị nếu thích hợp, trong trường hợp đó, trường hợp chuỗi (trong bước 3 ở trên) chắc chắn phải xử lý null
trước khi tiếp tục gọi đến quoter()
của trình điều khiển phương pháp.
Như một giải pháp tạm thời, dù sao thì việc vô hiệu hóa mô phỏng câu lệnh đã chuẩn bị thường là tốt nhất:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);