sql >> Database teknologi >  >> RDS >> Mysql

Bedste praksis for fejlhåndtering ved brug af PDO

Det er et meget godt spørgsmål, men der er en forkert præmis helt i begyndelsen:du tager fejlrapportering for PDO adskilt fra fejlrapportering på hele webstedet. Hvilket giver meget lidt mening:PDO-fejl er på alle måder de samme som andre fejl - filsystemfejl, HTTP-fejl og så videre. Der er således ingen grund til at etablere fejlrapportering udelukkende med PDO. Alt du behøver er at indstille fejlrapportering på hele webstedet korrekt.

Der er også en forkert antagelse om php.ini utilgængelighed:du kan altid indstille et hvilket som helst konfigurationsdirektiv ved hjælp af ini_set()-funktionen. Her er således ikke en enkelt grund til at indstille fejlrapportering til et katastrofalt niveau på 0.

For at besvare resten af ​​dine spørgsmål behøver du kun lidt sund fornuft.

Hvad synes du selv? Er det godt at vise systemfejlmeddelelser til brugeren? Er det godt at vise systemets interne dele til en ondsindet bruger?

Har du nogen indvendinger mod dette?

Synes du ikke, det er ret modstridende idé - at logge databasefejl ind i databasen?

Du har allerede vist det:Vis i dev og log på prod. Alt styres på hele webstedet gennem få enkle konfigurationsmuligheder.

Slet IKKE at bruge try-catch-blok til fejlrapportering. Du kommer ikke til at skrive en catch-blok med en venlig fejlmeddelelse for hver forespørgsel i din app , som det er foreslået i det andet svar, er du?

Derfor skal din kode være

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

Nu til det spørgsmål, du har givet udtryk for i kommentaren.

En brugerdefineret fejlskærm er en meget anden sag, og din kode er særlig dårlig med den. Hverken det skal være en 404-fejl eller en HTTP-omdirigering skal bruges (det er meget dårligt for SEO).

For at oprette en brugerdefineret fejlside skal du bruge enten dine webserverfunktioner (foretrukket) eller en fejlbehandler i PHP-script.

Når du støder på en fatal fejl (og ufanget undtagelse er en), svarer PHP ikke med 200 OK HTTP-status, men med 5xx-status. Og hver webserver kan fange denne status og vise en tilsvarende fejlside. For eksempel. for Apache ville det være

ErrorDocument 503 server_error.html

hvor du kan skrive hvilke undskyldninger du vil.

Eller du kan opsætte en brugerdefineret fejlbehandler i PHP, som også vil håndtere alle PHP-fejl, et eksempel kan ses i artiklen jeg skrev om sagen:Den (u)korrekte brug af try..catch.




  1. Sådan vælger du en række med maksimal værdi i mysql-tabel

  2. MySQL unikt indeks af flere felter

  3. Hvordan sammenligner man softwareversioner ved hjælp af SQL Server?

  4. Hvad er MariaDB Enterprise, og hvordan administreres det med ClusterControl?