Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Gỡ lỗi PDO mySql chèn NULL vào cơ sở dữ liệu thay vì trống

Đố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:

  1. triển khai của PDOStatement::execute() cuối cùng gọi pdo_parse_params() ;

  2. 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ố cho PDOStatement::bindValue() PDOStatement::bindParam() —Tất cả các tham số được cung cấp dưới dạng $input_parameters tới PDOStatement::execute() được coi là PDO::PARAM_STR , như đã nêu trong tài liệu của chức năng đó);

  3. 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ị cho mysqlnd_cset_escape_quotes() hoặc mysql_cset_escape_slashes() , tùy thuộc vào NO_BACKSLASH_ESCAPES của máy chủ Chế độ SQL;

  4. đư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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị kết quả MySQL theo ngày

  2. Nhập data.sql MySQL Docker Container

  3. Cách nhập và xuất cơ sở dữ liệu qua SSH

  4. Tính tổng kích thước dữ liệu của cột BLOB trong bảng

  5. Chúng ta có thể giới hạn số hàng trong bảng trong MySQL không?