sql >> Base de Datos >  >> RDS >> Mysql

PDO PHP insertar en DB desde una matriz asociativa

La última vez que verifiqué, no fue posible preparar una declaración en la que las columnas afectadas fueran desconocidas en el momento de la preparación, pero eso parece funcionar, tal vez su sistema de base de datos sea más indulgente que los que estoy usando (principalmente postgres)

Lo que claramente está mal es la declaración de implosión (), ya que cada variable debe manejarse por sí misma, también necesita paréntesis alrededor de la lista de campos en la declaración de inserción.

Para insertar campos definidos por el usuario, creo que debe hacer algo como esto (al menos así lo hago yo);

$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 no puede confiar en los nombres de campo en $a, debe hacer algo como

foreach($a as $f=>$v){
   if(validfield($f)){
      $fields[]=$f;
      $values[]=$v;
   }
}

Donde validfields es una función que escribes que prueba cada nombre de campo y comprueba si es válido (rápido y sucio haciendo una matriz asociativa $valfields=array('name'=>1,'email'=>1, 'phone'=>1 ... y luego verificando el valor de $valfields[$f], o (como preferiría) obteniendo los nombres de los campos del servidor)