使用異常模式-PDO::ERRMODE_EXCEPTION(PDO中捕獲SQL語句中的錯誤方法三)
異常模式會建立一個PDOException,並設定erorCode 屬性,它可以將執行程式碼封裝到一個try{...}catch{...}語句中,未捕獲的異常將會導致腳本中斷,並顯示堆疊追蹤讓使用者了解是哪裡出現的問題!
在前兩篇文章《使用預設模式-PDO::ERRMODE_SILENT(PDO中擷取SQL語句中的錯誤方法一)》《使用警告模式-PDO:: ERRMODE_WARNING(PDO中擷取SQL語句中的錯誤方法二)》中我們介紹了預設模式以及例外模式兩種方法,那麼我們今天來介紹第三種方法來捕捉PDO中SQL語句的錯誤~
異常模式另一個非常有用的是,相比傳統PHP 風格的警告,可以更清晰地構建自己的錯誤處理,而且比起靜默模式和顯式地檢查每種數據庫調用的返回值,異常模式需要的程式碼/嵌套更少。
除設定錯誤碼之外,PDO 還會拋出一個 PDOException 異常類別並設定它的屬性來反射錯誤碼和錯誤訊息。此設定在偵錯期間也非常有用,因為它會有效放大腳本中產生錯誤的點,從而可以非常快速地指出程式碼中有問題的潛在區域! ( 記住:如果異常導致腳本終止,則事務被自動回滾)。
在執行資料庫中資料的刪除操作時,設定為異常模式,並且編寫一個錯誤的 SQL語句,體會異常模式與警告模式和預設模式的區別。
具體步驟如下:
(1) 建立一個php文件,連接資料庫,透過預定處理語句的prepare()和execute()方法執行SELECT查詢操作,透過while 語句和fetch ()方法完成資料的循環輸出,並且設定刪除超鏈接,連接到另一個php檔案中,傳遞的參數是資料的ID值,程式碼如下:
<?php header("Content-Type:text/html; charset=utf-8"); //设置页面的编码格式 $dbms = "mysql"; // 数据库的类型 $dbName ="php_cn"; //使用的数据库名称 $user = "root"; //使用的数据库用户名 $pwd = "root"; //使用的数据库密码 $host = "localhost"; //使用的主机名称 $dsn = "$dbms:host=$host;dbname=$dbName"; try{ $pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //设置为警告模式 $query="select * from user";//需要执行的sql语句 $res=$pdo->prepare($query);//准备查询语句 $res->execute(); //执行查询语句,并返回结果集 ?> <table border="1" width="500"> <tr> <td height="22" align="center" valign="middle">id</td> <td height="22" align="center" valign="middle">用户名</td> <td height="22" align="center" valign="middle">密码</td> <td height="22" align="center" valign="middle">操作</td> </tr> <?php while($result=$res->fetch(PDO::FETCH_ASSOC)){ // 循环输出查询结果集,并且设置结果集为关联数据形式。 ?> <tr> <td height="22" align="center" valign="middle"><?php echo $result["id"];?></td> <td height="22" align="center" valign="middle"><?php echo $result["username"];?></td> <td height="22" align="center" valign="middle"><?php echo $result["password"];?></td> <td height="22" align="center" valign="middle"><a href="2.php?code_id=<?php echo $result['id'];?>">删除</td> </tr> <?php } }catch(Exception $e){ die("Error!:".$e->getMessage().'<br>'); } ?> </table>
輸出得到的結果如下:
(2)建立另外一個文件,取得超連結的資料ID值,連接資料庫,透過setAttribute()方法設定為異常模式,定義DELETE刪除語句,刪除錯誤的數據表中的數據,並且透過try{...}catch{...}語句取得錯誤訊息,具體程式碼如下:
<?php $id = $_GET['code_id']; if($id){ header("Content-Type:text/html; charset=utf-8"); //设置页面的编码格式 $dbms = "mysql"; // 数据库的类型 $dbName ="php_cn"; //使用的数据库名称 $user = "root"; //使用的数据库用户名 $pwd = "root"; //使用的数据库密码 $host = "localhost"; //使用的主机名称 $dsn = "$dbms:host=$host;dbname=$dbName"; try{ $pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //设置为警告模式 $query="delete * from user_12 where id = $id";//需要执行的sql语句 $res=$pdo->prepare($query);//准备查询语句 $res ->bindParam(':id',$_GET['code_id']); //绑定更新数据 $res->execute(); //执行查询语句,并返回结果集 }catch (PDOException $e){ echo "PDO Exception Caught"; echo 'Error with the database:<br>'; echo 'SQL Query;'.$query; echo '<pre class="brush:php;toolbar:false">'; echo "Error:".$e -> getMessage()."<br>"; echo "Code:".$e ->getCode()."<br>"; echo "File:".$e ->getFile()."<br>"; echo "Line:".$e ->getLine()."<br>"; echo "Trace:".$e ->getTraceAsString()."<br>"; echo "
注意:
在上面的程式碼中,在定義DELETE 刪除語句的時候,我們故意使用了錯誤的資料表名字user_12(正確的資料表名稱是:user),這裡是為了測試寫的!
在設定為異常模式後,執行錯誤的SQL語句,輸出結果如下:
關於PDO中擷取SQL語句中錯誤的三種方法到這裡我們就介紹完了,相信小伙伴們對於PDO中捕獲SQL語句的錯誤有一定的了解了,下一篇我們繼續給大家介紹PDO中錯誤處理的方法,具體請閱讀《 PDO中錯誤處理的方法一-errorCode()方法》!
以上是使用異常模式-PDO::ERRMODE_EXCEPTION(PDO中擷取SQL語句中的錯誤方法三)的詳細內容。更多資訊請關注PHP中文網其他相關文章!