Als ich das letzte Mal nachgesehen habe, war es nicht möglich, eine Anweisung vorzubereiten, bei der die betroffenen Spalten zur Vorbereitungszeit unbekannt waren - aber das Ding scheint zu funktionieren - vielleicht ist Ihr Datenbanksystem nachsichtiger als das, das ich verwende (hauptsächlich Postgres)
Was eindeutig falsch ist, ist die implode()-Anweisung, da jede Variable von sich selbst behandelt werden sollte, benötigen Sie auch Klammern um die Feldliste in der Insert-Anweisung.
Um benutzerdefinierte Felder einzufügen, müssen Sie meiner Meinung nach so etwas tun (zumindest mache ich das so);
$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);
Wenn Sie den Feldnamen in $a nicht vertrauen können, müssen Sie so etwas wie
tunforeach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Wo validfields eine Funktion ist, die Sie schreiben, die jeden Feldnamen testet und prüft, ob er gültig ist (schnell und schmutzig, indem Sie ein assoziatives Array $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... und dann nach dem Wert von $valfields[$f] suchen, oder (wie ich es vorziehen würde) durch Abrufen der Feldnamen vom Server)