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

Thực thi PDO với một mảng chứa các giá trị rỗng

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 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 đủ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối MySQL qua đường hầm SSH

  2. Ứng dụng Android có thể kết nối trực tiếp với cơ sở dữ liệu mysql trực tuyến không

  3. Cách đổi tên cơ sở dữ liệu MySQL

  4. Cách xóa các ký tự hàng đầu không mong muốn khỏi chuỗi trong MySQL

  5. Xóa hàng khỏi chế độ xem có xóa hàng khỏi bảng cơ sở - MySQL không?