Foros del Web » Programando para Internet » PHP »

A la hora de recorrer con foreach imprime una vez de más

Estas en el tema de A la hora de recorrer con foreach imprime una vez de más en el foro de PHP en Foros del Web. Simplemente estoy imprimiendo un array. La forma del array es esta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original array ( 2 ) {   [ 0 ...
  #1 (permalink)  
Antiguo 17/03/2014, 11:49
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
A la hora de recorrer con foreach imprime una vez de más

Simplemente estoy imprimiendo un array.

La forma del array es esta

Código PHP:
Ver original
  1. array(2) {
  2.   [0]=>
  3.   array(3) {
  4.     ["idsubcategorie"]=>
  5.     string(1) "4"
  6.     ["idcategories"]=>
  7.     string(1) "1"
  8.     ["subcategorie"]=>
  9.     string(3) "PHP"
  10.   }
  11.   [1]=>
  12.   array(3) {
  13.     ["idsubcategorie"]=>
  14.     string(1) "5"
  15.     ["idcategories"]=>
  16.     string(1) "1"
  17.     ["subcategorie"]=>
  18.     string(5) "MYSQL"
  19.   }
  20. }

Para recorrerlo utilizo lo siguiente

Código PHP:
Ver original
  1. <select name="subcategories">
  2.                     <?php
  3.                     foreach($subcategories as $sub){
  4.                         ?>
  5.                         <option value="<?php echo $sub['idsubcategorie'];?>">
  6.                              <?php echo $sub['subcategorie'];?>
  7.                         </option>
  8.                         <?php
  9.                     }
  10.                     ?>
  11. </select>

Y me genera este error



No entiendo por qué genera ese error si luego sí reconoce los índeces que le estoy indicando :S como se puede ver aquí



No entiendo por qué sucede esto si luego imprime los id de cada subcategoría y el nombre, en este caso PHP y MYSQL son los dos únicos que estan en la BD.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 17/03/2014, 12:01
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: A la hora de recorrer con foreach imprime una vez de más

NOTICE es Error

eso te estadiciendo que subcategorie no esta declarada como variable
  #3 (permalink)  
Antiguo 17/03/2014, 12:08
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: A la hora de recorrer con foreach imprime una vez de más

muchas gracias enlinea777, pero es que subcategorie así como idsubcategorie no son variables, son índices del array contenido en $subcategories :S

y lo lee bien, pero es como si intentara recorrer el array tres veces en vez de dos veces. en la BD solamente hay dos subcategories no 3. la única manera de que esos índices no estén definidos es recorriendo el array tres veces, eso es imposible porque el array contiene exactamente lo que puse más arriba para mostrar la estructura que tiene.

es un comportamiento raro que nunca me sucedió :S
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 17/03/2014, 15:26
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: A la hora de recorrer con foreach imprime una vez de más

Después de hacer varias pruebas, he descubierto el motivo de por qué ocurre esto, pero no sé cómo solucionarlo :S

Resulta que el código no sé de qué manera (porque es imposible) empuja en el array de subcategories otro array que contiene los datos de un post. De esta manera devuelve error en la primera iteración del foreach ya que en el array del post no se encuentran los índices del array de las subcategories.

Ya digo, es imposible que esto suceda porque los arrays son generados independientemente con dos llamadas a dos funciones totalmente distintas al controller que a su vez y mediante singleton instancian a la clase Post encargada de dar los datos en forma de array al controller y este a la vista.

He comprobado todos los puntos, cambiando el nombre de variables en cada controller y dentro de los métodos de cada clase y sigue devolviendo ese error.

No entiendo qué está pasando, si alguien se ve capaz en ayudarme pues adelante, si necesita código, lo aporto.

Gracias por su ayuda! :)
__________________
Ayúdame a hacerlo por mi mismo.
  #5 (permalink)  
Antiguo 17/03/2014, 15:50
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: A la hora de recorrer con foreach imprime una vez de más

Código PHP:
Ver original
  1. <?php
  2.  
  3. $subcategories = [
  4.     [
  5.         'idsubcategory' => '4',
  6.         'idcategory' => '1',
  7.         'subcategory' => 'PHP'
  8.     ],
  9.     [
  10.         'idsubcategory' => '5',
  11.         'idcategory' => '1',
  12.         'subcategory' => 'MySQL'
  13.     ]
  14. ];
  15.  
  16. ?>
  17.  
  18. <select name="subcategories">
  19.     <?php foreach ($subcategories as $sub) : ?>
  20.         <option value="<?= $sub['idsubcategory'] ?>"><?= $sub['subcategory'] ?></option>
  21.     <?php endforeach; ?>
  22. </select>

A mi esto me funciona
  #6 (permalink)  
Antiguo 17/03/2014, 16:42
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: A la hora de recorrer con foreach imprime una vez de más

Después de hacer pruebas como loco, encontré el problema.

Object_query es un método que tengo en la clase Connect.

Al utilizar en ese método $this->result se quedaba almacenado el array anterior y por eso unía ambos arrays que no tenían nada que ver.

Pero eso no tendría que suceder, puesto que estoy trabajando la clase con patrón singleton.

Dejo la clase y cómo la instancia para que alguien pueda decirme qué está sucediendo, ya que en teoría eso en el futuro me podría dar más errores por agotar la conexiones a la BD :S

Código PHP:
Ver original
  1. /*
  2.  *   CLASE PARA CONECTAR Y REALIZAR OPERACIONES EN LA BASE DE DATOS
  3.  */
  4. class Connect{
  5.     private $IDConexion;
  6.     private $Escapestr;
  7.     private $IDQuery;
  8.        
  9.         //para trabajar la clase con patron de diseño singleton
  10.         private static $instance;
  11.    
  12.     private function __construct(){
  13.         //establezco los datos de autenticación para acceder a la base de datos
  14.         $conexion = mysqli_connect("server", "user" , "password" , "database");
  15.        
  16.         //establezco el conjunto de caracteres a nivel de servidor en tiempo de ejecucion
  17.         mysqli_set_charset( $conexion, "utf8" );
  18.        
  19.         $this->IDQuery = $conexion;
  20.        
  21.         return $this->IDQuery;
  22.     }
  23.        
  24.         //para trabajar la clase con patron de diseño singleton
  25.         public static function Instance(){
  26.             if(self::$instance == NULL){
  27.                 self::$instance = new Connect();
  28.             }
  29.             return self::$instance;
  30.         }
  31.    
  32.     public function Escape( $string_escapar ){
  33.         //escapo caracteres para evitar sql injection
  34.         $string_escapar = trim( $string_escapar );
  35.         $escape = mysqli_real_escape_string( $this->IDQuery, $string_escapar );
  36.        
  37.          $this->Escapestr = $escape;
  38.        
  39.         return $this->Escapestr;
  40.     }
  41.    
  42.     public function Connect ( $string_consulta ){
  43.         //comprueba si se ha creado la conexion
  44.         if(!$this->IDQuery)
  45.         {
  46.             die('Error de conexion ('.mysqli_connect_errno().') '. mysqli_connect_error());
  47.         }
  48.         //conecta a la base de datos
  49.         $this->IDConsulta = mysqli_query($this->IDQuery , $string_consulta) OR die (mysqli_error($this->IDQuery));
  50.        
  51.                
  52.                
  53.         return $this->IDConsulta;
  54.     }
  55.        
  56.     public function Go_out (){
  57.         mysqli_close($this->IDQuery);
  58.     }
  59.        
  60.        
  61.         /*
  62.          * procesa el resultset de la consulta
  63.          * (devuelve un array indexado)
  64.          */
  65.         public  function Object_query($conexion){
  66.             if(mysqli_num_rows($conexion) !==0){
  67.  
  68.                 while ( $value = mysqli_fetch_array( $conexion, MYSQLI_ASSOC )){
  69.                     $result[] = $value;
  70.                 }
  71.             }
  72.             else{
  73.                 $result   = FALSE;
  74.             }
  75.  
  76.             return  $result;
  77.         }
  78. }

El método que recoge todas las subcategorias instancia así la clase connect

Código PHP:
Ver original
  1. /*
  2.      * obtiene todas las subcategories
  3.      */
  4.     public function read_subcategories(){
  5.         $this->sql  = "SELECT * FROM subcategories";
  6.        
  7.         $this->conexion = Connect::Instance()->connect($this->sql);
  8.        
  9.         $this->result   = Connect::Instance()->Object_query($this->conexion);
  10.        
  11.         return $this->result;
  12.     }

y así el método que recoge un post determinado

Código PHP:
Ver original
  1. /*
  2.      * selecciona un post por su id
  3.      */
  4.     public function read_post($idpost){
  5.         $this->idpost   = Connect::Instance()->Escape($idpost);
  6.        
  7.         $this->sql      = "SELECT * FROM posts WHERE idpost= $this->idpost";
  8.        
  9.         $this->conexion = Connect::Instance()->connect($this->sql);
  10.        
  11.         $this->result   = Connect::Instance()->Object_query($this->conexion);
  12.        
  13.         return $this->result;
  14.     }
__________________
Ayúdame a hacerlo por mi mismo.

Última edición por guardarmicorreo; 17/03/2014 a las 17:17
  #7 (permalink)  
Antiguo 17/03/2014, 21:32
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: A la hora de recorrer con foreach imprime una vez de más

¿Por Dios santo de donde sacaste esa Clase?

  #8 (permalink)  
Antiguo 18/03/2014, 02:54
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: A la hora de recorrer con foreach imprime una vez de más

Cita:
Iniciado por enlinea777 Ver Mensaje
¿Por Dios santo de donde sacaste esa Clase?

por qué? qué le pasa? :)
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: foreach, imprime, mysql, select, vez
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 04:55.