Lần trước tôi đã kiểm tra, không thể chuẩn bị một câu lệnh trong đó các cột bị ảnh hưởng là không xác định tại thời điểm chuẩn bị - nhưng điều đó dường như hoạt động - có thể hệ thống cơ sở dữ liệu của bạn dễ tha thứ hơn so với hệ thống cơ sở dữ liệu tôi đang sử dụng (chủ yếu là postgres)
Điều rõ ràng là sai là câu lệnh implode (), vì mỗi biến sẽ do nó tự xử lý, bạn cũng cần có dấu ngoặc đơn xung quanh danh sách trường trong câu lệnh insert.
Để chèn các trường do người dùng xác định, tôi nghĩ bạn phải làm điều gì đó như thế này (ít nhất là cách tôi thực hiện);
$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);
Nếu bạn không thể tin tưởng các tên trường trong $ a, bạn phải làm điều gì đó như
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Trong đó các trường hợp lệ là một hàm mà bạn viết để kiểm tra từng tên trường và kiểm tra xem tên trường đó có hợp lệ không (nhanh chóng và dễ hiểu bằng cách tạo một mảng liên kết $ valfields =array ('name' => 1, 'email' => 1, 'phone' => 1 ... và sau đó kiểm tra giá trị của $ valfields [$ f] hoặc (nếu tôi muốn) bằng cách tìm nạp tên trường từ máy chủ)