Това е много добър въпрос, но има една погрешна предпоставка в самото начало:приемате докладване за грешки за PDO отделено от докладване за грешки в целия сайт. Което няма много смисъл:грешките в PDO във всяко отношение са същите като другите грешки - грешки във файловата система, HTTP грешки и т.н. По този начин няма причина да се установява отчитане на грешки само за PDO. Всичко, от което се нуждаете, е правилно да настроите отчитането на грешки в целия сайт.
Има и едно погрешно предположение относно недостъпността на php.ini:винаги можете да зададете всяка конфигурационна директива, като използвате функцията ini_set(). По този начин, тук няма нито една причина да зададете error_reporting на катастрофално ниво от 0.
За да отговорите на останалите си въпроси, всичко, от което се нуждаете, е малко здрав разум.
Вие сами какво мислите? Добре ли е показването на съобщения за системни грешки на потребителя? Показва ли добре системните елементи на злонамерен потребител?
Имате ли възражения за това?
Не мислите ли, че идеята е доста противоречива - да регистрирате грешки в базата данни в базата данни?
Вече го показахте:покажете в dev и влезте в prod. Всичко се контролира в целия сайт чрез няколко прости опции за конфигуриране.
Изобщо да НЕ се използва блок try-catch за отчитане на грешки. Няма да пишете блок за хващане с приятелско съобщение за грешка за всяка заявка във вашето приложение , както е предложено в другия отговор, нали?
Следователно кодът ви трябва да бъде
<?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);
Сега към въпроса, който зададете в коментара.
Персонализираният екран за грешки е много различен въпрос и вашият код е особено лош с него. Нито трябва да е грешка 404, нито трябва да се използва HTTP пренасочване (това е много лошо за SEO).
За да създадете персонализирана страница за грешки, трябва да използвате функциите на вашия уеб сървър (за предпочитане) или манипулатор на грешки в PHP скрипт.
Когато срещне фатална грешка (и неуловено изключение е едно), PHP отговаря не със статус 200 OK HTTP, а със статус 5xx. И всеки уеб сървър може да улови това състояние и да покаже съответната страница за грешка. напр. за Apache би било
ErrorDocument 503 server_error.html
където можете да пишете каквито извинения искате.
Или можете да настроите персонализиран манипулатор на грешки в PHP, който да обработва и всички PHP грешки, пример може да се види в статията, която написах по въпроса:(Не)правилното използване на try..catch.