Ir al contenido


Foto

problema con mysql_fetch_array();


  • Por favor identifícate para responder
11 respuestas en este tema

#1 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 06 mayo 2013 - 03:21

tengo 3 documentos .php: blog_index.php, funciones.php y clases.php.

el primero es el que el usuario visita.

el segundo es donde construyo la web.

el tercero es donde están escritos los objetos necesarios para la web.

en la portada de la web muestro los mensajes escritos por el administrador y los muestro con una función que genera un <a href> dinámico para cada mensaje, el cual el usuario al pulsarlo le carga el mensaje completo.

el siguiente código, sencillo, es el que genera todo lo anterior, se encuentra en funciones.php


if(isset($_GET["leer_post"])) //si existe $_GET["leer_post hace lo siguiente"]
{
//instancia hacia la clase Posts, método leer_post cuyo parámetro es $_GET["leer_post"]
$muestra_post= new Posts();
$muestra_post=$muestra_post->leer_post($_GET["leer_post"]);
//for para recorrer el array retornado en el método leer_post();
for($i=0; $i<sizeof($muestra_post); $i++)
{

if($_GET["leer_post"]==$muestra_post[$i]["id"]) //si $_GET["leer_post"] es igual al id de la noticia entonces muestra todos los valores
{
echo $muestra_post[$i]["titulo"] ." ". $muestra_post[$i]["post"] ." ". $muestra_post[$i]["id_usuarios"] ." ". $muestra_post[$i]["fecha"]  ;
}
else
{
echo "No hay post que mostrar"; //sino devuelve un mensaje de error
}
}

}



public function leer_post($ide)
{
$consulta="SELECT * from posts where id='".$ide."'";
$result_conexion=Conectar::CONNECT($consulta);
echo 'TOTAL=' . mysql_num_rows($result_conexion); //esto devuelve TOTAL=1
while($resultado=mysql_fetch_array($result_conexion));
{
$this->result2[]=$resultado;
var_dump($resultado); //aquí está el problema, $resultado no guarda nada en $this->result2[]; este vardump(); devuelve bool(false)
}
return $this->result2;
}


he buscado ayuda en otro foro pero la persona que me ha ayudado no ha podido resolver este problema.

no entiendo por qué si todo está bien escrito y por qué si la tabla sí contiene post (los he escrito y revisado) $resultado llega con valor false.

aquí está el post en el que busqué ayuda previamente, por si sirviera de algohttp://www.forosdelw...pierde-1050160/

también he buscado información sobre ese false por la red pero no he encontrado nada que me sirviera para saber el por qué de este problema.

¿alguien puede ayudarme porfavor?

muchas gracias :D
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 06 mayo 2013 - 03:35

Cambia mysql_fetch_array() por mysql_fetch_assoc(), y en la clase donde muestras los posts utiliza foreach{} para recorrer el array.

Saludos.
  • 0

#3 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 07 mayo 2013 - 01:27

he seguido tus recomendaciones pero me sigue emitiendo bool(false)


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 mayo 2013 - 05:37

Sigue mis recomendaciones y comenta el var_dump().

Saludos.
  • 0

#5 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 07 mayo 2013 - 07:30

siguiendo tus recomendaciones el código queda de la siguiente manera

funciones.php

if(isset($_GET["leer_post"])) //si existe $_GET["leer_post hace lo siguiente"]
{
//instancia hacia la clase Posts, método leer_post cuyo parámetro es $_GET["leer_post"]
$muestra_post= new Posts();
$muestra_post=$muestra_post->leer_post($_GET["leer_post"]);
//for para recorrer el array retornado en el método leer_post();

/*for($i=0; $i<sizeof($muestra_post); $i++) antiguo for ahora comentado*/

foreach($muestra_post as $v)//nuevo foreach según recomendación de enecumene
{

if($_GET["leer_post"]==$v["id"]) //si $_GET["leer_post"] es igual al id de la noticia entonces muestra todos los valores
{
echo $v["titulo"] ." ". $v["post"] ." ". $v["id_usuarios"] ." ". $v["fecha"]  ;
}
else
{
echo "No hay post que mostrar"; //sino devuelve un mensaje de error
}
}


clases.php

class Posts
{
private $result=array();
private $result2=array();

public function consulta_post()
{
$consulta="SELECT * from posts ORDER BY id ASC LIMIT 10";
$result_conexion=Conectar::CONNECT($consulta);
while($resultado=mysql_fetch_array($result_conexion))
{
$this->result[]=$resultado;
}
return $this->result;
}
public function leer_post($ide)
{
$consulta="SELECT * from posts where id='".$ide."'";
$result_conexion=Conectar::CONNECT($consulta);
/*echo 'TOTAL=' . mysql_num_rows($result_conexion) ." |";
print_r($consulta);*/
while($resultado=mysql_fetch_assoc($result_conexion));
{
$this->result2[]=$resultado;
var_dump($resultado);
}
return $this->result2;
}
        }


el var_dump(); del método leer_post(); en la clase Posts me devuelve

bool(false)


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 mayo 2013 - 08:59

Eso quiere decir que el array está vacío, o sea, no recibe ningún dato, vamos por pasos:

1) imprime el valor de $_GET["leer_post"] a ver si devuelve algo.
2) Si devuelve algo el anterior punto, es recomendable hacer un cast: $idpost = (int) $_GET["leer_post"], así siempre debe ser un número entero.
3) Cambia el nombre de la variable $muestra_post, no debe ser igual al objeto que creaste.
4) Imprime la variable donde almacenas el array, en este caso $muestra_post (ver punto anterior): print_r($muestra_post).

