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.