Když jsem to naposledy kontroloval, nebylo možné připravit prohlášení, kde byly dotčené sloupce v době přípravy neznámé - ale zdá se, že to funguje - možná je váš databázový systém shovívavější než ty, které používám (hlavně postgres)
Co je zjevně špatné, je příkaz implode(), protože každá proměnná by měla být zpracována sama, potřebujete také závorky kolem seznamu polí v příkazu insert.
Chcete-li vložit uživatelem definovaná pole, myslím, že musíte udělat něco takového (alespoň tak, jak to dělám já);
$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);
Pokud nemůžete důvěřovat názvům polí v $a, musíte udělat něco jako
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Kde validfields je funkce, kterou napíšete a která otestuje každý název pole a zkontroluje, zda je platný (rychle a špinavě vytvořením asociativního pole $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... a pak kontrola hodnoty $valfields[$f] nebo (jak bych preferoval) načtením názvů polí ze serveru)