前回チェックしたとき、影響を受ける列が準備時に不明であるステートメントを準備することはできませんでしたが、それは機能しているようです。おそらく、データベースシステムは私が使用しているものよりも寛容です(主にpostgres)
明らかに間違っているのは、implode()ステートメントです。各変数はそれ自体で処理する必要があるため、insertステートメントのフィールドリストを括弧で囲む必要もあります。
ユーザー定義のフィールドを挿入するには、次のようなことをする必要があると思います(少なくとも私が行う方法)。
$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);
$ aのフィールド名を信頼できない場合は、次のようなことを行う必要があります
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
ここで、validfieldsは、各フィールド名をテストし、それが有効かどうかをチェックする、作成した関数です(連想配列$ valfields =array('name' => 1、'email' => 1、'phone' =>1...次に$valfields[$ f]の値をチェックするか、(私が好むように)サーバーからフィールド名をフェッチして)