debugging pg_query - ¿Cómo obtener mensajes de error útiles en PHP?




conectar postgresql (25)

Encuentro la programación en PHP bastante frustrante. Muy a menudo, intentaré ejecutar el script y volveré a aparecer una pantalla en blanco. No hay mensaje de error, solo pantalla vacía. La causa podría haber sido un simple error de sintaxis (corchete incorrecto, punto y coma faltante), una llamada de función fallida o algo completamente distinto.

Es muy difícil averiguar qué salió mal. Terminé comentando el código, ingresando declaraciones de "eco" en todas partes, etc. tratando de reducir el problema. Pero seguramente debe haber una mejor manera, ¿no ?.

Entonces, ¿hay una manera de hacer que PHP produzca un mensaje de error útil como lo hace Java? ¿Alguien puede recomendar buenos consejos, herramientas y técnicas de depuración de PHP?


Answers

error_reporting(E_ALL | E_STRICT);

Y encienda los errores de visualización en php.ini


Si eres super genial, puedes intentar:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Esto solo mostrará errores cuando esté ejecutando localmente. También le proporciona la variable test_server para usar en otros lugares donde sea apropiado.

Cualquier error que ocurra antes de que se ejecute el script no se detectará, pero para el 99% de los errores que cometo, eso no es un problema.



Además de las excelentes respuestas anteriores, también puede implementar las siguientes dos funciones en sus proyectos. Atraparán todos los errores no relacionados con la sintaxis antes de que salga la aplicación / script. Dentro de las funciones, puede hacer un seguimiento y registrar o enviar al público un mensaje agradable 'El sitio está en mantenimiento'.

Errores fatales:

register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

Errores:

set_error_handler

http://php.net/manual/en/function.set-error-handler.php

Backtracing:

debug_backtrace

http://php.net/manual/en/function.debug-backtrace.php


Recomiendo a Nette Tracy para una mejor visualización de errores y excepciones en PHP:


Puede incluir las siguientes líneas en el archivo que desea depurar:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Esto anula la configuración predeterminada en php.ini, que solo hace que PHP informe los errores al registro.


Puedes registrar tu propio controlador de errores en PHP. Volcar todos los errores en un archivo podría ayudarlo en estos casos poco claros, por ejemplo. Tenga en cuenta que se llamará a su función, sin importar cuál sea su error_reporting actual. Ejemplo muy básico:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');

Las dos líneas clave que necesita para obtener errores útiles de PHP son:

ini_set('display_errors',1);
 error_reporting(E_ALL);

Como lo señalaron otros colaboradores, estos están desactivados por defecto por razones de seguridad. Como una sugerencia útil: cuando configura su sitio, es útil hacer un cambio para sus diferentes entornos para que estos errores estén activados de forma predeterminada en sus entornos locales y de desarrollo. Esto se puede lograr con el siguiente código (idealmente en su archivo index.php o config para que esté activo desde el principio):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}

Además de todas las maravillosas respuestas aquí, me gustaría incluir una mención especial para las bibliotecas MySQLi y PDO.

A fin de que...

  1. Ver siempre los errores relacionados con la base de datos, y
  2. Evite verificar en los tipos de devolución los métodos para ver si algo salió mal.

La mejor opción es configurar las bibliotecas para lanzar excepciones .

MySQLi

Agrega esto cerca de la parte superior de tu script

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Es mejor ubicarlo antes de usar new mysqli() o mysqli_connect() .

DOP

Establezca el atributo PDO::ERRMODE_EXCEPTION en PDO::ERRMODE_EXCEPTION en su instancia de conexión. Usted puede hacer esto en el constructor.

$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

o después de la creación

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Activar el informe de errores es la solución correcta, sin embargo, no parece tener efecto en el programa que lo enciende, pero solo en los programas incluidos posteriormente.

