sql >> Databasteknik >  >> RDS >> Mysql

Bästa praxis för felhantering med PDO

Det är en mycket bra fråga, men det finns en felaktig premiss i början:du tar felrapportering för PDO skild från felrapportering för hela webbplatsen. Vilket är väldigt lite vettigt:PDO-fel på alla sätt är desamma som andra fel - filsystemfel, HTTP-fel och så vidare. Det finns alltså ingen anledning att upprätta felrapportering av enbart PDO. Allt du behöver är att korrekt ställa in felrapportering för hela webbplatsen.

Det finns också ett felaktigt antagande angående php.ini-otillgänglighet:du kan alltid ställa in vilket konfigurationsdirektiv som helst med ini_set()-funktionen. Här är alltså inte ett enda skäl till att ställa in error_reporting till den katastrofala nivån 0.

För att svara på resten av dina frågor behöver du bara lite sunt förnuft.

Vad tycker du själv? Är det bra att visa systemfelmeddelanden för användaren? Är det bra att visa systemets interna delar för en illvillig användare?

Har du några invändningar mot detta?

Tycker du inte att det är ganska motsägelsefullt – att logga databasfel i databasen?

Du har redan visat det:visa i dev och logga in prod. Allt styrs över hela webbplatsen genom några enkla konfigurationsalternativ.

att INTE använda try-catch-blocket för felrapportering alls. Du kommer inte att skriva ett fångstblock med ett vänligt felmeddelande för varje fråga i din app , som det föreslås i det andra svaret, är du?

Därför måste din kod vara

<?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 till frågan du ställde i kommentaren.

En anpassad felskärm är en helt annan sak och din kod är särskilt dålig med den. Varken det ska vara ett 404-fel eller en HTTP-omdirigering måste användas (det är väldigt dåligt för SEO).

För att skapa en anpassad felsida måste du använda antingen dina webbserverfunktioner (föredraget) eller en felhanterare i PHP-skript.

När man stöter på ett fatalt fel (och ett oupptäckt undantag är ett), svarar PHP inte med 200 OK HTTP-status utan med 5xx-status. Och varje webbserver kan fånga denna status och visa en motsvarande felsida. T.ex. för Apache skulle det vara

ErrorDocument 503 server_error.html

där du kan skriva vilka ursäkter du vill.

Eller så kan du sätta upp en anpassad felhanterare i PHP som skulle hantera alla PHP-fel också, ett exempel kan ses i artikeln jag skrev om saken:Den (o)korrekta användningen av try..catch.




  1. Hur redigerar man lagrad procedur i Oracle SQL Developer?

  2. Hur kan man beskriva prestandaproblem i relationsdatabas?

  3. Hur utesluter du helger från en date_sub?

  4. INTE I urval med NULL-värden