Foros del Web » Programando para Internet » PHP »

Problemas para recorrer un arreglo: Undefined offset

Estas en el tema de Problemas para recorrer un arreglo: Undefined offset en el foro de PHP en Foros del Web. Tengo una vista en la cual creo multiples textareas en los cuales se va creando un array "al vuelo" (creo que así se dice): @import ...
  #1 (permalink)  
Antiguo 03/10/2011, 08:39
Avatar de 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.
  #2 (permalink)  
Antiguo 03/10/2011, 08:46
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problemas para recorrer un arreglo: Undefined offset

Tu problema esta en las comillas, no puedes englobar arreglos entre comillas dobles como si fueran variables simples.

Código PHP:
//cambia esto
$consulta "INSERT INTO galeria_de_imagenes VALUES(null, $idproducto, $imagen[$i], $status[$i])";

//por esto
$consulta "INSERT INTO galeria_de_imagenes VALUES(null, $idproducto, ".$imagen[$i].", ".$status[$i].")";

//lo mismo con esta, y todas las lineas que tengan arrays dentro de comillas
$consulta "INSERT INTO especificaciones VALUES(null, $idproducto, ".$grupo[$indice].", ".$estado[$indice].", ".$descripcion[$indice].")"
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 03/10/2011, 09:20
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Problemas para recorrer un arreglo: Undefined offset

Hola h2swider, muchas gracias por la respuesta.

Hago lo que indicas pero sigue apareciendo:
Notice: Undefined offset: 1 in C:\xampp\htdocs\proyecto\back\modulos\productos\mo del.php on line 130

A esto:
Código PHP:
Ver original
  1. $consulta = "INSERT INTO especificaciones VALUES(null, $idproducto, ".$grupo[$indice].", ".$estado[$indice].", ".$descripcion[$indice].")";
Debo por necesidad dejarlo así (aclaro que probé como dijiste, y no se inserta por ser interpretado como un tipo de dato INT):
Código PHP:
Ver original
  1. $consulta = "INSERT INTO especificaciones VALUES(null, $idproducto, ".$grupo[$indice].", ".$estado[$indice].", '".$descripcion[$indice]."')";
ya que en la tabla el campo "descripciones" es de tipo text.

Solo el 1er item del array se guarda en la base de datos, los demas (o sea luego de que suceda el error) no se insertan.

Podrá ser alguna otra cosa? desde ya muchas gracias.
  #4 (permalink)  
Antiguo 03/10/2011, 09:27
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: Problemas para recorrer un arreglo: Undefined offset

ese error es porque el indice 1 de tu arreglo no existe,ejemplo:
arreglo[0]='XXXXX';
arreglo[2]='YYYYYY';

y al hacer ese ciclo donde el arreglo[1] no existe da un NOTICE.
Prueba colocando:
echo "<script>alert('".$descripcion_especificacione s[1]."');</script>;
para ver donde desaparece ese valor.

en un principio pense que podia ser por poner un arreglo entre comillas pero probe y no da problema cuando se obtiene de forma numerica. haci que las comillas no creo que sean la causa.
  #5 (permalink)  
Antiguo 03/10/2011, 09:31
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Problemas para recorrer un arreglo: Undefined offset

Cita:
Iniciado por Rodrhigo Ver Mensaje
Prueba colocando:
echo "<script>alert('".$descripcion_especificacione s[1]."');</script>;
para ver donde desaparece ese valor.
Capo!! pruebo y les cuento .
  #6 (permalink)  
Antiguo 03/10/2011, 09:36
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problemas para recorrer un arreglo: Undefined offset

Podrías hacerme un var dump de la consulta que te genera el problema. También estaría bueno si me pasas la estructura de la tabla donde querés hacer el insert.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #7 (permalink)  
Antiguo 03/10/2011, 09:38
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Problemas para recorrer un arreglo: Undefined offset

FUCKKKKKK!!!! $descripcion_especificaciones[1] se imprime bien en todos lados maldita sea!! tanto en el controlador, como en el modelo dentro de addProductos() tanto como dentro de addEspecificaciones().
  #8 (permalink)  
Antiguo 03/10/2011, 09:44
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problemas para recorrer un arreglo: Undefined offset

Encontre tu problema, no es el 1 el que falla, mira estas linea

Código PHP:
$tot count($imagen);
for(
$i 0$i $tot$i++){
...

Si $imagen tiene 10 elementos $tot =10;
cuando haces el for, recorres del 0 al 10, esto esta mal, ya que el ultimo seria el 9 no el 10

Tendrias que hacer

Código PHP:
 for($i 0$i $tot 1$i++) 
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #9 (permalink)  
Antiguo 03/10/2011, 09:48
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Problemas para recorrer un arreglo: Undefined offset

La estructura de la tabla "especificaciones" es:
idespecificaciones INT NOT NULL auto_increment (PK)
productos_idproductos INT NOT NULL (FK)
grupos_idgrupos INT NOT NULL (FK)
status INT NOT NULL
descripcion TEXT NULL (Cotejamiento: utf8_general_ci)

Cita:
Iniciado por h2swider Ver Mensaje
Podrías hacerme un var dump de la consulta que te genera el problema.
Código PHP:
Ver original
  1. function addEspecificaciones($idproducto, $grupo, $estado, $descripcion){
  2.     $total = count($descripcion);
  3.     for($indice = 0; $indice < $total; $indice++){
  4.         $consulta = "INSERT INTO especificaciones VALUES(null, $idproducto, ".$grupo[$indice].", ".$estado[$indice].", '".$descripcion[$indice]."')";  
  5.         var_dump($consulta);
  6.         $conexion = crear_conexion(SERVER,USER,PASS); $db = DATABASE;   consulta_base_de_datos($consulta, $db, $conexion);
  7.     }  
  8. }

Esto devuelve.
string(68) "INSERT INTO especificaciones VALUES(null, 56, 3, 0, '<p>qweqwe</p>')"
<br />
<b>Notice</b>: Undefined offset: 1 in <b>C:\xampp\htdocs\sonomax\back\modulos\productos\ model.php</b> on line <b>130</b><br />
string(68) "INSERT INTO especificaciones VALUES(null, 56, 3, , '<p>8888888</p>')" (my god aca está!)

No encuentra .$estado[$indice] parece, puebo haber si es eso.
  #10 (permalink)  
Antiguo 03/10/2011, 11:31
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Problemas para recorrer un arreglo: Undefined offset

Efectivamente, el problema estaba en que no llegaba el valor $estado[$indice] a la consulta. Se ve que al producirse un error ahi ya no seguía leyendo los índices del array.

Les agradezco enormemente h2swider y Rodrhigo. Si ustedes me hubiese sido muy difícil encontrar la solución. Muchas gracias.

Etiquetas: imagenes, mysql, offset, registro, undefined, arreglos, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:02.