Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Praktik terbaik untuk penanganan kesalahan menggunakan PDO

Itu pertanyaan yang sangat bagus, tetapi ada satu premis yang salah di awal:Anda menggunakan pelaporan kesalahan untuk PDO yang terpisah dari pelaporan kesalahan di seluruh situs. Yang sangat tidak masuk akal:kesalahan PDO dalam segala hal sama dengan kesalahan lainnya - kesalahan sistem file, kesalahan HTTP, dan sebagainya. Jadi, tidak ada alasan untuk membuat pelaporan kesalahan khusus PDO. Yang Anda butuhkan hanyalah menyetel pelaporan kesalahan di seluruh situs dengan benar.

Ada juga satu asumsi yang salah mengenai tidak dapat diaksesnya php.ini:Anda selalu dapat mengatur arahan konfigurasi apa pun menggunakan fungsi ini_set(). Jadi, ini bukan alasan tunggal dalam menyetel error_reporting ke level bencana 0.

Untuk menjawab sisa pertanyaan Anda, yang Anda butuhkan hanyalah sedikit akal sehat.

Apa yang Anda pikirkan sendiri? Apakah ada gunanya menampilkan pesan kesalahan sistem kepada pengguna? Apakah ada gunanya menunjukkan internal sistem kepada pengguna jahat?

Apakah Anda memiliki keberatan untuk ini?

Tidakkah menurut Anda itu ide yang sangat kontradiktif - untuk mencatat kesalahan basis data ke dalam basis data?

Anda sudah menunjukkannya:tampilkan di dev dan masuk prod. Semua dikontrol di seluruh situs melalui beberapa opsi konfigurasi sederhana.

TIDAK menggunakan blok try-catch untuk pelaporan kesalahan sama sekali. Anda tidak akan menulis blok tangkap dengan pesan kesalahan ramah untuk setiap kueri di aplikasi Anda , seperti yang disarankan di jawaban lain, bukan?

Jadi kode Anda harus

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

Sekarang untuk pertanyaan yang Anda suarakan di komentar.

Layar kesalahan khusus adalah masalah yang sangat berbeda dan kode Anda sangat buruk dengannya. Seharusnya bukan kesalahan 404 atau pengalihan HTTP harus digunakan (itu sangat buruk untuk SEO).

Untuk membuat halaman kesalahan khusus, Anda harus menggunakan fitur server web (lebih disukai) atau penangan kesalahan dalam skrip PHP.

Saat menemukan kesalahan fatal (dan pengecualian yang tidak tertangkap adalah satu), PHP tidak merespons dengan status HTTP 200 OK tetapi dengan status 5xx. Dan setiap server web dapat menangkap status ini dan menampilkan halaman kesalahan yang sesuai. Misalnya. untuk Apache akan menjadi

ErrorDocument 503 server_error.html

di mana Anda dapat menulis alasan apa pun yang Anda inginkan.

Atau Anda dapat mengatur penangan kesalahan khusus di PHP yang akan menangani semua kesalahan PHP juga, contohnya dapat dilihat di artikel yang saya tulis tentang masalah ini:Penggunaan try..catch yang tepat.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih semua catatan yang tidak memenuhi kondisi tertentu dalam tabel gabungan

  2. MySQL INT artinya

  3. Bagaimana cara MySQL menyimpan data?

  4. bagaimana cara membuat halaman php unik untuk setiap baris dalam database mysql

  5. mysql terlalu banyak indeks?