Por lo tanto, siempre creo un archivo / programa (que generalmente llamo "genwrap.php") que tiene esencialmente el mismo código que la solución popular aquí (es decir, activa el informe de errores) y también incluye la página que realmente quiero llamada.

Hay 2 pasos para implementar esta depuración;

Uno : crea genwrap.php y coloca este código en él:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Dos : cambie el enlace al programa / página que desea depurar para ir a través de genwrap.php.

Ej: cambio:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

a

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */

En la parte superior de la página elija un parámetro.

error_reporting(E_ERROR | E_WARNING | E_PARSE);

Configuración de PHP

2 entradas en php.ini dictan la salida de errores:

  1. display_errors
  2. error_reporting

En producción , display_errors generalmente está Off (lo que es bueno, porque la visualización de errores en los sitios de producción generalmente no es deseable).

Sin embargo, en desarrollo , se debe establecer en On , para que se muestren los errores. Cheque

error_reporting (a partir de PHP 5.3) se establece de forma predeterminada en E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (es decir, todo se muestra excepto los avisos, estándares estrictos y avisos de desaprobación). En caso de duda, E_ALL en E_ALL para mostrar todos los errores. Cheque

¡Whoa Whoa! ¡Sin verificación! No puedo cambiar mi php.ini!

Es una pena. Por lo general, los hosts compartidos no permiten la alteración de su archivo php.ini, por lo que, lamentablemente, esta opción no está disponible. ¡Pero no temas! Tenemos otras opciones!

Configuración de tiempo de ejecución

En el script deseado, podemos alterar las entradas de php.ini en tiempo de ejecución! Es decir, se ejecutará cuando se ejecute el script! ¡Dulce!

error_reporting(E_ALL);
ini_set("display_errors", "On");

¡Estas dos líneas harán el mismo efecto que alterando las entradas de php.ini como se mencionó anteriormente! ¡Increíble!

Todavía me sale una página en blanco / 500 error!

Eso significa que el script ni siquiera se había ejecutado! ¡Eso suele ocurrir cuando tienes un error de sintaxis!

Con los errores de sintaxis, el script ni siquiera llega al tiempo de ejecución. Falla en el momento de la compilación , lo que significa que usará los valores en php.ini, que si no hubiera cambiado, puede que no permita la visualización de errores.

Registros de errores

Además, PHP por defecto registra errores. En el alojamiento compartido, puede estar en una carpeta dedicada o en la misma carpeta que el script ofensivo.

Si tiene acceso a php.ini, puede encontrarlo en la entrada error_log .


Para los errores de sintaxis, debe habilitar la visualización de errores en php.ini. De forma predeterminada, están desactivados porque no desea que un "cliente" vea los mensajes de error. Consulte esta página en la documentación de PHP para obtener información sobre las 2 directivas: error_reporting y display_errors . display_errors es probablemente el que quieres cambiar. Si no puede modificar el php.ini, también puede agregar las siguientes líneas a un archivo .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Es posible que desee considerar el uso del valor de E_ALL (como lo menciona Gumbo) para su versión de PHP para que error_reporting obtenga todos los errores. más información

Otros 3 elementos: (1) Puede revisar el archivo de registro de errores, ya que tendrá todos los errores (a menos que se haya deshabilitado el registro). (2) Agregar las siguientes 2 líneas lo ayudará a depurar errores que no sean errores de sintaxis:

error_reporting(-1);
ini_set('display_errors', 'On');

(3) Otra opción es usar un editor que compruebe si hay errores al escribir, como PhpEd . PhpEd también viene con un depurador que puede proporcionar información más detallada. (El depurador PhpEd es muy similar a xdebug y se integra directamente en el editor, por lo que utiliza 1 programa para hacer todo).

El link de Cartman también es muy bueno: link


Si usted es un usuario de Ubuntu, vaya a su terminal y ejecute este comando

sudo tail -50f /var/log/apache2/error.log

