Terakhir kali saya memeriksa, tidak mungkin untuk menyiapkan pernyataan di mana kolom yang terpengaruh tidak diketahui pada waktu persiapan - tetapi hal itu tampaknya berhasil - mungkin sistem basis data Anda lebih pemaaf daripada yang saya gunakan (terutama postgres)
Yang jelas salah adalah pernyataan implode(), karena setiap variabel harus ditangani sendiri, Anda juga memerlukan tanda kurung di sekitar daftar bidang dalam pernyataan sisipan.
Untuk memasukkan bidang yang ditentukan pengguna, saya pikir Anda harus melakukan sesuatu seperti ini (setidaknya bagaimana saya melakukannya);
$fields=array_keys($a); // here you have to trust your field names!
$values=array_values($a);
$fieldlist=implode(',',$fields);
$qs=str_repeat("?,",count($fields)-1);
$sql="insert into user($fieldlist) values(${qs}?)";
$q=$DBH->prepare($sql);
$q->execute($values);
Jika Anda tidak dapat mempercayai nama bidang di $a, Anda harus melakukan sesuatu seperti
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Di mana validfields adalah fungsi yang Anda tulis yang menguji setiap nama bidang dan memeriksa apakah itu valid (cepat dan kotor dengan membuat array asosiatif $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... dan kemudian memeriksa nilai $valfields[$f], atau (seperti yang saya inginkan) dengan mengambil nama bidang dari server)