Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jalankan PDO dengan array yang berisi nilai null

Harap pertimbangkan untuk menggunakan bindValue alih-alih meneruskan array untuk dieksekusi. Seperti yang tertulis di sini :

Seharusnya dimungkinkan untuk membuat ini cukup transparan ke seluruh aplikasi Anda, karena Anda sudah memiliki nilai yang ingin Anda UPDATE sebagai array. Coba mis. seperti ini:

<?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);
?>

Seperti yang Anda perhatikan bahwa menggunakan bindParam membuat Anda sakit kepala di masa lalu, harap perhatikan perbedaan halus antara bindValue dan bindParam . Secara pribadi, saya tidak pernah menggunakan bindParam karena efek samping yang membuat lebih sulit untuk memahami skrip, meskipun tentu saja ada kasus di mana efek ini akan berguna.

EDIT:Anda tentu saja dapat lebih menyederhanakan fungsi dan menghilangkan kebutuhan untuk menentukan tipe sebagai kunci tambahan dalam larik yang diteruskan dengan melakukan sesuatu seperti:

$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;
}

dan tentukan tipe berdasarkan tipe nilai yang diteruskan dalam array; namun, itu lebih rawan kesalahan, karena mis. float juga numerik dan itu akan menyebabkan keputusan yang salah dalam pernyataan switch di atas, tapi saya pikir saya akan menyebutkannya demi kelengkapan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Haruskah saya hanya menggunakan AWS RDS Automated Backup atau DB Snapshots?

  2. Hapus sepenuhnya MariaDB atau MySQL dari CentOS 7 atau RHEL 7

  3. Kembalikan hasil default untuk nilai IN terlepas

  4. Cara menggunakan NHibernate dengan server MySQL dan server Microsoft SQL 2008

  5. Bagaimana cara melakukan Pagination dengan mybatis?