Hataları Veritabanına Kaydetme

Hatalar, bir uygulamanın işleyişinde beklenmeyen durumları ifade eder. Bu durumlar, uygulamanın doğru bir şekilde çalışmamasına, hata mesajları gösterilmesine ve hatta çökmesine neden olabilir. Bu nedenle, hataların zamanında yakalanıp, doğru bir şekilde işlenmesi önemlidir.
PHP, hataları otomatik olarak yönetir ve bu hataları log dosyalarına yazar. Ancak bazen bu log dosyalarını incelemek zor olabilir ve hataların kaydedilmesi için bir veritabanı kullanmak daha iyi bir seçenek olabilir. Bu yazımızda, PHP ile hataları nasıl yakalayıp veritabanında saklayabileceğinizi göstereceğiz. Öncelikle, logError() fonksiyonu yazıp bu fonksiyonu kullanarak PHP hatalarını otomatik olarak veritabanımıza kaydedebileceğiz.

Veritabanımızda error_logs adında bir tablo oluşturalım. Bu tabloyu oluşturmak için gerekli kod şu şekilde:

CREATE TABLE error_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    error_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    error_no INT,
    error_str TEXT,
    error_file VARCHAR(255),
    error_line INT,
    error_page VARCHAR(255)
);

Şimdi ise hata mesajlarımızı otomatik olarak veritabanımıza kaydedecek fonksiyonu yazacağız. Ancak bu fonksiyonu daha sonra php fonksiyonlarından biri olan set_error_handler ile çağırmamız gerekecek. Öncelikle hatalarımızı kaydedecek formülü yazalım.

/**
* Bir hata mesajını veritabanındaki tbl_error_logs tablosuna kaydet.
*
* @param int $errno Hata numarası, bu hata türünün benzersiz tanımlayıcısıdır.
* @param string $errstr Hata mesajı dizgisi.
* @param string $errfile Hata oluştuğu dosya.
* @param int $errline Hata oluştuğu satır numarası.
*/
function logError($errno, $errstr, $errfile, $errline) {

// pdo ile database bağlantımızın yapıldığını varsayıyoruz.

$stmt = $pdo->prepare("INSERT INTO error_logs (error_no, error_str, error_file, error_line, error_page) VALUES (:errno, :errstr, :errfile, :errline, :error_page)");
$stmt->execute(array(
  ":errno" => $errno, // hata kodu
  ":errstr" => $errstr, // hata mesajı
  ":errfile" => $errfile, // hatanın olduğu dosya
  ":errline" => $errline, // hatanın olduğu satır
  ":error_page" => $_SERVER['REQUEST_URI'] // hangi url içerisindeyken hata gerçekleşti
));

}

Şimdi geriye kalan tek şey her sayfamızda çağırdığımız bir dosyanın en üstüne aşağıdaki kodu yazmak.

set_error_handler('logError'); // bu fonksiyona callback fonksiyonu olarak bizim yazdığımız yukarıdaki fonksiyonu çağırıyoruz.
error_reporting(0); // 0 olursa kullanıcılarınız herhangi bir hata mesajı görmez ancak siz veritabanınızdan oluşan hataları görebilirsiniz. Kullanıcılarınız da görsün istiyorsanı `E_ALL` olarak değiştirebilirsiniz.

Daha sonra bu hataların olduğu dosyadaki kodları göstermek için aşağıdaki fonksiyonu kullanabilirsiniz.

/**
 * Belirtilen dosyadaki belirtilen satırın öncesindeki, sonrasındaki ve kendisi ile birlikte üç satırını döndürür.
 *
 * @param string $filename Dosya adı
 * @param int $lineNumber İstenen satır numarası
 * @return string Dosyadaki öncesindeki, sonrasındaki ve kendisi ile birlikte üç satırın dizi şeklinde dönüştürülmüş json formatında hali
 */
function errorLineFind($filename, $lineNumber)
{
    // Dosya varlığını ve okunabilirliğini kontrol eder
    if (!file_exists($filename)) {
        return json_encode('Dosya bulunamadı !');
    }
    if (!is_readable($filename)) {
        return json_encode('Dosya Okunabilir Değil !');
    }

    // Dosyayı açar
    $file = fopen($filename, "r");
    if (!$file) {
        return json_encode('Dosya Açılamadı !');
    }

    // Dosyadaki satır sayısını sayar
    $lineCount = 0;
    while (!feof($file)) {
        $line = fgets($file);
        $lineCount++;
    }
    fclose($file);

    // Eğer belirtilen satır numarası dosyadaki satır sayısının dışında ise, hata mesajı döndürür
    if ($lineNumber < 1 || $lineNumber > $lineCount) {
        return json_encode('Belirtilen Satır Numarası Dosyada Mevcut Değil !');
    }

    // Dosyayı tekrar açar ve belirtilen satır numarasına göre öncesindeki, sonrasındaki ve kendisi ile birlikte üç satır bulunur
    $file = fopen($filename, "r");
    $prevLine = "";
    $nextLine = "";
    for ($i = 1; $i <= $lineCount; $i++) {
        $line = fgets($file);
        if ($i == $lineNumber - 1) {
            $prevLine = $line;
        }
        if ($i == $lineNumber) {
            $errLine = $line;
        }
        if ($i == $lineNumber + 1) {
            $nextLine = $line;
            break;
        }
    }
    fclose($file);
    // Bulunan satırlar dizi şeklinde döndür
    return json_encode(array(
        "prevLine" => $prevLine,
        "currentLine" => $errLine,
        "nextLine" => $nextLine
    ));
}

PHP ile hata mesajlarını otomatik olarak kaydetmek, bir web uygulamasının kalitesini ve güvenilirliğini arttırabilir. Bu, hata mesajlarının bir veritabanında saklanmasını ve daha sonra bu mesajları düzenli olarak inceleyerek hataların nasıl çözülebileceğini anlamaya yardımcı olabilir. Ayrıca, hata mesajlarının sıkı bir şekilde izlenmesi, web uygulamasının performansını ve kullanıcı deneyimini iyileştirme potansiyeline sahiptir. PHP PDO veya benzer bir veritabanı erişim kütüphanesi kullanarak hata mesajlarını otomatik olarak kaydetmek, web uygulamanızın kalitesini ve güvenilirliğini arttırmanın etkili bir yoludur. Bu makalemiz sayesinde sizler de projelerinizde oluşan hataları bir veritabanına kaydederek inceleyip sorunları tespit edip hızlı çözümler üretebilirsiniz.

Bu ve benzeri önemli ipuçlarını öğrenmek için diğer yazılarıma da göz atabilirsiniz.

Web sitesine mi ihtiyacınız var ?

 

Kategori: