Foros del Web » Programando para Internet » PHP »

problema al recorrer array con for

Estas en el tema de problema al recorrer array con for en el foro de PHP en Foros del Web. estoy aprendiendo la programación orientada a objetos con php. en este caso la consulta a base de datos con clases. he creado estos dos códigos ...
  #1 (permalink)  
Antiguo 03/04/2013, 16:11
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
problema al recorrer array con for

estoy aprendiendo la programación orientada a objetos con php. en este caso la consulta a base de datos con clases.
he creado estos dos códigos y no imprime en pantalla el valor que hay en la base de datos, no entiendo dónde está el error. si alguien puede ayudarme se lo agradezco.

index.php

aquí un usuario solo puede consultar las habitaciones de hotel que dispone


Código PHP:
Ver original
  1. <div>
  2.         <form method="post" action="index.php">
  3.             <select name="habitaciones">
  4.                 <option value="simple">Habitación individual</option>
  5.                 <option value="doble">Habitación doble</option>
  6.                 <option value="triple">Habitación triple</option>
  7.                 <option value="cuadruple">Habitación cuadruple</option>
  8.             </select>
  9.             <input type="submit" name="enviar_plazas" value="Enviar">
  10.         </form>
  11.     </div>
  12.     <?php
  13.     if (isset($_POST['enviar_plazas'])) //si existe el boton enviar_plazas
  14.     {
  15.         //instancia un nuevo objeto Plazas pasándole dos valores
  16.         $rest = new Plazas($_SESSION['usuario'], $_POST['habitaciones']);
  17.         $plazas = $rest->consultabd();
  18.         for ($i = 0; $i < sizeof($plazas); $i++) //creo que es aquí donde está el problema pero no //estoy seguro
  19.         {
  20.             echo $plazas;
  21.         }
  22.      }
  23.     ?>

clases.php

aquí realizo la consulta a base de datos asignando la consulta a una variable que retornaré al index.php

Código PHP:
Ver original
  1. <?php
  2. //esta es la clase conectar que recibiendo parámetros realiza las consultas
  3. class Conectar
  4. {
  5.  
  6.     public static function conexion($TextoSQL)
  7.     {
  8.         $IDConexion = mysql_connect("localhost", "root", "");
  9.  
  10.         mysql_select_db("hoteles", $IDConexion);
  11.  
  12.         $IDConsulta = mysql_query($TextoSQL, $IDConexion) or die(mysql_error());
  13.  
  14.         if ($IDConsulta == false)
  15.         {
  16.             echo "ERROR: <br>\n";
  17.             echo mysql_error($IDConexion);
  18.         }
  19.  
  20.         return $IDConsulta;
  21.     }
  22.  
  23. }
  24.  
  25. //esta es la clase Plazas
  26. class Plazas
  27. {
  28.     //declaro las variables que usaré como privadas
  29.     private $usuario;
  30.     private $resultado_consulta = array();
  31.     private $tipo_habita;
  32.      //constructor que recibe los parámetros del index.php
  33.     public function __construct($user, $habi, $num)
  34.     {
  35.         $this->usuario = $user;
  36.         $this->tipo_habita = $habi;
  37.        
  38.     }
  39.     //aquí se realiza la consulta a la base de datos según los parámetros
  40.     public function consultabd()
  41.     {
  42.         $consulta = "SELECT usuario, " . $this->tipo_habita . " FROM usuarios, habitaciones WHERE (usuario='" . $this->usuario . "' AND " . $this->tipo_habita . " ='" . $this->tipo_habita . "')";
  43.         $result_conexion = Conectar::conexion($consulta);
  44.         while ($fila = mysql_fetch_array($result_conexion))
  45.         {
  46.             $this->resultado_consulta[] = $fila[$this->tipo_habita]; //asigno a la variable //resultado_consulta el resultado de la consulta
  47.         }
  48.         return $this->resultado_consulta;
  49.     }
  50.  
  51. }

