Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] mysql_fetch_row cuelga script sin mensaje de error

Estas en el tema de mysql_fetch_row cuelga script sin mensaje de error en el foro de PHP en Foros del Web. Buenas, tengo un problema que me está volviendo loco porque por ams que busco no veo el fallo. tengo un script en php que ejecuto ...
  #1 (permalink)  
Antiguo 08/04/2014, 14:41
 
Fecha de Ingreso: septiembre-2013
Mensajes: 11
Antigüedad: 10 años, 7 meses
Puntos: 0
mysql_fetch_row cuelga script sin mensaje de error

Buenas, tengo un problema que me está volviendo loco porque por ams que busco no veo el fallo.

tengo un script en php que ejecuto desde la consola (desde el navegador obtengo el mismo resultado). El script en cuestión tiene un while(true) para que se ejecute continuamente, está hecho así adrede ya que es necesario, el script se que funciona bien porque lo he probado otras veces y nunca ha dado error, hasta hace un par de días que añadí el siguiente código, que al ejecutarlo(si no se da el caso y no lo ejecuta no se cuelga) simplemente detiene el script y no devuelve ningún tipo de mensaje de error

Código PHP:
//consulto las existencias de naves del planeta
        
echo 'SELECT * FROM existencias_naves WHERE planetaactual=\''.$mov_pend["planetadestino"].'\'';
        
$query_datos_exploracion3 mysql_query('SELECT * FROM existencias_naves WHERE planetaactual=\''.$mov_pend["planetadestino"].'\'') or die(mysql_error());
                echo 
$query_datos_exploracion3;
        
$datos_exploracion3 mysql_fetch_array($query_datos_exploracion3) or die(mysql_error());
                echo 
"ejecuto fetch3"
y la salida que obtengo por terminal es la siguiente:

SELECT * FROM existencias_naves WHERE planetaactual='285'Resource id #11root@node29:/var/www#

La misma que si lo ejecuto en el navegador, supongo que el fallo está en la función mysql_fetch_row ya que el script se detiene ahí y no llega a mostrar el siguiente echo.

Primero pensé que podría ser porque la tabla estaba vacía, pero le he añadido una entrada y el resultado es el mismo, también he probado a copiar y pegar la consulta sql en phpmyadmin y funciona perfectamente sin errores así que no creo que sea la sintaxis que esté mal...

Alguien tiene alguna idea? o podría darme alguna pista para ver por lo menos el error y poder buscar en google... porque esto no se por donde cogerlo
  #2 (permalink)  
Antiguo 08/04/2014, 15:09
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: mysql_fetch_row cuelga script sin mensaje de error

Muchas veces el problema no está precisamente donde se detiene el código, de hecho, no parece haber algo malo con esa consulta.

Ya que mencionas que tienes un while, puedo suponer que:
a) Se agota el tiempo de espera
b) Estás consumiendo toda la memoria disponible para el script

Sin ver más código será difícil tratar de ayudar.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 08/04/2014, 15:19
 
Fecha de Ingreso: septiembre-2013
Mensajes: 11
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: mysql_fetch_row cuelga script sin mensaje de error

Gracias por responder,

Lo primero no creo que sea, el script antes de esta modificación funcionaba perfectamente, nunca se colgaba y lo dejé funcionando horas, de todas formas.. ¿hay alguna forma de saber si es por esto?

la segunda opción.. ¿como puedo descartarla?

No me deja pegar todo el código... el mensaje resultante es demasiado largo... les pego todo el "código nuevo", está todo dentro de un if y el problema lo da exclusivamente al entrar en ese if, si no se cumple la condición el bucle se ejecuta sin problemas

