PHP5のPDOはtry~catch構文に対応しているのですが、どのように使えばいいのでしょうか?
SQLを発行する度に、もしくはSQLを発行するメソッドの度に、try~catchしなければいけないのでしょうか?とても面倒です。
現時点では、例外が発生した時にする処理といえば、
trigger_error($e->getMessage(), E_USER_ERROR);
みたいに、trigger_error するだけです。
であれば、そもそもcatchせずに、uncaught のまま勝手にエラったままに放っておいても問題ないのでしょうか?
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
try{ }catch{ }は、トランザクションに対応しているデータベースへ接続するときに、真価を発揮します。
たとえば、SQLite3 や MySQL5.0などです。insert文や、update文などデータを変更するSQL文を発行する前に、
PDO::beginTransaction() とし、以降の処理をtry構文内で行います。
途中でエラーがあった場合に、catch構文内へ処理が飛び、そこで
PDO::rollBack() を呼ぶと途中までの処理をキャンセルすることができます。
エラーが無ければ、try構文の最後に
PDO::commit() を発行して、全ての処理を有効にします。
http://jp.php.net/manual/ja/pdo.transactions.php
manual に例文もありますのでよく読んで使ってみて下さい。
select文では、データに変更が無いので、PDO::rollBack() しても意味がありません。
また、MySQL4.0では、トランザクションに対応していないので、PDO::rollBack() を呼ぶと致命的エラーとなってしまいます。
これらでは、try{ }catch{ } よりは、例外キャッチ関数を使う方が、エラー時の処理が一カ所に集約されるのでよいでしょう。
いずれの操作も行わずエラー放置というのは、プログラムの異常終了を招いたうえに、何でエラーが出てるのか解らなくなったりしますので、よくないと思います。
例外キャッチ関数を使うには、PDOのエラーは、例外を投げるモードにしておいて(他の通常のエラーと区別しやすくする)
PDO::setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
さらに、例外をキャッチする関数を定義しておくと、どこで例外が発生しても、エラー表示用の記述は一カ所で済みます。
ーーー記述例
<?php
function exception_handler($e){
print '<div style="border:red 3px double;"><em>エラー</em> '.$e->getMessage() . '</div>';
}
set_exception_handler('exception_handler') ;
$dbh = new PDO('sqlite:sql_db', '', '');
if( ! is_object( $dbh) ){
echo "接続エラー";
exit;
}
echo "接続しました\n";
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 以降、いろいろ操作、PDOのエラーが出たときは、exception_handler() が実行される。
// rollBackの必要性がなければ try文は不要。
// try文を書いたなら、exception_handler()は呼ばれなくなるので、catchしなければならない。
?>
参考URL:http://jp.php.net/manual/ja/book.pdo.php
ご回答ありがとうございます。
MySQL5ですので、トランザクションを使っております。その際には、もちろん、catch して、rollBackしております。
それ以外の場合は、trigger_error するだけなので、try~catchは行数もかさんで邪魔だなと思っていたのですが、exception_handler で捕捉してやればいいのですね。ありがとうございました。
他の方の意見も聞いたのですが、捕捉されない例外はuncaught exception エラーを起こすので、捕捉後trigger_error するくらいなら、そのまま放置してもよいとの答えでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Java Javaのソースコード作成が難しいです... 10 2022/11/11 14:06
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- オープンソース AWSドメイン名でApacheテスト・ページを表示させる方法を教えて下さい。 1 2023/04/26 15:59
- その他(SNS・コミュニケーションサービス) 爆サイやっていたら、下のような文字が出ました! これは何なのでしょうか? nginx error! 1 2023/06/09 12:27
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォントの色を変えるには?
-
PHPで、エラーがない場合のみ画...
-
トランザクションが原因?DBに...
-
「@$変数」の「@の意味は?」
-
PHPでfatal errorが出ても無視...
-
fsockopenの例外について
-
phpでget_headers()が使えない?
-
php pear mdb2に質問です。
-
PHP8を使うと、大量のWarningが...
-
file_get_contents使用時のエラ...
-
PHPページの中に「結構」という...
-
502 Bad Gatewayの解決方法
-
ASPをPHPに移植したいですが、...
-
IIS/PHPのサイトでたまにCGIエ...
-
PHP、unpack関数でのエラー
-
require_once で読み込まれたか?
-
メールアドレスが存在するか確...
-
iframeからのアクセスか、ブラ...
-
openssl_pkcs7_encryptについて
-
bindValueエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの色を変えるには?
-
[php初心者]サイトを見てデータ...
-
「@$変数」の「@の意味は?」
-
トランザクションが原因?DBに...
-
パースエラーとは?
-
PHP8を使うと、大量のWarningが...
-
error_reporting(0);にも関わら...
-
PHPでfatal errorが出ても無視...
-
PHPでネットワークドライブのop...
-
ある条件に当てはまったときに...
-
PHPにて外部サイト内容が取得不...
-
ワードプレスサイト PHP8.0.25...
-
PHPで、エラーがない場合のみ画...
-
bindValueエラー
-
SELECTの値を保持する
-
これは例外処理でしょうか?
-
phpでクラスのメソッドで同名の...
-
phpのエラー(T_LNUMBER)について
-
phpのrenameでエラーが出ます
-
クラスの中でincludeするとき、...
おすすめ情報