Note that if you’re executing an SQL command containing multiple statements, PDO by default will not be able to correctly report errors in one of them.
More info (and a workaround) in this bug report: https://bugs.php.net/bug.php?id=61613
PDO eklentisi uygulama geliştirme tarzınıza uygun olarak üç farklı hata işleme yönteminden birini seçmenize olanak verir.
PDO::ERRMODE_SILENT
PHP 8.0.0 öncesinde bu öntanımlı kipti. PDO, gerek veritabanı gerekse deyim nesneleri üzerinde PDO::errorCode() ve PDO::errorInfo() işlevlerini kullanarak hata kodunu sizin için hazır hale getirir. Eğer hata bir deyim nesnesiyle ilgili bir işlev veya yöntem çağrısından kaynaklanmışsa bu nesne üzerinde PDOStatement::errorCode() veya PDOStatement::errorInfo() işlevini kendiniz çağırmalısınız. Eğer hata bir veritabanı nesnesiyle ilgili bir işlev veya yöntem çağrısından kaynaklanmışsa bu işlevleri bu kez veritabanı nesnesi üzerinde çağırmalısınız.
PDO::ERRMODE_WARNING
Hata kodu ayarlarına ek olarak, PDO geleneksel bir E_WARNING uyarısı da verir. Bu kip, hata ayıklama ve denemeler sırasında uygulama akışının kesilmeden oluşan sorunları görmek için kullanışlıdır.
PDO::ERRMODE_EXCEPTION
PHP 8.0.0 öncesinde bu öntanımlı kipti. Hata kodu ayarlarına ek olarak, PDO bir PDOException istisnası yavrulayıp hata kodunu ve iletisini nesnenin özelliklerine yerleştirir. Bu kip de hata ayıklama sırasında uygulama akışının kesilmeden oluşan sorunları çabucak görüp müdahale etmek için kullanışlıdır. (Dikkat: Eğer istisna betiğin sonlanmasına sebep olursa veri hareketleri (transactions) otomatik olarak başa sarılır.)
Bu kip bir istisna nesnesi ile çalıştığından, hataların, her veritabanı çağrısında dönen değere bakmaktan, sessiz kipi kullanmaktan ve geleneksel PHP tarzı uyarılardan daha iyi ve daha kolay işleme sokulmasını sağlar.
PHP'deki istisna nesneleri hakkında bilgi edinmek için İstisnalar bölümüne bakınız.
PDO SQL-92 SQLSTATE hata kodu dizgelerinin kulanımını standartlaştırmıştır; her PDO sürücüsü kendi kodunu SQLSTATE kodlarına uydurmakla yükümlüdür. PDO::errorCode() yöntemi tek bir SQLSTATE kodu döndürür. Bir hata ile ilgili daha özel bilgiye gerek duyulursa, SQLSTATE kodundan başka sürücüye özgü hata kodunu ve iletisini içeren bir dizi döndüren PDO::errorInfo() yöntemi kullanılabilir.
Örnek 1 - PDO örneği oluşturup hata kipini atamak
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// BU PDO'un PDOException yavrulamasına sebep olur (tablo yoksa)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Yukarıdaki örneğin çıktısı:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10 Stack trace: #0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...') #1 {main} thrown in /tmp/pdo_test.php on line 10
Bilginize:
Eğer bağlantı başarısız olursa, hangi
PDO::ATTR_ERRMODE
hata kipinin atanmış olduğuna bakmaksızın PDO::__construct() daima bir PDOException yavrular.
Örnek 2 - PDO örneği oluşturup kurucudaki hata kipini atamak
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
// Bu, PDO'nun bir istisna yerine E_WARNING seviyesinde bir hata
// yavrulamasına sebep olur (tablo mevcut olmadığında)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Yukarıdaki örneğin çıktısı:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 9
Note that if you’re executing an SQL command containing multiple statements, PDO by default will not be able to correctly report errors in one of them.
More info (and a workaround) in this bug report: https://bugs.php.net/bug.php?id=61613
Setting the PDO::ATTR_ERRMODE to PDO::ERRMODE_EXCEPTION applies to both PDO and PDO::PDOStatement objects. Also, exceptions are thrown by: PDO::beginTransaction(), PDO::prepare(), PDOStatement::execute(), PDO::commit(), PDOStatement::fetch(), PDOStatement::fetchAll() and so on... Some of these are specified in their respective documentations as to return 'false' in case of an error.