Ostatnim razem, gdy sprawdzałem, nie było możliwe przygotowanie zestawienia, w którym kolumny, których dotyczy problem, były nieznane w czasie przygotowywania – ale to wydaje się działać – może twój system baz danych jest bardziej wyrozumiały niż te, których używam (głównie postgres)
To, co jest wyraźnie błędne, to instrukcja implode(), ponieważ każda zmienna powinna być obsługiwana samodzielnie, potrzebujesz również nawiasów wokół listy pól w instrukcji INSERT.
Aby wstawić pola zdefiniowane przez użytkownika, myślę, że musisz zrobić coś takiego (przynajmniej tak, jak to robię);
$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);
Jeśli nie możesz ufać nazwom pól w $a, musisz zrobić coś takiego
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Gdzie validfields to funkcja, którą piszesz, która testuje każdą nazwę pola i sprawdza, czy jest ona poprawna (szybko i brudno, tworząc tablicę asocjacyjną $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... a następnie sprawdzenie wartości $valfields[$f], lub (jak wolałbym) poprzez pobranie nazw pól z serwera)