De laatste keer dat ik het controleerde, was het niet mogelijk om een verklaring voor te bereiden waarin de betrokken kolommen onbekend waren tijdens de voorbereiding - maar dat ding lijkt te werken - misschien is uw databasesysteem meer vergevingsgezind dan degene die ik gebruik (voornamelijk postgres)
Wat duidelijk verkeerd is, is de implode()-instructie, aangezien elke variabele op zichzelf moet worden afgehandeld, u hebt ook haakjes nodig rond de veldlijst in de insert-instructie.
Om door de gebruiker gedefinieerde velden in te voegen, denk ik dat je zoiets als dit moet doen (althans zo doe ik het);
$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);
Als u de veldnamen in $a niet kunt vertrouwen, moet u iets doen als
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Waar validfields een functie is die u schrijft die elke veldnaam test en controleert of deze geldig is (snel en vies door een associatieve array te maken $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... en dan controleren op de waarde van $valfields[$f], of (zoals ik zou willen) door de veldnamen op te halen van de server)