Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO-PHP-Einfügung in DB aus einem assoziativen Array

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

tun
foreach($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)