La dernière fois que j'ai vérifié, il n'était pas possible de préparer une déclaration où les colonnes affectées étaient inconnues au moment de la préparation - mais cela semble fonctionner - peut-être que votre système de base de données est plus indulgent que ceux que j'utilise (principalement postgres)
Ce qui est clairement faux, c'est l'instruction implode(), car chaque variable doit être gérée par elle-même, vous avez également besoin de parenthèses autour de la liste des champs dans l'instruction d'insertion.
Pour insérer des champs définis par l'utilisateur, je pense que vous devez faire quelque chose comme ça (du moins comme je le fais);
$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);
Si vous ne pouvez pas faire confiance aux noms de champs dans $a, vous devez faire quelque chose comme
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
Où validfields est une fonction que vous écrivez qui teste chaque nom de champ et vérifie s'il est valide (rapide et sale en créant un tableau associatif $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... puis en vérifiant la valeur de $valfields[$f], ou (comme je préférerais) en récupérant les noms de champs sur le serveur)