PDO Error Handling

♠ Posted by Unknown at 08.26

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.
  • Exception
  • Warning
  • Silent
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_ERRMODEPDO::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_ERRMODEPDO::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_ERRMODEPDO::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 

0 komentar:

Posting Komentar