gracias! :)
  #2 (permalink)  
Antiguo 03/04/2013, 16:30
 
Fecha de Ingreso: abril-2013
Ubicación: Sevilla
Mensajes: 23
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al recorrer array con for

Hola
creo que el problema lo tienes en la consulta sql, si la analizas es un poco rara no crees?
Supongamos que el sesion id_usuario es el 60, y el post de tipo de habitacion 'simple'. estas diciendo
"SELECT usuario, simple FROM usuarios, habitaciones WHERE (usuario='60' AND simple ='simple');

Creo en primer lugar que deberias usar un apodo a la tabla, y debes decirla a que tabla pertenece cada campo

select u.usuario,h.". $this->tipo_habita ." from usuarios u, habitaciones h WHERE ....

Por otro lado, no entiendo el cruce de tablas, que es lo que quieres obtener? que relacion tienen los usuarios con las habitaciones? La relacion deberia ser por id.

Sea como sea te aconsejo filtrar el contenido del post enviado como norma antes de usarlo para prevenir agujeros de seguridad, ya que es muy facil que alguien use el firebug y le cambie el valor al option enviado, y te puede armar una buena.

un saludo!
  #3 (permalink)  
Antiguo 03/04/2013, 16:48
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

Cita:
Iniciado por Sevillacode Ver Mensaje
Hola
creo que el problema lo tienes en la consulta sql, si la analizas es un poco rara no crees?
Supongamos que el sesion id_usuario es el 60, y el post de tipo de habitacion 'simple'. estas diciendo
"SELECT usuario, simple FROM usuarios, habitaciones WHERE (usuario='60' AND simple ='simple');
Esto lo entendí. tienes razón, con solo esto es suficiente

Código PHP:
Ver original
  1. $consulta = "SELECT usuario, " . $this->tipo_habita . " FROM usuarios, habitaciones WHERE (usuario='" . $this->usuario . "')"; //he borrado el $tipo_habita

Cita:
Creo en primer lugar que deberias usar un apodo a la tabla, y debes decirla a que tabla pertenece cada campo

select u.usuario,h.". $this->tipo_habita ." from usuarios u, habitaciones h WHERE ....
Esto no lo entendí :S

Cita:
Por otro lado, no entiendo el cruce de tablas, que es lo que quieres obtener? que relacion tienen los usuarios con las habitaciones? La relacion deberia ser por id.
la relación es que cada usuario tiene un número de habitaciones en cada tipo de habitación.

por ejemplo

usuario= q

simple=200|doble=300|triple=400|cuadruple=500

usuario es un campo de la tabla usuarios.
simple, doble, triple, cuadruple son campos de la tabla habitaciones.

cuando hago una consulta un usuario determinado solo puede consultar el número disponible de sus habitaciones de cada habitación.

Cita:
Sea como sea te aconsejo filtrar el contenido del post enviado como norma antes de usarlo para prevenir agujeros de seguridad, ya que es muy facil que alguien use el firebug y le cambie el valor al option enviado, y te puede armar una buena.

un saludo!
no tengo problema porque no es para algo real, está en local y es solo para aprendizaje :D

gracias por tu ayuda, la verdad es que me has ayudado con algo que se me pasó por alto, pero el problema persiste.

igual que antes me da este error:

Notice: Array to string conversion in C:\xampp\htdocs\xampp\web\trabajo\funciones.php on line 74
Array
  #4 (permalink)  
Antiguo 03/04/2013, 16:52
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: problema al recorrer array con for

Te falta imprimir el índice en el for:

Código PHP:
Ver original
  1. for($i = 0, $size = count($plazas); $i < $size; $i++) {
  2.     echo $plazas[$i];
  3. }

mejor usas un foreach:

