例外モード -PDO::ERRMODE_EXCEPTION を使用する (PDO の SQL ステートメントのエラーをキャプチャするための方法 3)
例外モードは PDOException を作成し、実行コードを try{... にカプセル化できる erorCode 属性を設定します。 }catch{...} ステートメントでは、キャッチされなかった例外によりスクリプトが中断され、問題が発生した場所をユーザーが理解できるようにスタック トレースが表示されます。
最初の 2 つの記事では、「デフォルト モードを使用する - PDO::ERRMODE_SILENT (PDO の SQL ステートメントのエラーをキャプチャする方法 1)」「 警告モードを使用する - PDO::ERRMODE_WARNING (PDO の SQL ステートメントのエラーをキャプチャする)」 ) 方法 2)》デフォルト モードと例外モードを紹介しましたので、今日は PDO で SQL ステートメントのエラーをキャプチャする 3 番目の方法を紹介します~
例外モードに関するもう 1 つの非常に便利な点は、従来の PHP と比較して-style の警告を使用すると、独自のエラー処理をより明確に構造化でき、例外モードではサイレント モードよりも必要なコードやネストが少なくなり、各データベース呼び出しの戻り値を明示的にチェックできます。
エラー コードの設定に加えて、PDO は PDOException 例外クラスもスローし、そのプロパティを設定してエラー コードとエラー情報を反映します。この設定は、スクリプト内のエラーが発生した箇所に効果的にズームインするため、デバッグ中にも非常に役立ち、コードの問題が発生する可能性のある領域を迅速に特定できるようになります。 (例外によってスクリプトが終了した場合、トランザクションは自動的にロールバックされることに注意してください)。
データベース内のデータの削除操作を実行する場合、例外モード、警告モード、デフォルト モードの違いを理解するために、データベースを例外モードに設定し、間違った SQL ステートメントを作成します。
具体的な手順は以下の通りです。
(1) phpファイルを作成し、データベースに接続し、所定の処理文のprepare()メソッドとexecute()メソッドでSELECTクエリ操作を実行し、ループ出力を完了します。 while ステートメントと fetch() メソッドを通じてデータを取得し、別の php ファイルに接続するための削除ハイパーリンクを設定します。 コードは次のとおりです。
<?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 ステートメントのエラーをキャッチする 3 つの方法の紹介は終わりました。 PDO での SQL ステートメントのエラーのキャプチャについてはある程度理解できたので、次の記事で引き続き PDO でのエラー処理方法を紹介します。詳細については、「PDO でのエラー処理方法 1」を参照してください。 - errorCode() メソッド」!
以上が例外モード -PDO::ERRMODE_EXCEPTION を使用する (PDO の SQL ステートメントのエラーをキャプチャする方法 3)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。