sql >> Databáze >  >> RDS >> Mysql

Nejlepší postup pro zpracování chyb pomocí PDO

To je velmi dobrá otázka, ale hned na začátku je jeden špatný předpoklad:berete hlášení chyb pro PDO oddělené od hlášení chyb na celém webu. Což dává velmi malý smysl:chyby PDO jsou ve všech směrech stejné jako jiné chyby – chyby souborového systému, chyby HTTP a tak dále. Není tedy důvod zavádět hlášení chyb pouze s CHOP. Vše, co potřebujete, je správně nastavit hlášení chyb na celém webu.

Existuje také jeden špatný předpoklad týkající se nepřístupnosti php.ini:pomocí funkce ini_set() můžete vždy nastavit jakoukoli konfigurační direktivu. Není zde tedy jediný důvod pro nastavení error_reporting na katastrofální úroveň 0.

K zodpovězení zbývajících otázek potřebujete jen trochu zdravého rozumu.

co si o sobě myslíš? Je dobré zobrazovat uživateli systémové chybové zprávy? Je dobré ukázat vnitřní části systému uživateli se zlými úmysly?

Máte k tomu nějaké námitky?

Nemyslíte si, že je to docela protichůdná myšlenka - logovat chyby databáze do databáze?

Už jste to ukázali:zobrazit ve vývoji a přihlásit se prod. Vše je řízeno na celém webu pomocí několika jednoduchých konfiguračních možností.

NEPOUŽÍVEJTE blok try-catch pro hlášení chyb vůbec. Nebudete psát záchytný blok s popisnou chybovou zprávou pro každý dotaz ve vaší aplikaci , jak je naznačeno v druhé odpovědi, že?

Váš kód tedy musí být

<?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);

Nyní k otázce, kterou jste vyslovili v komentáři.

Vlastní chybová obrazovka je velmi odlišná záležitost a váš kód je s ní obzvláště špatný. Neměla by to být chyba 404 ani se nemusí používat přesměrování HTTP (to je pro SEO velmi špatné).

Chcete-li vytvořit vlastní chybovou stránku, musíte použít buď funkce vašeho webového serveru (preferováno) nebo obslužnou rutinu chyb ve skriptu PHP.

Když narazíte na fatální chybu (a nezachycená výjimka je jedna), PHP nereaguje stavem HTTP 200 OK, ale stavem 5xx. A každý webový server může tento stav zachytit a zobrazit odpovídající chybovou stránku. Např. pro Apache by to bylo

ErrorDocument 503 server_error.html

kde si můžete napsat, jaké omluvy chcete.

Nebo můžete nastavit vlastní obslužný program chyb v PHP, který by také zvládl všechny chyby PHP, příklad lze vidět v článku, který jsem o této záležitosti napsal:(Ne)správné použití try..catch.




  1. Jak zkontrolovat, zda existuje uložená procedura?

  2. Zástupný znak MySQL ve výběru

  3. Backendová verze není podporována pro návrh databázových diagramů nebo tabulek

  4. Jak získat skutečnou velikost databáze MySQL?