Foros del Web » Programando para Internet » PHP »

¿Por qué mi script sólo funciona cuando lo depuro?

Estas en el tema de ¿Por qué mi script sólo funciona cuando lo depuro? en el foro de PHP en Foros del Web. Hola a todos: Estoy usando Zend Studio 5 y Zend Platform 2.2.3 para desarrollar scripts en PHP 5 para un sistema que estoy desarrollando. Uno ...
  #1 (permalink)  
Antiguo 12/02/2008, 17:56
Avatar de daniloquispe  
Fecha de Ingreso: mayo-2007
Mensajes: 38
Antigüedad: 17 años
Puntos: 0
¿Por qué mi script sólo funciona cuando lo depuro?

Hola a todos:

Estoy usando Zend Studio 5 y Zend Platform 2.2.3 para desarrollar scripts en PHP 5 para un sistema que estoy desarrollando. Uno de estos scripts realiza una inserción en una base de datos MySQL después de validar los datos que ingreso en un formulario.

Bueno, cuando quiero probar mi script simplemente abro el formulario, meto unos datos de prueba y cuando le doy clic en Aceptar se invoca mediante AJAX a un script PHP que valida mos datos de mi formulario y, si todo es válido, los mete a la base de datos y muestra (también con AJAX) un mensaje de confirmación.

He aquí lo raro: Cada vez que intento probar este formulario y script desde mi navegador, el script se traba y no hace nada (no mete nada a la base de datos, ni menos muestra ningún mensaje de confirmación, ni tampoco envía ninguna respuesta de regreso al formulario); pero cuando lo corro paso a paso con Zend Studio el script, al que no le hago nigún cambio, corre perfectamente como si nada, valida e inserta correctamente y hace que en el formulario se muestre correctamente el mensaje de confirmación.

Por si acaso pongo acá el script:

Código PHP:
session_start();
$usuario_actual Usuario::getUsuarioEnSesion();

$errores = array();  // Aquí van los errores de validación

$fecha $_GET['fecha'];
if (
$fecha == "")
    
$errores[] = Tareo::ERROR_VAL_FECHA_NO;
else
{
    
$mysql ConexionBD::getInstancia(true);
    
$sql "SELECT COUNT(*) FROM " Tareo::NOMBRE_TABLA " WHERE fecha='$fecha'";
    
$rs $mysql->ejecutarSQL($sql);
    
$fila ConexionBD::desdoblar($rsConexionBD::RS_ENUMERADO);
    if (
$fila[0] > 0)
        
$errores[] = Tareo::ERROR_VAL_FECHA_REP;
}
$num_trab $_GET['numtrab'];

if (
count($errores) != 0)  // ¿Hay algún error de validación?
    
