PDO Error Handling
Kesalahan dalam penanganan PDO datang dalam beberapa rasa.
Sebelumnya dalam tutorial ini kita telah hanya menggunakan sederhana
try {} catch () {} block untuk menangkap kesalahan dalam koneksi
database, tapi apa kesalahan lainnya? mungkin nama field tidak ada? Mari kita lihat bagaimana kita pergi dengan kesalahan sederhana dengan kode sebelumnya.
<?php/*** mysql hostname ***/$hostname = 'localhost';
/*** mysql username ***/$username = 'username';
/*** mysql password ***/$password = 'password';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';
/*** The SQL SELECT statement with incorrect fieldname ***/
$sql = "SELECT username FROM animals";
foreach ($dbh->query($sql) as $row)
{
print $row['animal_type'] .' - '. $row['animal_name'] . '<br />';
}
/*** close the database connection ***/
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}?>
Skrip diatas akan menghasilkan error sebagai berikut.
Connected to database
Warning: Invalid argument supplied for foreach() in /www/pdo.php on line 18
Hal ini karena tidak ada penanganan error. Pernyataan SELECT memiliki nama field 'username' yang tidak ada dan kesalahan yang dihasilkan oleh database. Satu-satunya penanganan kesalahan standar dilakukan dengan sambungan awal. Kecuali kita berurusan dengan kesalahan, kami memiliki masalah dengan menampilkan path lengkap ke dunia. Untuk mengatasi hal ini kita perlu mengatur atribut untuk jenis penanganan kesalahan kami ingin memanfaatkan jenis penanganan error sebagai berikut.
Mari kita coba menggunakan
Exception dengan memanfaatkan try{} catch(){} blocks
<?php/*** mysql hostname ***/$hostname = 'localhost';
/*** mysql username ***/$username = 'username';
/*** mysql password ***/$password = 'password';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';
/*** set the error reporting attribute ***/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*** The SQL SELECT statement ***/
$sql = "SELECT username FROM animals";
foreach ($dbh->query($sql) as $row)
{
print $row['animal_type'] .' - '. $row['animal_name'] . '<br />';
}
/*** close the database connection ***/
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}?>
Maka akan menghasilkan error sebagai berikut.
Connected to database
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'username' in 'field list'
Biasanya
kita tidak akan menunjukkan jenis kesalahan kepada pengguna akhir, dan
pengecualian akan ditangani mungkin dengan pesan yang mengatakan Hasil
pencarian tidak ditemukan atau sesuatu yang samar, namun hal ini
menunjukkan bagaimana kita dapat mengatur modus kesalahan seperti yang
kita inginkan. Untuk mengatur modus kesalahan untuk Warning harus terlihat mudah dari sini.
<?php/*** mysql hostname ***/$hostname = 'localhost';
/*** mysql username ***/$username = 'username';
/*** mysql password ***/$password = 'password';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';
/*** set the error reporting attribute ***/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
/*** The SQL SELECT statement ***/
$sql = "SELECT username FROM animals";
foreach ($dbh->query($sql) as $row)
{
print $row['animal_type'] .' - '. $row['animal_name'] . '<br />';
}
/*** close the database connection ***/
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}?>
Sekarang kesalahan yang berbeda ditampilkan.
Connected to database
Warning: PDO::query() [function.PDO-query]: SQLSTATE[42S22]: Column not
found: 1054 Unknown column 'username' in 'field list' in /www/pdo.php on
line 21
Warning: Invalid argument supplied for foreach() in /www/pdo.php on line 21
Di sini dan E_WARNING telah dihasilkan dan jika display_errors pada kesalahan akan dilihat oleh pengguna akhir. Diharapkan bahwa jika Anda berada di sebuah lingkungan produksi ini tidak terjadi.
Terakhir, ada modus Silent. Seperti namanya, mode ini membungkam kesalahan sehingga tidak ada output yang dikirim dari kesalahan. Namun, itu tidak menghentikan kode pada titik kesalahan dan kesalahan lebih lanjut masih dikirim.
<?php/*** mysql hostname ***/$hostname = 'localhost';
/*** mysql username ***/$username = 'username';
/*** mysql password ***/$password = 'password';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';
/*** set the error reporting attribute ***/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
/*** The SQL SELECT statement ***/
$sql = "SELECT username FROM animals";
foreach ($dbh->query($sql) as $row)
{
print $row['animal_type'] .' - '. $row['animal_name'] . '<br />';
}
/*** close the database connection ***/
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}?>
Skrip diatas akan menghasilkan peringatan sebagai berikut.
Connected to database
Warning: Invalid argument supplied for foreach() in /www/pdo.php on line 21
Seperti
yang Anda lihat, kesalahan telah dibungkam, namun error berikut belum
diperhatikan, dan perlu pemeriksaan lebih lanjut untuk memastikan nilai
yang diteruskan ke foreach adalah argumen yang valid.
Seperti yang kita lihat dengan kode pengecualian, kode SQLSTATE adalah bagian dari pesan kesalahan. Kode kesalahan ini juga tersedia dengan metode PDO::errorCode ().
<?php/*** mysql hostname ***/$hostname = 'localhost';
/*** mysql username ***/$username = 'username';
/*** mysql password ***/$password = 'password';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
/*** an invalide fieldname ***/$sql = "SELECT username FROM animals";
/*** run the query ***/$result = $dbh->query($sql);
/*** show the error code ***/echo $dbh->errorCode();?>
Kode di atas menunjukkan kode kesalahan yang relevan dengan SQLSTATE tersebut. Ini adalah string lima karakter seperti yang didefinisikan oleh standar ANSI SQL.
Connected to database
42S22
Informasi lebih lanjut tentang kesalahan dapat diperoleh dari metode PDO::ErrorInfo(). Ini mengembalikan array yang berisi SQLSTATE, kode kesalahan, dan pesan kesalahan.
<?php/*** mysql hostname ***/$hostname = 'localhost';
/*** mysql username ***/$username = 'username';
/*** mysql password ***/$password = 'password';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';
}
catch(PDOException $e)
{
echo $e->getMessage();
}/*** an invalid table name ***/$sql = "SELECT animal_id FROM users";
/*** run the query ***/$result = $dbh->query($sql);
/*** show the error info ***/foreach($dbh->errorInfo() as $error)
{
echo $error.'<br />';
}?>
Dengan kode ini, kesalahan informasi seperti ini:
Connected to database
42S02
1146
Table 'animals.users' doesn't exist
Jika tidak ada kesalahan, SQLSTATE akan menjadi satu-satunya nilai yang ditampilkan, dengan nilai 00000.
Sumber : http://phpro.org/tutorials/Introduction-to-PHP-PDO.html