Đối với người mới bắt đầu, bạn đang sử dụng bindParam()
giống như nó bindValue()
, chúng hoàn toàn khác nhau
.
Nếu không biết bạn đang lấy các giá trị mảng từ đâu thì khó hơn một chút để xem điều gì đang xảy ra một cách chắc chắn. Có vẻ như thông tin bạn đang cung cấp có thể không thực sự là mã bạn đang sử dụng và đã được sửa đổi, đặc biệt liên quan đến các vòng lặp foreach và các biến data_array như những gì bạn đang mô tả là một vấn đề phổ biến với BindParam vì vậy đó là giả định tôi Tôi sẽ làm việc trên. Nếu đúng như vậy, nói chung, bạn nên cung cấp các đoạn mã thực tế bao gồm việc khởi tạo các biến được sử dụng và các khối nơi phát hiện sự cố thay vì chỉ mã trong các khối đó.
Đây là một câu trả lời khác với lý do
, về cơ bản, hãy đảm bảo rằng bạn đang chuyển bằng cách tham chiếu phần giá trị của vòng lặp foreach hoặc việc bạn thay đổi bindParams thành bindValues. Bạn cũng sẽ muốn đảm bảo rằng bạn đang sử dụng hai đối tượng riêng biệt ở đây thay vì một đối tượng nếu bạn định tiếp tục sử dụng cấu trúc này vì bạn đang chạy cả hai bindParam()
mỗi khi bạn gọi execute()
.
Vì vậy, một cái gì đó như, giả sử, cấu trúc mã không được thay đổi (mà có lẽ nó nên như vậy vì đây là tất cả trong vòng lặp và chỉ Execute mới nên ở trong một vòng lặp):
$set_data1 = "UPDATE data_table
SET data_status = 'PROCESSED'
WHERE data_id = :data_id1";
$stmt = $db->prepare($set_data1);
$stmt->bindValue(':data_id1', $data_array1['data_id'], PDO::PARAM_INT);
$stmt->execute();
$set_data2 = "UPDATE data_table
SET data_status = 'PENDING'
WHERE data_id = :data_id2";
$stmt2 = $db->prepare($set_data2);
$stmt2->bindValue(':data_id2', $data_array2['data_id'], PDO::PARAM_INT);
$stmt2->execute();
Tuy nhiên, một cách tối ưu hơn để làm điều này sẽ giống như (hãy nhớ rằng đây chỉ là một ví dụ chung):
$set_data = "UPDATE data_table
SET data_status = :data_status
WHERE data_id = :data_id";
$data_array = array( array('data_status' => $dataStatus1, 'data_id' => $dataId), array('data_status' => $dataStatus2, 'data_id' => $dataId2) );
/* this is just to represent a multidimensional array (or a multidimensional object) containing the data status and the data id which should be handled and decided before you pass them into a loop. */
$stmt = $db->prepare($set_data);
$data_status = null;
$data_id = null;
$stmt->bindParam(':data_status', $data_status);
$stmt->bindParam(':data_id', $data_id);
foreach( $data_array as $name => $val ) {
$data_status = $val['data_status'];
$data_id = $val['data_id'];
$stmt->execute()';
}