sql >> Database >  >> RDS >> Mysql

Best practice voor foutafhandeling met PDO

Dat is een heel goede vraag, maar er is in het begin één verkeerd uitgangspunt:u gebruikt foutrapportage voor PDO gescheiden van sitebrede foutrapportage. Wat heel weinig zin heeft:PDO-fouten zijn in alle opzichten hetzelfde als andere fouten - bestandssysteemfouten, HTTP-fouten, enzovoort. Er is dus geen reden om PDO-foutrapportage op te zetten. Het enige dat u nodig hebt, is de foutrapportage voor de hele site correct in te stellen.

Er is ook een verkeerde veronderstelling met betrekking tot de ontoegankelijkheid van php.ini:je kunt altijd een configuratierichtlijn instellen met de functie ini_set(). Er is dus geen enkele reden om error_reporting in te stellen op het rampzalige niveau 0.

Om de rest van je vragen te beantwoorden, heb je alleen een beetje gezond verstand nodig.

Wat denk je zelf? Is het goed om systeemfoutmeldingen aan de gebruiker te tonen? Heeft het enig nut om systeeminternals te tonen aan een kwaadwillende gebruiker?

Heeft u hier bezwaar tegen?

Vind je het niet een heel tegenstrijdig idee om databasefouten in de database te loggen?

Je hebt het al laten zien:display in dev en log in prod. Alles wordt op de hele site beheerd via een paar eenvoudige configuratie-opties.

Nooit het try-catch-blok gebruiken voor foutrapportage. Je gaat geen catch-blok schrijven met een vriendelijke foutmelding voor elke zoekopdracht in je app , zoals gesuggereerd in het andere antwoord, ben jij dat?

Dus je code moet zijn

<?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 naar de vraag die je in de opmerking hebt geuit.

Een aangepast foutscherm is een heel andere zaak en je code is er vooral slecht mee. Het mag geen 404-fout zijn en er hoeft ook geen HTTP-omleiding te worden gebruikt (dat is erg slecht voor SEO).

Om een ​​aangepaste foutpagina te maken, moet u ofwel uw webserverfuncties gebruiken (bij voorkeur) of een foutafhandelaar in PHP-script.

Bij het tegenkomen van een fatale fout (en een niet-afgevangen uitzondering is er één), reageert PHP niet met de 200 OK HTTP-status maar met de 5xx-status. En elke webserver kan deze status opvangen en een overeenkomstige foutpagina tonen. bijv. voor Apache zou het zijn

ErrorDocument 503 server_error.html

waar je alle excuses kunt schrijven die je wilt.

Of je kunt een aangepaste fout-handler in PHP instellen die ook alle PHP-fouten zou afhandelen, een voorbeeld is te zien in het artikel dat ik hierover heb geschreven:Het (on)juiste gebruik van try..catch.




  1. MySQL gebruiken met Deno en Oak

  2. Een * (sterretje) toevoegen aan een Fulltext Search in MySQL

  3. PostgreSQL schakelt meer uitvoer uit

  4. Mysql2::Fout:Toegang geweigerd voor gebruiker 'test'@'localhost' tot database 'depot_test'