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

Bản chính vi phạm tính toàn vẹn của Mysql / PDO - mặc dù chưa có gì trong bảng

Rất vui vì bạn đã giải quyết được điều này. Tuy nhiên, điều này nhằm giải quyết lý do tại sao bindParam() không hiệu quả với bạn. Nó không phải là một lỗi, nó hoạt động theo cách này theo thiết kế.

Theo tài liệu :

(nhấn mạnh của tôi)

Xem xét những điều trên, điều này:

 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowvalue);
 90                         }

... sẽ liên kết mọi tham số với $rowvalue bằng cách tham khảo mà tại thời điểm thực thi truy vấn, sẽ luôn là 1 (phần tử cuối cùng của $rowdata )

Cách làm cho nó hoạt động bằng cách sử dụng bindParam() sẽ giống như:

 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
 90                         }

... hoặc, có thể, thậm chí:

 87                         foreach($rowdata as $rowname => &$rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowvalue);
 90                         }

... để mỗi tham số sẽ tham chiếu đến mảng phần tử tương ứng .

Một giải pháp thay thế, như đã trích dẫn ở trên, sẽ là bindValue() liên kết các tham số theo giá trị chứ không phải bằng cách tham khảo. Có nghĩa là tham số sẽ được đánh giá tại thời điểm bindValue() được gọi và không được gọi vào thời điểm nó thực sự cần thiết (tức là thực thi truy vấn):

 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindValue(':'.$rowname, $rowvalue);
 90                         }

Tất nhiên, giải pháp thay thế khác là cấp dữ liệu execute() với một mảng các tham số, cho phép execute() giải quyết phần ràng buộc (do đó yêu thích cá nhân của tôi!) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_MERGE_PATCH () - Thực hiện hợp nhất tài liệu JSON tuân thủ RFC 7396 trong MySQL

  2. Cách cài đặt MySQL 8 trên Ubuntu

  3. phương thức không xác định trong khi sử dụng form_for trong phương thức bộ điều khiển mới

  4. Cách (âm thầm) gỡ cài đặt MySQL trên Windows 32 và 64 bit

  5. Tại sao mysql_escape_string rất không được khuyến khích?