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!) .