Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/10/2011, 08:39
Avatar de cristian_cena
cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Problemas para recorrer un arreglo: Undefined offset

Tengo una vista en la cual creo multiples textareas en los cuales se va creando un array "al vuelo" (creo que así se dice):

Código HTML:
Ver original
  1. <textarea name="descripcion_especificaciones[]"><p>bla bla</p></textarea>
  2. <textarea name="descripcion_especificaciones[]"><p>bla bla</p></textarea>

Luego envío el formulario por post, en el va un arreglo (aca el problema) que si le hago un var_dump() tendría esta forma:

Código PHP:
Ver original
  1. array(2) {
  2.   [0]=>
  3.   string(14) "<p>bla bla</p>"
  4.   [1]=>
  5.   string(14) "<p>bla bla</p>"
  6. }
Este envío post sale de una vista y va a parar a un controlador en el cual:

1 - Almaceno el array en una variable
$descripcion_especificaciones = $_POST['descripcion_especificaciones'];

2 - paso esta variable como parámetro de la función addProductos();
Código PHP:
Ver original
  1. //SIMPLE
  2. $name                       = $_POST['name_producto'];
  3. $marcas                         = $_POST['marcas'];
  4. $status                         = $_POST['status_producto'];
  5.            
  6. //MULTI-DIMENSION
  7. $files_caracteristicas      = $_POST['files_caracteristicas'];
  8. $grupos_caracteristicas         = $_POST['grupos_caracteristicas'];
  9. $status_caracteristicas         = $_POST['status_caracteristicas'];
  10. $descripcion_caracteristicas    = $_POST['descripcion_caracteristicas'];
  11.            
  12. $grupos_especificaciones    = $_POST['grupos_especificaciones'];
  13. $status_especificaciones    = $_POST['status_especificaciones'];
  14. $descripcion_especificaciones   = $_POST['descripcion_especificaciones'];
  15.            
  16. $files_galeria                  = $_POST['files_galeria'];
  17. $status_galeria                 = $_POST['status_galeria'];
  18.  
  19. $files_slideshow                = $_POST['files_slideshow'];
  20. $status_slideshow               = $_POST['status_slideshow'];
  21.            
  22. //var_dump($descripcion_especificaciones);         
  23. addProductos($name, $marcas, $status, $files_caracteristicas, $grupos_caracteristicas, $status_caracteristicas, $descripcion_caracteristicas, $grupos_especificaciones, $status_especificaciones, $descripcion_especificaciones, $files_galeria, $status_galeria, $files_slideshow, $status_slideshow);
La funcion addProductos() , junto con otras encargadas de insertar los datos en la base de datos, se encuentran en el modelo:
Código PHP:
Ver original
  1. function addCaracteristicas($idproducto, $grupo, $imagen, $estado, $descripcion){
  2.     $tot = count($grupo);
  3.     for($i = 0; $i < $tot; $i++){
  4.         $consulta = "INSERT INTO caracteristicas VALUES(null, $idproducto, $grupo[$i], $imagen[$i], $estado[$i], '".$descripcion[$i]."')";
  5.         $conexion = crear_conexion(SERVER,USER,PASS); $db = DATABASE;   consulta_base_de_datos($consulta, $db, $conexion);
  6.     }
  7. }
  8.  
  9. function addEspecificaciones($idproducto, $grupo, $estado, $descripcion){
  10.     $total = count($descripcion);
  11.     for($indice = 0; $indice < $total; $indice++){
  12.         $consulta = "INSERT INTO especificaciones VALUES(null, $idproducto, $grupo[$indice], $estado[$indice], '".$descripcion[$indice]."')";
  13.         $conexion = crear_conexion(SERVER,USER,PASS); $db = DATABASE;   consulta_base_de_datos($consulta, $db, $conexion);
  14.     }  
  15. }
  16.  
  17. function addGaleriaDeImagenes($idproducto, $imagen, $status){
  18.     $tot = count($imagen);
  19.     for($i = 0; $i < $tot; $i++){
  20.         $consulta = "INSERT INTO galeria_de_imagenes VALUES(null, $idproducto, $imagen[$i], $status[$i])";
  21.         $conexion  = crear_conexion(SERVER,USER,PASS); $db = DATABASE; consulta_base_de_datos($consulta, $db, $conexion);
  22.     }
  23.    
  24. }
  25.  
  26. function addSlideshowDeImagenes($idproducto, $imagen, $status){
  27.     $tot = count($imagen);
  28.     for($i = 0; $i < $tot; $i++){
  29.         $consulta = "INSERT INTO slideshow_de_imagenes VALUES(null, $idproducto, $imagen[$i], $status[$i])";
  30.         $conexion  = crear_conexion(SERVER,USER,PASS); $db = DATABASE;  consulta_base_de_datos($consulta, $db, $conexion);
  31.     }
  32. }
  33.  
  34. function addProductos($name, $marcas, $status, $files_caracteristicas, $grupos_caracteristicas, $status_caracteristicas, $descripcion_caracteristicas, $grupos_especificaciones, $status_especificaciones, $descripcion_especificaciones, $files_galeria, $status_galeria, $files_slideshow, $status_slideshow){
  35.     $consulta = " INSERT INTO productos VALUES (null, $marcas, $status, '".$name."')";
  36.     $conexion  = crear_conexion(SERVER,USER,PASS); $db = DATABASE;  consulta_base_de_datos($consulta, $db, $conexion);
  37.  
  38.     $idproducto = mysql_insert_id($conexion);
  39.  
  40.     addEspecificaciones($idproducto, $grupos_especificaciones, $status_especificaciones, $descripcion_especificaciones);
  41.     addCaracteristicas($idproducto, $grupos_caracteristicas, $files_caracteristicas, $status_caracteristicas, $descripcion_caracteristicas);
  42.     addGaleriaDeImagenes($idproducto, $files_galeria, $status_galeria);
  43.     addSlideshowDeImagenes($idproducto, $files_slideshow, $status_slideshow);
  44.  
  45.     cerrar_conexion($conexion);
  46. }
El Problema se presenta cuando recorro con for el arreglo en la función addEspecificaciones();

Notice: Undefined offset: 1 in C:\xampp\htdocs\proyecto\back\modulos\productos\mo del.php on line 130

la línea 130 es esta:
$consulta = "INSERT INTO especificaciones VALUES(null, $idproducto, $grupo[$indice], $estado[$indice], '".$descripcion[$indice]."')";

Googleé al respecto, según entendí este error se está presentando porque al recorrer el array con for no encuentra el índice "1" del mismo, lo que es raro porque estoy completamte seguro que el arreglo llega bien. Si hago un var_dump dentro de addEspecificaciones() el arreglo se muestra con dos posiciones "0 y 1" y $total = count($descripcion); da como resultado 2, lo cual luego al recorrer con for
$indice < $total; ordenará que solo se repita dos veces el bucle (o sea, para los indices 0 y 1).

Es raro, porque addCaracteristicas() funciona de la misma manera y sin embargo no me da problemas.
Se que puedo apagar los notice con @ pero el problema es que al no recorrerse el array por completo tampoco me inserta los registros en la base de datos.

Espero el tema no halla quedado demasiado extenso de leer. Temía de no explicarme al no detallar bien el problema. Desde ya agradezco su ayuda. Un fuerte abrazo.