Pasar una matriz a través de POST en PHP para insertarla en MySQL

Tengo un formulario que permite a los usuarios ingresar clases y actividades en múltiples campos, estos campos se declaran así:

label for ="classact">Classes and Activities    

Cuando se pasa el formulario, este es el código que se maneja en el inserto:

  $maininsert = "INSERT INTO `camptest` (`name`, `city`, `phone`, `photo`) VALUES ('$_POST[name]', '$_POST[city]', '$_POST[phone]', '$photoinfo') SET @lid = LAST_INSERT_ID() "; $classactinsert = "INSERT INTO `class_act` (`cid`"; for($i = 0; $i < 3; $i++) { if(isset($_POST['classact'][$i])) { $temp = $i+1; $classactinsert = $classactinsert . ",`act$temp`"; } } $classactinsert = $classactinsert . ") VALUES ('@lid'"; for($i = 0; $i < 3; $i++) { if(isset($_POST['classact'][$i])) { $classactinsert = $classactinsert . ",'$_POST[classact][$i]"; } } $classactinsert = $classactinsert . ")"; $indata = $maininsert . $classactinsert; $result = mysql_query($indata); 

Me doy cuenta de que es una gran cantidad de código, pero al completar el formulario y enviarlo, la consulta se genera:

  INSERT INTO `camptest` (`name`, `city`, `phone`, `photo`) VALUES ('Multiple Activities', 'Nowhere', '555-555-1111', 'images/51127f6b06d1e.jpg') SET @lid = LAST_INSERT_ID() INSERT INTO `class_act` (`cid`,`act1`,`act2`,`act3`) VALUES ('@lid','Array[0],'Array[1],'Array[2]) 

La consulta no se está insertando, pero tampoco arroja ningún error, aunque los tengo activados.

Mi pregunta principal es: ¿qué estoy haciendo mal que está causando que los valores actúen1, act2 y act3 se muestren como Array [0], Array [1] y Array [2]?

Mi segunda pregunta es, ¿estoy yendo sobre esto de la manera correcta? Soy un poco nuevo para php y me temo que podría estar haciendo esto de la manera difícil?

Cualquier ayuda sería apreciada, avíseme si necesita información adicional.

No inserta nada porque (entre otras cosas) su cadena de consulta no está siendo construida correctamente.

 ('@lid','Array[0],'Array[1],'Array[2]) 

Los apóstrofes están en mal estado. Me gustaría sugerir una forma (en mi opinión) más limpia y más estructurada para realizar su tarea:

Nota: Obviamente está trabajando con mysql _ * – stack, por lo que mi ejemplo también está basado en él. Pero ten en cuenta que esto está en desuso. Utilice mysqli o incluso mejor: PDO en su lugar.

  $value) { //walk through the POSTed acts and add them to the corresponding array $act_keys[] = 'act'.($key+1); $act_values[] = $value; } //Now build the whole string: $insert_acts = "INSERT INTO `class_act` (`" . implode("`, `", $act_keys) . "`) VALUES ('" . implode("', '", $act_values) . "')"; //and finally perform the query: mysql_query($insert_acts); 

Tenga en cuenta también que este código es altamente vulnerable con respecto a SQL-Injection y no debe utilizarse en producción. Asegúrese de utilizar declaraciones preparadas (como con PDO) y / o para desinfectar su entrada correctamente.

Además, esta solución es solo mi sugerencia y una de las muchas maneras de hacerlo. Pero bueno, tú pediste una opinión 🙂 PHP es un lenguaje muy flexible, por lo que es fácil hacer las cosas, pero hay muchas maneras de hacerlo, por lo que siempre hay posibilidades de elegir uno difícil y uno difícil. Otros, especialmente los tipos fuertes de lenguajes, pueden evitar eso por diseño. Pero PHP es realmente fácil de aprender y estoy seguro de que tu código mejorará gradualmente 🙂

Otra cosa que he notado: no necesitas especificar las teclas de matriz en tu HTML, solo tienes que dejar claro que se trata de una matriz con [] detrás del nombre. Además, no estoy seguro de si los atributos de id que utiliza son válidos, pero es posible que desee utilizar algo más simple:

    

En el próximo paso, es posible que desee refactorizar su código un poco para hacerlo aún más estructurado y legible. Dado que está realizando una tarea, que es “insertar algo en una tabla”, dos veces, también podríamos hacer una función resusable de ella:

  $_POST['name'], 'city' => $_POST['city'], 'phone' => $_POST['phone'], 'photo' => $photoinfo ); $class_insert_id = my_insert('camptest', $class_insert); //and pass it to the function // You can either build the array while looping through the POSTed values like above, // or you can pass them in directly, if you know that there will always be 3 values: $activities_insert = array( 'cid' => $class_insert_id, 'act1' => $_POST['classact'][0], 'act2' => $_POST['classact'][1], 'act3' => $_POST['classact'][2] ); $activities_insert_id = my_insert('class_act', $activities_insert); 

Seguro que hay espacio suficiente para la mejora y la optimización, solo quería mostrarte cuán asombroso puede ser PHP 😛