Vui lòng xem xét sử dụng bindValue thay vì truyền mảng để thực thi. Như nó nói đây :
Có thể làm cho điều này khá minh bạch với phần còn lại của ứng dụng của bạn, vì bạn đã có các giá trị mà bạn muốn CẬP NHẬT dưới dạng một mảng. Hãy thử v.d. một cái gì đó như thế này:
<?php
function executeWithDataTypes(PDOStatement $sth, array $values) {
$count = 1;
foreach($values as $value) {
$sth->bindValue($count, $values['value'], $values['type']);
$count++;
}
return $sth->execute();
}
$sth = $handle->prepare("UPDATE table SET name = ?, id_extra1 = ?, id_extra2 = ? WHERE id_something = ?");
$values = array();
$values[] = array('value' => 'testing', 'type' => PDO::PARAM_STR);
$values[] = array('value' => 2, 'type' => PDO::PARAM_INT);
$values[] = array('value' => null, 'type' => PDO::PARAM_NULL);
$values[] = array('value' => 1958, 'type' => PDO::PARAM_INT);
$result = executeWithDataTypes($sth, $values);
?>
Như bạn đã lưu ý rằng việc sử dụng bindParam khiến bạn đau đầu trước đây, hãy lưu ý sự khác biệt nhỏ giữa bindValue và bindParam . Cá nhân tôi không bao giờ sử dụng bindParam vì các tác dụng phụ khiến cho việc hiểu script khó hơn, mặc dù tất nhiên có những trường hợp những hiệu ứng này sẽ có ích.
CHỈNH SỬA:Tất nhiên, bạn có thể đơn giản hóa hàm hơn nữa và loại bỏ nhu cầu chỉ định kiểu làm khóa bổ sung trong mảng đã truyền bằng cách làm như sau:
$type = PDO::PARAM_STR;
switch(true) {
case is_null($value): $type = PDO::PARAM_NULL; break;
case is_numeric($value): $type = PDO::PARAM_INT; break;
// ...
default: break;
}
và xác định kiểu dựa trên kiểu của giá trị được truyền vào mảng; tuy nhiên, điều đó dễ xảy ra lỗi hơn, vì ví dụ:float cũng là số và điều đó sẽ dẫn đến quyết định sai trong câu lệnh switch ở trên, nhưng tôi nghĩ rằng tôi nên đề cập đến nó vì lợi ích của sự đầy đủ.