Esa es una muy buena pregunta, pero hay una premisa incorrecta desde el principio:está tomando el informe de errores para PDO separado del informe de errores de todo el sitio. Lo que tiene muy poco sentido:los errores de PDO en todos los sentidos son iguales a otros errores:errores del sistema de archivos, errores de HTTP, etc. Por lo tanto, no hay ninguna razón para establecer un informe de errores de PDO únicamente. Todo lo que necesita es configurar correctamente el informe de errores en todo el sitio.
También hay una suposición incorrecta con respecto a la inaccesibilidad de php.ini:siempre puede establecer cualquier directiva de configuración usando la función ini_set(). Por lo tanto, aquí no hay una sola razón para establecer error_reporting en el nivel desastroso de 0.
Para responder al resto de tus preguntas todo lo que necesitas es un poco de sentido común.
¿Qué piensas tú mismo? ¿Es bueno mostrar mensajes de error del sistema al usuario? ¿Sirve de algo mostrar el funcionamiento interno del sistema a un usuario malintencionado?
¿Tienes alguna objeción para esto?
¿No crees que es una idea bastante contradictoria:registrar errores de la base de datos en la base de datos?
Ya lo ha mostrado:mostrar en dev e iniciar sesión en prod. Todo se controla en todo el sitio a través de unas pocas opciones de configuración simples.
NO usar el bloque try-catch para informar errores. No vas a escribir un bloque catch con un mensaje de error amigable para cada consulta en tu aplicación , como se sugiere en la otra respuesta, ¿verdad?
Por lo tanto, su código debe ser
<?php
// Error handling
error_reporting(-1);
ini_set('display_errors',0);
ini_set('log_errors',1);
// Get credentials from outside document root
require_once('../settings.php');
// Tests connection to database
$dbh = new PDO(
sprintf(
'mysql:host=%s;dbname=%s;port=%s;charset=%s',
$settings['host'],
$settings['name'],
$settings['port'],
$settings['charset']
),
$settings['username'],
$settings['password']
);
// Prevents emulated prepares and activates error handling
// PDO::ERRMODE_EXCEPTION
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Ahora a la pregunta que expresaste en el comentario.
Una pantalla de error personalizada es un asunto muy diferente y su código es especialmente malo con ella. Ni debe ser un error 404 ni hay que usar una redirección HTTP (eso es muy malo para el SEO).
Para crear una página de error personalizada, debe usar las funciones de su servidor web (preferido) o un controlador de errores en el script PHP.
Cuando se encuentra con un error fatal (y una excepción no detectada), PHP no responde con el estado HTTP 200 OK, sino con el estado 5xx. Y cada servidor web puede detectar este estado y mostrar una página de error correspondiente. P.ej. para Apache sería
ErrorDocument 503 server_error.html
donde puedes escribir las excusas que quieras.
O puede configurar un controlador de errores personalizado en PHP que también manejaría todos los errores de PHP, se puede ver un ejemplo en el artículo que escribí sobre el tema:El uso (im)apropiado de try..catch.