Código PHP:
Ver original
  1. foreach ($plazas as $plaza) {
  2.    echo $plaza;
  3. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 03/04/2013, 17:05
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

Cita:
Iniciado por andresdzphp Ver Mensaje
Te falta imprimir el índice en el for:

Código PHP:
Ver original
  1. for($i = 0, $size = count($plazas); $i < $size; $i++) {
  2.     echo $plazas[$i];
  3. }

mejor usas un foreach:

Código PHP:
Ver original
  1. foreach ($plazas as $plaza) {
  2.    echo $plaza;
  3. }
gracias!

me devuelve el mismo error con for y con foreach.

si necesitais absolutamente todo el código solo dilo y te lo pongo. no comprendo por qué de este error :S
  #6 (permalink)  
Antiguo 03/04/2013, 17:07
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: problema al recorrer array con for

Antes del bucle coloca:

Código PHP:
Ver original
  1. echo '<pre>';
  2. print_r($plazas);
  3. echo '</pre>';

y copia aquí el contenido. Así sabremos que estructura tiene el array y como debes recorrerlo.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #7 (permalink)  
Antiguo 03/04/2013, 17:14
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

Cita:
Iniciado por andresdzphp Ver Mensaje
Antes del bucle coloca:

Código PHP:
Ver original
  1. echo '<pre>';
  2. print_r($plazas);
  3. echo '</pre>';

y copia aquí el contenido. Así sabremos que estructura tiene el array y como debes recorrerlo.

Saludos.
me devuelve esto

Código PHP:
Ver original
  1. (
  2.     [0] => 100
  3. )
  #8 (permalink)  
Antiguo 03/04/2013, 17:16
 
Fecha de Ingreso: abril-2013
Ubicación: Sevilla
Mensajes: 23
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al recorrer array con for

andresdzphp tiene razon has olvidado el indice y por lo tanto haces referencia al array que contiene todos, el mismo que cuentas en el for.

De todas formas si lo que quieres es averiguar el nº correspondiente de habitaciones con respecto a un usuario, debes cruzar las tablas en la consulta, normalmente mediante un id (en este caso debe haber un id usuario en cada registro de habitaciones).

$consulta = "SELECT DISTINCT u.usuario, h." . $this->tipo_habita . " as total FROM usuarios u, habitaciones h WHERE u.usuario='" . $this->usuario . "' AND u.id_usuario = h.id_usuario";

Esto obtendra un campo "usuario" y uno "total" que tiene el valor del tipo de habitacion obtenido segun el post. Como ves se relaciona por el id_usuario, campo que he supuesto, deberas poner el que tu tengas en tu codigo. El distinct limpia el resultado de la consulta de elementos coincidentes.
Te recomiendo ejecutes las sentencias en el phpmyadmin y veas los distintos resultados.

O eso o no te he entendido bien...
  #9 (permalink)  
Antiguo 03/04/2013, 17:24
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

Cita:
Iniciado por Sevillacode Ver Mensaje
andresdzphp tiene razon has olvidado el indice y por lo tanto haces referencia al array que contiene todos, el mismo que cuentas en el for.

De todas formas si lo que quieres es averiguar el nº correspondiente de habitaciones con respecto a un usuario, debes cruzar las tablas en la consulta, normalmente mediante un id (en este caso debe haber un id usuario en cada registro de habitaciones).

$consulta = "SELECT DISTINCT u.usuario, h." . $this->tipo_habita . " as total FROM usuarios u, habitaciones h WHERE u.usuario='" . $this->usuario . "' AND u.id_usuario = h.id_usuario";

Esto obtendra un campo "usuario" y uno "total" que tiene el valor del tipo de habitacion obtenido segun el post. Como ves se relaciona por el id_usuario, campo que he supuesto, deberas poner el que tu tengas en tu codigo. El distinct limpia el resultado de la consulta de elementos coincidentes.
Te recomiendo ejecutes las sentencias en el phpmyadmin y veas los distintos resultados.

O eso o no te he entendido bien...
tienes razón, soy un desastre lo siento, por querer correr no relacioné las tablas en la consulta, sí las tenía relacionadas en la propia base de datos.

la consulta ha quedado así

Código PHP:
Ver original
  1. $consulta = "SELECT usuario, " . $this->tipo_habita . " FROM usuarios, habitaciones WHERE (usuario='" . $this->usuario . "' AND usuarios.id=id_usuarios)";
  2.  
  3. //usuarios.id está en la tabla usuarios como campo id
  4. //id_usuarios está en la tabla habitaciones como campo id_usuarios
  5. //tanto clave primaria como foránea están ya relacionadas con el diseñador de //phpmyadmin

pero me sigue devolviendo el mismo error :S

perdón por todo este jaleo, pero llevo dos días estancado en esto y no logro resolverlo
  #10 (permalink)  
Antiguo 03/04/2013, 17:45
 
Fecha de Ingreso: abril-2013
Ubicación: Sevilla
Mensajes: 23
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al recorrer array con for

prueba a poner la consulta que te especifico. He adaptado los campos que inventé por lo que debe ser completamente valida

$consulta = "SELECT DISTINCT u.usuario, h." . $this->tipo_habita . " as total FROM usuarios u, habitaciones h WHERE u.usuario='" . $this->usuario . "' AND u.id = h.id_usuarios";

El problema que sigo viendo es que no especificas en que tabla esta cada campo, en mi consulta si te fijas estan todos especificados, solo que en lugar del nombre completo de la tabla (usuarios) le he asignado un alias por comodidad (u)
u.id es lo mismo que usuarios.id, h.id_usuarios es lo mismo que habitaciones.id_usuarios

si ejecutas la sentencia que te he puesto, y los campos coinciden con lo especificado, al montar un array asociativo debes obtener algo como esto
array{
['usuario'] = 'xxxxx'; (el usuario)
['total'] = xxxx; (la cantidad correspondiente a esa habitacion y ese usuario)
}

suerte
  #11 (permalink)  
Antiguo 03/04/2013, 18:07
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

Cita:
Iniciado por Sevillacode Ver Mensaje
prueba a poner la consulta que te especifico. He adaptado los campos que inventé por lo que debe ser completamente valida

$consulta = "SELECT DISTINCT u.usuario, h." . $this->tipo_habita . " as total FROM usuarios u, habitaciones h WHERE u.usuario='" . $this->usuario . "' AND u.id = h.id_usuarios";
tu consulta sí me funciona, y el print_r me devolvía bien el array.
Cita:
El problema que sigo viendo es que no especificas en que tabla esta cada campo, en mi consulta si te fijas estan todos especificados, solo que en lugar del nombre completo de la tabla (usuarios) le he asignado un alias por comodidad (u)
u.id es lo mismo que usuarios.id, h.id_usuarios es lo mismo que habitaciones.id_usuarios
no entiendo bien lo que dices.

cuando hago la consulta le digo que seleccione usuario y $this->tipo_habita de usuarios y habitaciones donde usuario es $this->usuario y relaciono las tablas usuarios.id=id_usuarios

la única diferencia con la consulta que me sugieres es que tú utilizas alias, nunca he utilizado alias y no se si es por eso mi problema

Cita:
si ejecutas la sentencia que te he puesto, y los campos coinciden con lo especificado, al montar un array asociativo debes obtener algo como esto
array{
['usuario'] = 'xxxxx'; (el usuario)
['total'] = xxxx; (la cantidad correspondiente a esa habitacion y ese usuario)
}

suerte
efectivamente me ha devuelto el array correctamente. el problema estaba en otra parte. gracias a ti lo encontré.

en clases.php

Código PHP:
Ver original
  1. while ($fila = mysql_fetch_array($result_conexion))
  2.         {
  3.             $this->resultado_consulta[] = $fila; //aquí estaba el problema
  4.         }
  5.         return $this->resultado_consulta;
  6.  
  7. //estaba diciendole que solo igualara  resultado_consulta a fila[$this->tipo_habita]; claro, el error creo que al intentar recorrerlo como array me devolvía error ¿estoy en lo cierto?

en index.php

Código PHP:
Ver original
  1. for ($i = 0, $size = count($plazas); $i < $size; $i++)
  2.         {
  3.             echo $plazas[$i][$_POST['habitaciones']]; //aquí he recorrido el array con un id=$i y también he seleccionado del array el valor del tipo de habitación; me ha funcionado
  4.         }

no se si así estará bien, porque aunque el código funcione no significa que esté bien escrito y estructurado.

estoy abierto a todo consejo y crítica, cuanto más pueda aprender mejor jeje

mil gracias por tu ayuda de verdad
  #12 (permalink)  
Antiguo 03/04/2013, 18:27
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: problema al recorrer array con for

Yo te recomendaría que revises tu método de conexión, no está bien eso de conectarse por cada query que hagas y es mejor que uses mysqli o PDO ya que mysql quedará obsoleta desde PHP 5.5.0
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #13 (permalink)  
Antiguo 03/04/2013, 18:40
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

Cita:
Iniciado por andresdzphp Ver Mensaje
Yo te recomendaría que revises tu método de conexión, no está bien eso de conectarse por cada query que hagas y es mejor que uses mysqli o PDO ya que mysql quedará obsoleta desde PHP 5.5.0
no sé a qué te refieres cuando dices que no está bien que conecte por cada query.

¿no tengo que conectar a la base de datos cada vez que haga una acción que lo requiera, es eso?

revisaré mysqli y PDO :P

si quieres te escribo por privado y continuamos esta conversación para no engordar el hilo. gracias de nuevo! :D
  #14 (permalink)  
Antiguo 03/04/2013, 19:02
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: problema al recorrer array con for

Cada query que hagas estás conectando a mysql:

Código PHP:
Ver original
  1. class Conectar
  2. {
  3.  
  4.     public static function conexion($TextoSQL)
  5.     {
  6.         $IDConexion = mysql_connect("localhost", "root", "");
  7.  
  8.         mysql_select_db("hoteles", $IDConexion);
  9.  
  10.         $IDConsulta = mysql_query($TextoSQL, $IDConexion) or die(mysql_error());
  11.  
  12.         if ($IDConsulta == false)
  13.         {
  14.             echo "ERROR: <br>\n";
  15.             echo mysql_error($IDConexion);
  16.         }
  17.  
  18.         return $IDConsulta;
  19.     }
  20.  
  21. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #15 (permalink)  
Antiguo 04/04/2013, 00:37
 
Fecha de Ingreso: abril-2013
Ubicación: Sevilla
Mensajes: 23
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al recorrer array con for

andresdzphp te dice y coincido, que realices el constructor de conexion por un lado y una funcion query por otro, asi se crea una instancia de la conexion y se usa para todas las consultas.
Lo que tu tienes conecta siempre otra vez por cada consulta que haces.

y lo que no llegas a entender es precisamente lo que estas diciendome, en las consultas donde hay mas de una tabla, es necesario (si no conveniente, yo siempre lo hago) especificar a que tabla pertenece cada campo que vas a usar, creo que es la manera correcta.
Si mi consulta te funciona y la tuya no, tiene que ser por eso...

saludos
  #16 (permalink)  
Antiguo 04/04/2013, 05:18
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 4 meses
Puntos: 84
Respuesta: problema al recorrer array con for

si bien he entendido, lo que me sugerís es que realice un query genérico en forma de clase pasándole los valores al constructor y así no repetir querys no?
  #17 (permalink)  
Antiguo 04/04/2013, 17:16
 
Fecha de Ingreso: abril-2013
Ubicación: Sevilla
Mensajes: 23
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: problema al recorrer array con for

exacto, una funcion constructora de la conexion y otra query que realiza la consulta

Etiquetas: mysql, select, sql, usuarios, 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 01:33.