Sidst jeg tjekkede, var det ikke muligt at udarbejde en erklæring, hvor de berørte kolonner var ukendte på forberedelsestidspunktet - men det ser ud til at virke - måske er dit databasesystem mere tilgivende end dem, jeg bruger (hovedsageligt postgres)
Det, der klart er forkert, er implode()-sætningen, da hver variabel skal håndteres af sig selv, skal du også have parenteser omkring feltlisten i insert-sætningen.
For at indsætte brugerdefinerede felter, tror jeg, du skal gøre sådan noget (i hvert fald sådan gør jeg det);
$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);
Hvis du ikke kan stole på feltnavnene i $a, skal du gøre noget lignende
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Hvor validfields er en funktion, du skriver, som tester hvert feltnavn og tjekker, om det er gyldigt (hurtigt og beskidt ved at lave en associativ matrix $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... og derefter tjekke for værdien af $valfields[$f], eller (som jeg ville foretrække) ved at hente feltnavnene fra serveren)