Normalmente utilizo un entorno IDE para depurar el código generado por PHPRunner (MS Visual Studio y Netbeans PHP).
Esto sólo lo puedo hacer en mi PC, ya que en él configuro el Apache y el entorno de PHP a lo que necesito, pero esto no lo puedo hacer en los server en dónde subo las aplicaciones y donde no tengo el control de todo el entorno.
Para estos casos donde no puedo configurar mi IDE y también, para aquellos usuarios que aún no han dado el paso a disponer de un IDE para la depuración de PHP, podemos utilizar un método muy sencillo que voy a explicaros.
El método consiste en escribir en un fichero (en este caso llamado «error.log») que es accesible desde cualquier navegador. De esta forma, todo lo que escribamos en dicho fichero podremos consultarlo y nos dará la pista de nuestros problemas.
Para montar es sistema tenemos que hacer:
- Crear un fichero llamado «error.log» en la raíz de nuestro proyecto. Por ejemplo, si mi proyecto está un path del tipo «../apache/htdoc/proyecto1», crearemos el fichero «../apache/htdoc/proyecto1/error.log»
- En nuestro proyecto de PHPRunner introduciremos este código en el evento «After application initialized». Este evento se ejecuta en todas las peticiones que hagamos a la aplicación.
// To debug PHP code on the server function custom_error($number,$text){ // Function to produce the error file global $debugCode; if ($debugCode == true ) { $ddf = fopen(__DIR__ .'/../error.log','a'); fwrite($ddf,"[".date("r")."] Error $number: $text\r\n"); fclose($ddf); } } $debugCode = true; custom_error(1,"URL ejecutada: ".$_SERVER["REQUEST_URI"]); // To debug
Si queremos que no escriba nuevas trazas pondremos la variable $debugCode a false.
También borraremos el fichero «error.log» en los sistemas de Producción. - Cada vez que deseemos escribir el contenido de variable u objeto utilizaremos la función custom_error(). Por ejemplo (ver qué SQL se está ejecutando. incluir en el evento «Before SQL query»:
custom_error(2,"SQL de v_resource: ".$strSQL); // To debug custom_error(2,"WHERE de v_resource: ".$strWhereClause); // To debug
El resultado del fichero es como este:
[Thu, 03 Feb 2022 13:03:16 +0100] Error 1: URL ejecutada: /project2/menu.php [Thu, 03 Feb 2022 13:03:18 +0100] Error 1: URL ejecutada: /project2/menu.php [Thu, 03 Feb 2022 13:05:22 +0100] Error 1: URL ejecutada: /project2/v_resource_list.php [Thu, 03 Feb 2022 13:05:22 +0100] Error 2: SQL de v_resource: SELECT `t1`.`task_id`, `t3`.`user_task_id`, `t1`.`projects_project_id`, `t5`.`companies_company_id`, `t5`.`departments_dept_id`, `t5`.`short_name`, `t1`.`parent`, `t1`.`name`, CASE WHEN (t1.percent_complete = 100 )THEN 3 WHEN (t1.end_date < now() and t1.percent_complete < 100 )THEN 2 WHEN (t1.end_date > now() and t1.start_date < now() )THEN 1 ELSE 0 END as `flag`, `t1`.`milestone`, `t1`.`start_date`, `t1`.`duration`, `t1`.`duration_type`, DATEDIFF(t1.end_date,t1.start_date)+1 as `natural_days`, `t1`.`hours_worked`, `t1`.`end_date`, `t1`.`status`, `t1`.`percent_complete`, `t1`.`description`, `t1`.`related_url`, `t1`.`creator`, `t1`.`order`, `t1`.`level`, `t1`.`dynamic`, `t1`.`access`, `t1`.`notify`, `t1`.`contacts`, `t1`.`custom`, `t1`.`type`, `t1`.`updator`, `t1`.`created`, `t1`.`updated`, `t1`.`dependent`, `t1`.`actual_end_date`, `t3`.`users_user_id` as `t3_users_user_id`, `t3`.`type` as `t3_type`, `t3`.`perc_assignment`, `t3`.`user_task_priority`, `t4`.`login`, `t4`.`username` FROM `tasks` `t1` INNER JOIN `projects` `t5` ON t5.project_id = t1.projects_project_id INNER JOIN `user_tasks` `t3` ON t3.tasks_task_id = t1.task_id INNER JOIN `users` `t4` ON t4.user_id = t3.users_user_id [Thu, 03 Feb 2022 13:05:22 +0100] Error 2: WHERE de v_resource: [Thu, 03 Feb 2022 13:05:23 +0100] Error 1: URL ejecutada: /project2/timeline_ajax_event.php?start=2022-02-01T00%3A00%3A00%2B01%3A00&end=2022-03-01T00%3A00%3A00%2B01%3A00
Si lo que deseamos es imprimir un Array o un Object, se utilizará la función «print_r». Por ejemplo si el array es la variable $ar, la impresión será print_r($a,true);
Espero que os sea útil y para cualquier ayuda o sugerencia podéis contactar conmigo a través de mi email [email protected]