donde mostrará los últimos 50 errores. Hay un archivo de error error.log para apache2 que registra todos los errores.


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Aparte de error_reporting y la configuración de display_errors ini, puede obtener errores de SYNTAX de los archivos de registro de su servidor web. Cuando estoy desarrollando PHP, cargo los registros del servidor web de mi sistema de desarrollo en mi editor. Cada vez que pruebo una página y aparece una pantalla en blanco, el archivo de registro queda obsoleto y mi editor me pregunta si quiero volver a cargarlo. Cuando lo hago, salto a la parte inferior y hay un error de sintaxis. Por ejemplo:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9

Hay una extensión realmente útil llamada " xdebug " que también hará que sus informes sean mucho más agradables.



error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Además, puede obtener información más detallada con xdebug .


Mi problema habitual son los errores "pequeños, estúpidos" del analizador que, lamentablemente, no aparecen.

Sin embargo, cuando un archivo .PHP incluye un archivo que tiene errores de analizador, se muestran. Así que tuve la idea de escribir un pequeño "ejecutor-script" que se inicia con el nombre del archivo con errores como argumento, es decir, example.com/sx.php?sc=buggy.php

Ya me había salvado de muchos dolores de cabeza, tal vez también sea útil para otra persona :)

sx.php

$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
    echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
    $sc = $_GET["sc"];
    if (false==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>

También es posible que desee probar PHPStorm como su editor de código. Encontrará muchos errores de sintaxis de PHP y de otro tipo a medida que escribe en el editor.


Puede habilitar el informe completo de errores (incluidos avisos y mensajes estrictos). Algunas personas encuentran esto demasiado detallado, pero vale la pena intentarlo. Establezca error_reporting en E_ALL | E_STRICT E_ALL | E_STRICT en su php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT le notificará sobre funciones en desuso y le dará recomendaciones sobre los mejores métodos para realizar ciertas tareas.

Si no desea avisos, pero le resultan útiles otros tipos de mensajes, intente excluirlos:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

También asegúrese de que display_errors esté habilitado en php.ini. Si su versión de PHP es anterior a 5.2.4, configúrela en On :

display_errors = "On"

Si su versión es 5.2.4 o más reciente, use:

display_errors = "stderr"


Para persistir y hacer que sea confortale, puede editar su archivo php.ini. Normalmente se almacena en /etc/php.ini o /etc/php/php.ini , pero los php.ini más locales pueden sobrescribirlo, según las pautas de configuración de su proveedor de alojamiento. Verifique un archivo phpinfo() para el Loaded Configuration File en la parte superior, para asegurarse de que el último se carga.

Buscar display_errors en ese archivo. Solo debe haber 3 instancias, de las cuales 2 están comentadas.

Cambia la línea sin comentarios a:

display_errors = stdout

<=> Operador de la nave espacial

Añadido en PHP 7

El operador de la nave espacial <=> es el último operador de comparación agregado en PHP 7. Es un operador binario no asociativo con la misma prioridad que los operadores de igualdad ( == != , === !== ). Este operador permite una comparación de tres vías más simple entre los operandos de la izquierda y la derecha.

El operador da como resultado una expresión entera de:

  • 0 cuando ambos operandos son iguales
  • Menos de 0 cuando el operando de la izquierda es menor que el operando de la derecha
  • Mayor que 0 cuando el operando de la izquierda es mayor que el operando de la derecha

p.ej

1 <=> 1; // 0
1 <=> 2; // -1
2 <=> 1; // 1

Una buena aplicación práctica de usar este operador sería, en comparación, las devoluciones de llamada de tipo que se espera que devuelvan un entero cero, negativo o positivo basado en una comparación de tres vías entre dos valores. La función de comparación pasada a usort es uno de estos ejemplos.

Antes de PHP 7 escribirías ...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

Desde PHP 7 puedes escribir ...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    return $a <=> $b;
});




php debugging error-handling