Foros del Web » Programando para Internet » PHP »

Problemas con WHILE

Estas en el tema de Problemas con WHILE en el foro de PHP en Foros del Web. Luego de pensar, leer y releer que esta pasando con este código, no logro llegar a nada. Así que acudo a ustedes para que den ...
  #1 (permalink)  
Antiguo 08/04/2009, 22:25
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 1 mes
Puntos: 0
Problemas con WHILE

Luego de pensar, leer y releer que esta pasando con este código, no logro llegar a nada.

Así que acudo a ustedes para que den una luz a la oscuridad donde estoy.

Me propuse aprender PHP, MySQL y a golpes he logrado avanzar un poco. Comencé un pequeño sistema de noticias y lo he venido modificando y jugando con él.

Ahora estoy en un lío que no entiendo y por eso pido su ayuda.

Tengo este código para listar noticias:

Código PHP:
<?php
    $_bd_
->_sql_consulta("SELECT * FROM ".prefijo."noticias ORDER BY fecha_publicacion""simple");
?>

<table border="1" width="90%">
<tr>
<td width="15%"><h3>ID</h3></td>
<td width="40%"><h3>Título</h3></td>
<td width="15%"><h3>Categoría</h3></td>
<td width="30%"><h3>Fecha</h3></td>
</tr>
<?php
    
