Inserte una gran cantidad de variables en la tabla usando DOP

Tengo una gran forma con aproximadamente 25 campos de entrada.

Intento insertarlos en mi mesa y la única forma en que sé cómo está usando lo siguiente …

$count = $dbh->exec("INSERT INTO directory(field1, field2) VALUES (':value1', ':value2')"); 

Como tengo tantas variables de publicación, ¿hay una mejor manera de hacerlo que escribir cada persona en mi consulta?

Puede construir sentencias INSERT dinámicamente, pero debe tener cuidado al restringir los campos POST. No confíe en que la solicitud contiene solo columnas válidas.

También delimite los identificadores de tabla y columna. MySQL utiliza la marca de retroceso como el delimitador de identificador de forma predeterminada.

 function execInsert($pdo, $table, $_POST) { // get a list of columns in $table, either by hard-coding them per table, // or by querying DESC or INFORMATION_SCHEMA $real_columns = array('col1', 'col2', 'col3'); $fields = array_intersect_key($_POST, array_flip($real_columns)); if (!$fields) { // no POST fields match the real columns return false; } $columns = array_map(function($col) { return "`".$col."`"; }, array_keys($fields)); $holders = array_map(function($col) { return ":".$col; }, array_keys($fields)); $values = $fields; $sql = "INSERT INTO `$table` (" . join(",", $columns) . " VALUES (" . join(",", $holders) . ")"; if (($stmt = $pdo->prepare($sql)) === false) { die(print_r($pdo->errorInfo(), true)); } if (($retval = $stmt->execute($values)) === false) { die (print_r($stmt->errorInfo(), true)); } return $retval; } 

Consultas dinámicas preparadas

Puede construir su consulta dinámicamente desde la matriz $ _POST:

Sin embargo, NUNCA confíe en la información del usuario, lo que significa que no puede confiar en que los datos en $ _POST contendrán nombres de columna válidos.

1. Sanitize los datos de la publicación

Puede definir una matriz de nombres de columnas incluidos en la lista $whitelist = array('field1', 'field2', ...) , y luego usar:

 $data = array_intersect_key($_POST, array_flip($whitelist)); 

para encontrar la intersección entre las columnas incluidas en la lista blanca y su matriz $ _POST. (Gracias @BillKarwin)

2. Crea la consulta

 private function buildInsertSql($data, $table) { $columns = ""; $holders = ""; foreach ($data as $column => $value) { $columns .= ($columns == "") ? "" : ", "; $columns .= $column; $holders .= ($holders == "") ? "" : ", "; $holders .= ":$column"; } $sql = "INSERT INTO $table ($columns) VALUES ($holders)"; return $sql; } 

Esto le dará una statement SQL del formulario:

 $sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2) 

y prepare la statement:

 $stmt = $dbh->prepare($sql); 

3. Parámetros de enlace

A continuación, puede vincular dinámicamente parámetros a los marcadores de posición:

 foreach ($data as $placeholder => $value) { $stmt->bindValue(":$placeholder", $value); } 

y ejecutarlo:

 $stmt->execute(); 

Un poco más avanzado …

  • Eche un vistazo a este enlace Enlace al mismo marcador de posición Para obtener información acerca de cómo hacer que su statement dinámica preparada sea más sólida.
  • Eche un vistazo a este enlace: Bind Params Inside Loop Para una advertencia sobre los parámetros vinculantes frente a los valores en un bucle.