Mysql
 sql >> база данни >  >> RDS >> Mysql

Най-добра практика за обработка на грешки чрез PDO

Това е много добър въпрос, но има една погрешна предпоставка в самото начало:приемате докладване за грешки за 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. node.js mySQL връзка чрез сингълтон

  2. Гледате таблица за промяна в MySQL?

  3. Как мога да задам паролата на mysql в сценария, който се изпълнява mysqld_safe?

  4. Най-лесният начин да конвертирате байтов масив в Blob в java

  5. Възможно ли е да се използва .mylogin.cnf файл в C# за установяване на връзка?