while($fila $_bd_->_sql_fetch_array())
    {
?>

<tr>
    <td><?php echo $fila["id"?></td>
    <td><?php echo $fila["titulo"?></td>
    <td>---</td>
    <td><?php echo $fila["fecha_publicacion"?></td>
</tr>
<?php
    
}
?>
</table>
Que me produce el siguiente listado:

nestorovallos.com/forosdelweb/listado0.jpg


Hasta aquí todo bien el problema comienza cuando ingreso este while :

Código PHP:
<?php
    
while($fila $_bd_->_sql_fetch_array())
    {
?>

<tr>
    <td><?php echo $fila["id"?></td>
    <td><?php echo $fila["titulo"?></td>
    <td><?php 
    $_bd_
->_sql_consulta("SELECT c.id AS cid, c.nombre AS categoria, c.descripcion AS descripcion FROM ".prefijo."categorias c INNER JOIN ".prefijo."not_cat cn ON cn.id_categoria = c.id WHERE cn.id_noticia = ".$fila["id"]." ORDER BY c.nombre ASC""simple"); 
    
        while (
$cat $_bd_->_sql_fetch_array())
        {
            echo 
'<a href="#" title="'.$cat["categoria"].'">'.$cat["categoria"].'</a> <br> ';
        } 
        
?></td>
    <td><?php echo $fila["fecha_publicacion"?></td>
</tr>
<?php
    
}
?>
Es una nueva consulta para listar la categoría o categorías a las que se relaciona la noticia. Produce esto:

nestorovallos.com/forosdelweb/listado1.jpg

Aquí comienza mi problema ya que no continúa el listado sólo lista la primera noticia.

Si intento algo (por prueba) como este código:

Código PHP:
</tr>
<?php
    
while($fila $_bd_->_sql_fetch_array())
    {
?>

<tr>
    <td><?php echo $fila["id"?></td>
    <td><?php echo $fila["titulo"?></td>
    <td><?php 
        $a 
;
        while (
$a<3)
        {
            echo 
" - 1<br>";
            ++ 
$a;
        }
        
?></td>
    <td><?php echo $fila["fecha_publicacion"?></td>
</tr>
<?php
    
}
?>
Produce esto:
nestorovallos.com/forosdelweb/listado3.jpg


En otras palabras (parecerá algo tonto, pero recuerden que estoy aprendiendo) con este while logro ver que se cumple y sigue el listado. Y me dice que el problemas puede estar (creo yo) en el while donde tengo la consulta de categorias. Y pues en definitiva no lo veo.
AYUDA ¿Por qué no continúa el listado?
Gracias de antemano por tomarse la molestia de leer quizá tan larga e innecesaria explicación pero no encuentro otra manera de explicarme mejor.
P.D. Agradezco igualmente su ayuda.
  #2 (permalink)  
Antiguo 08/04/2009, 22:35
Avatar de pacmanaman  
Fecha de Ingreso: marzo-2009
Mensajes: 84
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Problemas con WHILE

Tendrias que asociar el resultado de cada una de las consultas con su respectivo _sql_fecht_array(resultadoquery1)

y sino es eso proba con

poniendo la segunda consulta fuera del primer while y despues dentro del segundo while pone un if que haga lo siguiente
if( cat['id_noticia'] == fila['id'])
echo ....

Aunque me inclino por la primera, habria que ver que haces en _sql_consulta, me imagino que es ...

public function _sql_consulta($cadena)
{
return mysql_query($cadena,$conexion)
}
__________________
(<++

Última edición por pacmanaman; 08/04/2009 a las 22:42
  #3 (permalink)  
Antiguo 08/04/2009, 22:58
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Problemas con WHILE

Cita:
Iniciado por pacmanaman Ver Mensaje
Tendrias que asociar el resultado de cada una de las consultas con su respectivo _sql_fecht_array(resultadoquery1)
Cre que refires a algo como esto en el while interno:

Código PHP:
<?php
    $cadena 
$_bd_->_sql_consulta("SELECT c.id AS cid, c.nombre AS categoria, c.descripcion AS descripcion FROM ".prefijo."categorias c INNER JOIN ".prefijo."not_cat cn ON cn.id_categoria = c.id WHERE cn.id_noticia = ".$fila["id"]." ORDER BY c.nombre ASC""simple");
    
    while (
$cat $_bd_->_sql_fetch_array($cadena))
    {
    echo 
'<a href="#" title="'.$cat["categoria"].'">'.$cat["categoria"].'</a> <br> ';
    }
?>
El resultado es el mismo: sólo lista ina noticia.


Cita:
Iniciado por pacmanaman Ver Mensaje
Aunque me inclino por la primera, habria que ver que haces en _sql_consulta, me imagino que es ...
lo que hago en _sql_consulta es esto:
aquí la clase base de datos que estoy usando.

Código PHP:
<?php

class Basededatos 
{    
    var 
$conexion_bd;
    var 
$msj_alerta false;
    var 
$esta_consulta false;

    function 
conexion_bd($bdservidor NULL$bdusuario NULL$bdclave NULL$bdnombre NULL
    {
        
$this->conexion_bd mysql_connect($bdservidor$bdusuario$bdclave) or $this->_sql_errormysql_error() );
        
mysql_select_db($bdnombre$this->conexion_bd) or $this->_sql_errormysql_error() );
    }    

    function 
_sql_error($errormsj NULL
    {
        global 
$_msj_;

        
$_msj_->msj("Error en los procesos MySQL ".$errormsj"advertencia");
    }

    function 
_sql_consulta($consulta NULL$tipo NULL
    {
        if(!empty(
$consulta)) 
        {
            if(!empty(
$tipo) && $tipo == "simple"
            {
                unset(
$this->esta_consulta);

                
$this->esta_consulta mysql_query($consulta$this->conexion_bd) or $this->_sql_errormysql_error() );
            }
            else
            {
                
$bd_consulta mysql_query($consulta$this->conexion_bd) or $this->_sql_errormysql_error() );

                return 
$bd_consulta;
            }
        }
    }
    
    
        function 
_sql_fetch_array($consulta NULL
    {
        if (!empty(
$consulta) ) 
        {
            return 
mysql_fetch_array($consulta); 
        }
        elseif(
$this->esta_consulta != false
        {
            return 
mysql_fetch_array($this->esta_consulta);
        }
    }

    function 
_sql_num_rows($consulta NULL
    {
        if (!empty(
$consulta) ) 
        {
            return 
mysql_num_rows($consulta); 
        }
        elseif(
$this->esta_consulta != false
        {
            return 
mysql_num_rows($this->esta_consulta);
        }
    }
}

?>
Gracias por responder.
Espero que con estos nuevos datos puedas orientarme mejor.
Mis limitados conocimientos no me dan para entender que tengo mal.

P.D. esta y otras clases que uso las conseguí travesando por la web.
  #4 (permalink)  
Antiguo 08/04/2009, 23:25
Avatar de pacmanaman  
Fecha de Ingreso: marzo-2009
Mensajes: 84
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Problemas con WHILE

Para mi es que sobreescribis $this->esta_consulta con la segunda query! y por eso itera una sola vez.

Es decir ...

$_bd_->_sql_consulta("SELECT ....

Recorres los datos generados de la consulta anterior con el while (como al no pasarle parametros a _sql_fecth_array, internamente vos ya estas tomando la consulta anterior )

Despues dentro del while, realizas otra consulta para listar articulo y hacer la comparación y nuevamente utilizas el ( while ) y a _sql_fecth_array() no le pasas parametros ya que internamente le pasas la consulta ( la de listar categorias ) y así pisando la variable interna de la clase nuevamente $this->esta_consulta y he aquí ( para mi ) el error, ya que vos sobreescribir $this->esta_consulta y cuando vuelve al primer while internamente el $this->esta_consulta sigue asociada a tu ultimo query
__________________
(<++

Última edición por pacmanaman; 08/04/2009 a las 23:36
  #5 (permalink)  
Antiguo 08/04/2009, 23:46
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Problemas con WHILE

Cita:
Iniciado por pacmanaman Ver Mensaje
Para mi es que sobreescribis $this->esta_consulta con la segunda query! y por eso itera una sola vez.
Pensando en eso modifique la clase agregando un _sql_consulta2 y un _sql_fetch_array2 y corre perfecto.

No se si es la forma más apropiada (por lo menos funciona) Si hay una mejor no duden en decirla.

Muchas gracias por tu ayuda pacmanaman . Hacia falta conversar con alguien que supiera y claro con paciencia . jejeje. Gracias nuevamente. Buen karma para ti.
  #6 (permalink)  
Antiguo 09/04/2009, 00:04
Avatar de pacmanaman  
Fecha de Ingreso: marzo-2009
Mensajes: 84
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Problemas con WHILE

No es nada NestorOC

Lo que podes hacer es pasarle a los _sql_fetch_array() que estan en sus respectivos while el resultado de tu consulta.

1º _sql_fecth_array($queryNoticias)
2º _sql_fecth_array($queryArticulos)

Y en vez de poner en _sql_consulta ...

$this->esta_consulta = mysql_query($consulta, $this->conexion_bd) or $this->_sql_error( mysql_error() );

poner

return mysql_query($consulta, $this->conexion_bd) or $this->_sql_error( mysql_error() );
__________________
(<++
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 23:30.