echo ObjetoConEstado::ESTADO_PLOMO ";" join(";"$errores);
else
{
    
$num_ok $num_ko 0;
    for (
$i 0$i $num_trab$i++)
    {
        
$nuevo_item = new Tareo($fecha$_GET["idtrab$i"], $_GET["idproyecto$i"]);
        
$nuevo_item->setNumHoras($_GET["hn$i"], $_GET["he25$i"], $_GET["he35$i"]);
        
// Este método hace la inserción en la base de datos
        
if ($nuevo_item->crear($usuario_actual->getID()))
            
$num_ok++;  // Se insertó bien
        
else
            
$num_ko++;  // No se pudo insertar
    
}
    echo 
ObjetoConEstado::ESTADO_VERDE ";$num_ok;$num_ko";

En pocas palabras el script funciona así: Desde el URL ($_GET) se recupera el contenido de los campos de mi formulario. El script luego valida uno a uno los campos, para verpor ejemplo si alguno que es obliatorio el usuario lo dejó en blanco. Cada vez que se encuentra un error de validación, el array $errores va acumulando una constante de error. Luego de terminar de validar, si el array $errores quedó vacío (o sea si el script no ha encontrado ningún error de validación) se procede (entre otras cosas) a llamar al método que inserta la información en la base de datos. Finalmente, el resultado de toda la acción (representada por constantes que referencian colores "rojo", "verde" o "plomo" según se haya posido o no guardar la información en la BD o haya habido algún error de validación) se devuelve al formulario.

¿A qué se debe esto? ¿Por qué un script funciona sólo cuando es depurado y no cuando se ejecuta normalmente?

Gracias
  #2 (permalink)  
Antiguo 13/02/2008, 09:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: ¿Por qué mi script sólo funciona cuando lo depuro?

Bueno a simple vista el problema puede ser porque Zend Studio usa otro php para hacer el debug paso a paso, no usa el servidor donde hagas la prueba.

Esto indica que puede que tengas problemas de configuración entre tu server de prueba y tu server de debug.

Te recomiendo bajar la extensión FireBug para FireFox para que hagas la prueba y veas el resultado de tu petición AJAX.

Saludos.
  #3 (permalink)  
Antiguo 13/02/2008, 11:42
Avatar de daniloquispe  
Fecha de Ingreso: mayo-2007
Mensajes: 38
Antigüedad: 17 años
Puntos: 0
Re: ¿Por qué mi script sólo funciona cuando lo depuro?

Cita:
Iniciado por GatorV Ver Mensaje
Bueno a simple vista el problema puede ser porque Zend Studio usa otro php para hacer el debug paso a paso, no usa el servidor donde hagas la prueba.

Esto indica que puede que tengas problemas de configuración entre tu server de prueba y tu server de debug.

Te recomiendo bajar la extensión FireBug para FireFox para que hagas la prueba y veas el resultado de tu petición AJAX.

Saludos.
Hola:

Corrígeme si me equivoco; pero cuando se usa Zend Studio para depuración en modo servidor (con Zend Platform instalado) entonces el depurador sí usa el mismo PHP de mi servidor (es configurable, se puede optar entre usar el PHP interno o el del servidor). Al instalar Zend Platform elegí la opción para que Zend Platform me instale y configure Apache y PHP, y son esos los que usa mi servidor (MySQL sói lo tuve que instalar por separado).

Ah por cierto, ya tengo Firebug. Hasta donde he podido revisar, cuando ejecuto el script no llega ninguna respuesta al formulario (sólo muestra "Loading..." como respuesta). El depurador de Javascript de Firebug tampoco encuentra nada.

Saludos
  #4 (permalink)  
Antiguo 13/02/2008, 12:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: ¿Por qué mi script sólo funciona cuando lo depuro?

En ese caso, si estas depurando en el servidor, por lo que esta muy extraño, haz probado simplificar tu código, igual agregar un sleep(1) en alguna parte del código.

Saludos.
  #5 (permalink)  
Antiguo 07/03/2008, 09:36
Avatar de daniloquispe  
Fecha de Ingreso: mayo-2007
Mensajes: 38
Antigüedad: 17 años
Puntos: 0
De acuerdo Resuelto...

Hola a todos:

Finalmente di con el error... Estaba dando mal la ruta a algunos archivos incluidos en mi script:

Sucede que el script que puse en mi primer mensaje lo tengo en una carpeta /scripts y en la parte superior puse algunas instrucciones include indicando ciertas librerias que mi script necesita. Estas librerias estan fuera de la carpeta /scripts

El error se debió a que en vez de poner

Código PHP:
include("../libreria.php"); 
puse

Código PHP:
include("libreria.php"); 
O sea, la ruta relativa a la librería estaba mal.

Pero lo más lioso fue que por alguna razón Zend Platform (el depurador que uso) ignoró este error y ejecutó el script como si nada. Por eso no di con el error desde un principio.

En fin, la cosa es que di finalmente con el error, corregí las rutas a los archivos incluidos y ahora mis scripts funcionan bien.

Gracias a todos por sus aportes. Nos vemos...
  #6 (permalink)  
Antiguo 07/03/2008, 10:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: ¿Por qué mi script sólo funciona cuando lo depuro?

Me da gusto saber que pudiste dar con el error. Un tip general es trata de usar rutas absolutas a tus includes, así evitas problemas de paths.

Saludos.
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 10:21.