Haz esos pasos para descartar que el problema ande por ahí.

Saludos.
  • 0

#7 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 07 mayo 2013 - 09:17

Eso quiere decir que el array está vacío, o sea, no recibe ningún dato, vamos por pasos:

1) imprime el valor de $_GET["leer_post"] a ver si devuelve algo.
2) Si devuelve algo el anterior punto, es recomendable hacer un cast: $idpost = (int) $_GET["leer_post"], así siempre debe ser un número entero.
3) Cambia el nombre de la variable $muestra_post, no debe ser igual al objeto que creaste.
4) Imprime la variable donde almacenas el array, en este caso $muestra_post (ver punto anterior): print_r($muestra_post).

Haz esos pasos para descartar que el problema ande por ahí.

Saludos.


$_GET["leer_post"] devuelve el valor del id de cada post (establecido en la tabla como número entero), eso contiene valor y por lo tanto funciona correctamente.

el punto 2 no lo entendí. pero $_GET["leer_post"] siempre contendrá un número entero y no hay posibilidad remota de que contenga otro valor porque así está creada la tabla, es una clave única tipo int.

en el punto tres te hice caso, ahora en vez de $muestra_post; se llama simplemente $post;

print_r($post); devuelve Array ( [0] => ) por eso concluí que el error tiene origen en el método, pero no logro ver el qué, la BD está correcta, la lectura también, y el return también, pero no entiendo por qué cuando extraigo un dato con ese método no funciona y por qué con otro método sí extrae datos de esa tabla. algo pasa en ese método y no sé qué es :s la asignación a $result2 es bool(false)
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 mayo 2013 - 09:24

Pues el punto 2 es sólo una medida de seguridad, así evitamos también errores de tipos, de todos modos elimina los corchetes en:

$this->result2[]=$resultado


Dejalo así:

$this->result2 = $resultado


Ya que previamente declaras esa variable como array, así que no hay que definirla dos veces.

Saludos.
  • 0

#9 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 07 mayo 2013 - 09:34

Pues el punto 2 es sólo una medida de seguridad, así evitamos también errores de tipos, de todos modos elimina los corchetes en:

$this->result2[]=$resultado


Dejalo así:

$this->result2 = $resultado


Ya que previamente declaras esa variable como array, así que no hay que definirla dos veces.

Saludos.


gracias, lo he hecho pero ahora me además de bool(false) me devuelve el siguiente error

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\xampp\web\poo\funciones.php on line 337


esa línea contiene el foreach();

qué más puedo hacer?

te escribí un privado, no se si te llegó
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 mayo 2013 - 09:58

Por úlitmo prueba lo siguiente:

settype($this->result2, "array");
$this->result2 = $resultado;


Saludos.
  • 0

#11 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 07 mayo 2013 - 10:29

Por úlitmo prueba lo siguiente:

settype($this->result2, "array");
$this->result2 = $resultado;


Saludos.


muchas gracias, pero el problema persiste, de verdad muchas gracias por intentar ayudarme. no conozco más sitios donde poder acudir, ¿conoces algún otro foro donde pueda plantear esta cuestión? o si puedes seguir ayudándome pues encantado :p :D
  • 0

#12 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 07 mayo 2013 - 02:11

encontré el problema.

después de sustituir el método por otro nuevamente escrito y quedando exactamente igual vi que funcionaba. así volví a poner ese método y lo comparé con el que sí funcionaba.

¿resultado de todo el análisis?

al final el while hay un maldito y puñetero ';' que no vi.

lo siento por las molestias. gracias por la ayuda ofrecida.

(cada vez mis errores son más sutiles y tontos :s)
  • 0




IP.Board spam blocked by CleanTalk.