Código PHP:
if($mov_pend["tipo"] == && $mov_pend["horavuelta"] == NULL){
        echo 
"ejecuto if1";
        
//consulto el nombre del planeta y su dueño
        
$query_datos_exploracion1 mysql_query('SELECT nombre, dueno FROM mapa WHERE id=\''.$mov_pend["planetadestino"].'\'') or die(mysql_error());
        
$datos_exploracion1 mysql_fetch_row($query_datos_exploracion1) or die(mysql_error());
        
//consulto las existencias de tropas del planeta
        
$query_datos_exploracion2 mysql_query('SELECT * FROM existencias_tropas WHERE planetaactual=\''.$mov_pend["planetadestino"].'\'') or die(mysql_error());
        
$datos_exploracion2 mysql_fetch_row($query_datos_exploracion2) or die(mysql_error());
        
//consulto las existencias de naves del planeta
        
echo 'SELECT * FROM existencias_naves WHERE planetaactual=\''.$mov_pend["planetadestino"].'\'';
        
$query_datos_exploracion3 mysql_query('SELECT * FROM existencias_naves WHERE planetaactual=\''.$mov_pend["planetadestino"].'\'') or die(mysql_error());
                echo 
$query_datos_exploracion3;
        
$datos_exploracion3 mysql_fetch_array($query_datos_exploracion3) or die(mysql_error());
                echo 
"ejecuto fetch3";
        
//consulto las existencias de defensas del planeta
        
$query_datos_exploracion4 mysql_query('SELECT * FROM existencias_defensas WHERE planetaactual=\''.$mov_pend["planetadestino"].'\'') or die(mysql_error());
        
$datos_exploracion4 mysql_fetch_row($query_datos_exploracion4) or die(mysql_error());
        
//consulto los movimientos pendientes para ver si ha llegado algún despliegue(de momento solo despliegue de tropas, falta despliegues de naves)
        
$query_datos_exploracion5 mysql_query('SELECT * FROM mov_pend WHERE planetadestino=\''.$mov_pend["planetadestino"].'\' AND cancelado=\'0\' AND horallegada<=\''.time().'\' AND tipo=\'1\'') or die(mysql_error());
        
$datos_exploracion5 mysql_fetch_row($query_datos_exploracion5) or die(mysql_error());
        echo 
"antes de mensaje";
        
//proceso los datos
        
$mensaje"Nombre del Planeta:".$datos_exploracion1[0]."    Dueño:".$datos_exploracion1[1]."<br>";
        echo 
"antes de los if";
        
//proceso las tropasls
        
if($datos_exploracion2[0] != NULL){
            echo 
"ejecuto if2";
            
$mensaje $mensaje."TROPAS:<br>";
            
$columnas array_keys($datos_exploracion2);
            
// ATENCION: cambiar este for si se cambia el numero de entradas de la base de datos(esto hay que mejorarlo)
            
for($i 3$i <= 20 ;$i++){
                if(
$datos_exploracion2[$i] != NULL){
                    
$mensaje $mensaje.$columnas[($i*2)+1]."=".$datos_exploracion2[$i]."<br>";
                }
            }
            
        }
        
//proceso las naves
            
if($datos_exploracion3[0] != NULL){
            
$mensaje $mensaje."NAVES:<br>";
            
$columnas array_keys($datos_exploracion3);
            
// ATENCION: cambiar este for si se cambia el numero de entradas de la base de datos(esto hay que mejorarlo)
            
for($i 3$i <= 24 ;$i++){
                if(
$datos_exploracion3[$i] != NULL){
                    
$mensaje $mensaje.$columnas[($i*2)+1]."=".$datos_exploracion3[$i]."<br>";
                }
            }
        }
        
//proceso las defensas
            
if($datos_exploracion4[0] != NULL){
            
$mensaje $mensaje."DEFENSAS:<br>";
            
$columnas array_keys($datos_exploracion4);
            
// ATENCION: cambiar este for si se cambia el numero de entradas de la base de datos(esto hay que mejorarlo)
            
for($i 3$i <= 14 ;$i++){
                if(
$datos_exploracion4[$i] != NULL){
                    
$mensaje $mensaje.$columnas[($i*2)+1]."=".$datos_exploracion4[$i]."<br>";
                }
            }
        }
        echo 
"preparo envio mensaje";
        
//envio el mensaje
        
mysql_query('INSERT INTO mensajes (de, para, hora, asunto, mensaje) VALUES (\'Sistema\',\''.$mov_pend["jugador"].'\', \''.time().'\', \'Exploración de:'.$datos_exploracion1[0].'\', \''.$mensaje.'\')') or die(mysql_error());
        echo 
"envio mensaje";
        
        
//pongo a las tropas exploradoras de vuelta(60 segundos fijos porque todas las tropas tardan eso)
        
mysql_query('UPDATE mov_pend SET horavuelta=\''.(time() + 60).'\'') or die(mysql_error());
        continue;
        
    } 
EDIT: he googleado un poco y usando este código:

Código PHP:
echo memory_get_usage()."/";
    echo 
memory_get_peak_usage(); 
al principio del primer if y justo antes del error, obtengo estos resultados:
1317128/319368


321688/323800

Lo del tiempo de espera.. segun la web oficial de php, al ser por consola no hay límite (en web si que lo hay, de 30 segundos)

Última edición por Daklon_15; 08/04/2014 a las 16:55
  #4 (permalink)  
Antiguo 08/04/2014, 17:11
 
Fecha de Ingreso: septiembre-2013
Mensajes: 11
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: mysql_fetch_row cuelga script sin mensaje de error

Pongo una respuesta nueva porque si no es un lio.

He descubierto algo... curioso... he probado a meter en la bd, no solo una entrada, sino la entrada exacta que busca el script y en ese caso, no se cuelga donde siempre, sino en la siguiente consulta en la que mysql_query devuelve que no hay resultados para esa consulta, así que creo que el problema tiene que ver con eso... que hago una consulta, mysql_query devuelve 0 columnas y al intentar hacer un mysql_fetch_row el script se cuelga...

Pero.. ¿no se supone que mysql_fetch_row está preparado para este tipo de situaciones? Se me ocurre comprobar primero si devuelve 0 columnas antes de hacer el fetch_row... pero eso no se puede hacer sin antes haber pasado por esa funcion el resultado de la query no?
  #5 (permalink)  
Antiguo 08/04/2014, 17:16
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: mysql_fetch_row cuelga script sin mensaje de error

No cero columnas, sino cero filas y puedes usar mysql_num_rows() para verificar si se encontraron resultados.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 08/04/2014, 19:49
 
Fecha de Ingreso: septiembre-2013
Mensajes: 11
Antigüedad: 10 años, 7 meses
Puntos: 0
Respuesta: mysql_fetch_row cuelga script sin mensaje de error

Muchas gracias por tu ayuda, he solucionado el problema añadiendo este código en cada llamada a mysql_fetch_row

Código PHP:
if(mysql_num_rows($query_datos_exploracion3) >0){
            
$datos_exploracion3 mysql_fetch_row($query_datos_exploracion3) or die(mysql_error());
        } 
  #7 (permalink)  
Antiguo 08/04/2014, 23:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: mysql_fetch_row cuelga script sin mensaje de error

El problema que tenías es algo simple, mysql_fetch_row te devuelve la fila pero en caso de que no haya filas, regresa false, al tu usar el or die() lo que haces es que si mysql_fetch_row si devuelve false, se vaya al or die() pero como no hay error, por eso es que el programa se para sin ningún error.

Etiquetas: mysql
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 07:29.