>> PHP入門トップに戻る

PDO 例外処理 try catch

今までPDOについて説明してきましたが、今度はPDOの例外処理について説明したいと思います。
以下のようなテーブルを準備してください。
mysql> select * from test;
+----+------+------+
| id | num  | name |
+----+------+------+
|  1 |    1 | AAA  |
|  2 |   10 | BBB  |
|  3 |  100 | CCC  |
|  4 | 1000 | DDD  |
+----+------+------+
今までprepareやexecuteなどのPDO関連の関数を実行してきましたが、特に何も設定していない場合はクエリの構文等でエラーがあっても例外は発生しません。

これではエラー発生時に対処できないため、エラー時には例外を発生させる必要があります。
例外を発生させるにはPDOオブジェクトのsetAttributeメソッドで設定が必要になります。
以下のコードを見てください。
	try{
	
		//PDOオブジェクトの生成
		$pdo = new PDO("mysql:dbname=test;host=localhost",USERNAME,PASSWORD);
		
		//PDOのエラー時に例外(PDOException)が発生するように設定
		$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
		
		//構文エラーを発生させる。
		$pdo->exec("updateeee test set name = 'aaa' where id = 1");
		
		//ここは実行されない
		echo "AAAAAAAAAAAA".PHP_EOL;
		
	}catch(PDOException $e){
		
		//エラーメッセージと行番号表示
		echo $e->getMessage()." - ".$e->getLine().PHP_EOL;
		
		
	}
	//ここは実行される
	echo "BBBBBBBBBBBB".PHP_EOL;
setAttributeメソッドの第一引数に「PDO::ATTR_ERRMODE」、第二引数に「PDO::ERRMODE_EXCEPTION」を指定します。
これでPDO関連でエラーが発生した場合は「PDOException」の例外が発生するようになるので、「try~catch」構文で例外をキャッチできます。
実際に実行してみると以下のようになります。
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'updateeee test set name = 'aaa' where id = 1' at line 1 - 248
BBBBBBBBBBBB
エラー発生時の詳細なメッセージとエラーが発生した行番号を表示しています。
catchブロック内のPDOExceptionオブジェクトから「getMessage」と「getLine」メソッドを実行してエラーメッセージと行番号を取得して表示しているというわけです。
例外が発生したので、try内に書いている「AAAAAAAA」というecho文は表示されず、エラーメッセージと、その後の「BBBBBBBBB」というecho文が表示されました。
これでエラー時の対処はできそうですね。

DB関連の処理は色んなテーブルの登録・削除が発生するので例外処理は確実に設定しておきたいものです。
忘れずに設定しておきましょう。

>> 【PDOトランザクション、自動コミットモードをオフ】に進む
>> PHP入門トップに戻る