こんにちは、
最近シュレッダーを購入して快適な生活を送っているサトウです。
さて、本題に入りたいと思います。
phpの学習を進めると「exception」や「例外処理」という言葉を聞いたことがある方も多いのではないでしょうか。名前は聞いたことがあっても「exception」について理解できない方も少なくないのでは、、、。と思い、今回は「exception」について分かりやすく説明していきます。
phpを学び始めた方や、「exception」 について分からない方は、是非読んでみてくださいね。
Exceptionとは
例外処理とは
プログラムの実行中に発生するエラーを「例外」といいます。プログラム実行中に発生する「例外」に対して、適切に処理をしなければなりません。これを「例外処理」と言います。例外処理を適切に書くにはプログラマーがプログラム実行中に発生するエラーをしっかりと想定するしておく必要があります。例外処理を書くケースはいくつもありますが、以下のような場合に例外処理を記述するケースが多いです。
・ファイルを取得できない
・ユーザが入力した郵便番号が存在しない
・「0」で除算してしまった 等
phpではこのような例外処理はExceptionクラスで扱うことができます。
Exceptionクラスでは例外の内容を表すエラーメッセージやエラーコード等の情報を持っています。
例外処理の書き方
例外処理を書くには、以下のようにtry-catch構文で記述します。
例外が発生する可能性がある処理
}catch(例外クラスの変数){
例外が発生した場合に行う処理
}
例外処理を書いてデータベースに接続してみよう!
ここからは実際の例外処理を書いてみましょう。
サンプルとして、フォーム入力した文字列がデータベースに登録される機能を用意しました。
こちらで例外処理の部分をメインに解説していきます。
完成後イメージ
サンプルコード(全体)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
<?php // ログの表示 ini_set('log_errors','On'); ini_set('error_log','php.log'); // (2)postされていれば以下の処理を実行 if(!empty($_POST)){ // (3)$_POSTした情報を変数に入れる $user_name = $_POST['user_name']; // (4)例外処理でDBに接続 try{ // (5)a:DB接続できたら以下の処理を実行 $dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = 'root'; $password = パスワード; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); // PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn,$user,$password,$options); // SQL文の作成、prepareメソッドで実行準備 $sql = 'INSERT INTO users(user_name,create_date) VALUES(:user_name,:create_date)'; $stmt = $dbh->prepare($sql); // SQLの実行 $stmt->execute(array( ':user_name' => $user_name, ':create_date' => date('Y-m-d H:i:s') )); // (5)b:エラーが発生すれば以下の処理 }catch(Exception $e){ error_log('エラー発生:'.$e->getMessage()); $err_msg = 'データベースに接続できませんでした。'; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style.css"> <title>php_exception</title> </head> <body> <section class="form-container"> <div class="textarea">入力した名前をDBに登録</div> <!-- (1)formタグからpost送信する --> <form action="" method="post" class="form"> <input type="text" name="user_name" class="input input-outline" placeholder="名前"> <input type="submit" value="送信する" class="input btn"> </form> <!-- 例外処理メッセージがあればここに表示 --> <div class="err_msg"> <?php if(!empty($err_msg)){ ?> <?php echo $err_msg; ?> <?php }else{ ?> <?php echo ''; ?> <?php } ?> </section> </body> </html> |
例外処理のコードは以下の部分です。
サンプルコード(try-catch該当部分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// (4)例外処理でDBに接続 try{ // (5)a:DB接続できたら以下の処理を実行 $dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = 'root'; $password = 'gonzo-pass15'; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); // PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn,$user,$password,$options); // SQL文の作成、prepareメソッドで実行準備 $sql = 'INSERT INTO users(user_name,create_date) VALUES(:user_name,:create_date)'; $stmt = $dbh->prepare($sql); // SQLの実行 $stmt->execute(array( ':user_name' => $user_name, ':create_date' => date('Y-m-d H:i:s') )); // (5)b:エラーが発生すれば以下の処理 }catch(Exception $e){ error_log('エラー発生:'.$e->getMessage()); $err_msg = 'データベースに接続できませんでした。'; } |
try-catchで該当部分を囲んでいます。
データベースに接続できればそのまま文字列を登録し、データベースに接続できなければエラーメッセージを返す処理を書いています。
ここで例外処理でエラーを発生させたいと思います。
今回は「データベースに接続できなかった」場合を想定し、テーブル名を以下のように変更して例外を投げてみます。
修正後のテーブル名:mysql_test1
コード
1 |
$dsn = 'mysql:dbname=mysql_test1;host=localhost;charset=utf8'; |
この状態で再度、「送信する」ボタンを押下してみます。
実行結果
例外処理のエラーが実行され、エラーメッセージが表示されましたね。
エラーログを確認してみると以下のように表示されています。
エラーログ画像
‘mysql_test1’といったテーブルはないよ、というエラーが表示されています。該当のテーブル名がないので、データベースに接続できなかったという例外処理が実行されています。このようにプログラム実行時(本番環境の運用後等)にエラー内容を想定して例外処理内容を書いていくのが非常に重要になります。是非アプリケーション開発時等に参考にしてみてください。
まとめ
いかがでしたか?今回は、exceptionの例外処理について解説しました。
自作で例外処理を書いてプログラミングをするのは、ややこしく感じることあると思います。ですが量をこなしていくと簡単に使えることができる日が来ると思うので、焦らずにゆっくりと理解を深めていってくださいね
この記事が、phpの学習に役立つと嬉しいです。