質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

2回答

7723閲覧

PDO::ERRMODE_EXCEPTIONを使う方法と使わない方法

aaaaaaaa

総合スコア501

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2016/07/04 11:25

編集2016/07/05 02:19

データベースに接続するときに何かしらの障害が発生したら、ATTR_ERRMODEがERRMODE_SILENTの場合、DBに接続するたびに
PDO::errorCodeの添え字0から取得できる共通のエラーコードを条件分岐で使い、番号が「00000]でなければエラーとみなすような処理を行います。
ここで疑問です。接続するたびにそのような処理を記述するのは面倒なので例外処理を利用しているのですが、その例外処理の利用法は、
下記のうちどちらの方法がおすすめですか。また具体的にどのような違いがあるのかを教えてください。

ERRMODE_EXCEPTIONで例外を投げる方法

php

1try { 2 3//接続 4$dsn = "dbname=aaaa;host=localhost"; 5$user = "root"; 6$password = ""; 7$dbh = new PDO($dsn, $user, $password); 8$dbh->query("set names utf8"); 9 10$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 11 12print "接続しました。"; 13//接続解除 14$dbh = null; 15 16} catch(PDOexception $e) { 17 print "ただいま障害が発生しており大変ご迷惑おかけしております。".mb_convert_encoding($e->getMessage(),'UTF-8','JIS,ASCII,CP51932,SJIS-win'); 18 exit(); 19} 20 21

ERRMODE_EXCEPTIONは、使わない方法

php

1try { 2 3//接続 4$dsn = "dbname=aaaa;host=localhost"; 5$user = "root"; 6$password = ""; 7$dbh = new PDO($dsn, $user, $password); 8$dbh->query("set names utf8"); 9 10print "接続しました。"; 11//接続解除 12$dbh = null; 13 14} catch(exception $e) { 15 print "ただいま障害が発生しており大変ご迷惑おかけしております。"; 16 exit(); 17} 18

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

yambejp様の回答の通り、後者はエラーが発生しても例外が投げられません。

例外的(PHP の例外機構ではなく、言葉通りの意味ですw)に、
PDOクラスのコンストラクタ(new PDO(...)のこと)だけは、
ATTR_ERRMODE の設定によらずDBへの接続に失敗した場合にPDOExceptionを投げます。
http://php.net/manual/ja/pdo.error-handling.php

PDO::__construct() は、接続に失敗した場合は常に PDOException をスローします。 これは、現在設定されている PDO::ATTR_ERRMODE が何であっても同じです。

後者のコードでは、それ以降の操作では一切、DB関連の例外が投げられる事はありません。


ちなみに、ATTR_ERRMODEの設定を変更する別の手段として、
PDOクラスのコンストラクタの第4引数で指定する」
という方法もあります。
http://php.net/manual/ja/pdo.construct.php

具体的には、以下のように記述します。

php

1$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

どちらの方法も動作的な違いはありませんので、好みで選択すれば良いと思います。


いずれの方法を選択するにしても、PDOオブジェクトを生成する処理は関数化するなどしてソースコード内の1箇所だけに記述する事をお勧めします。
そうすれば、エラーモードの「設定し忘れ」を防ぐ事ができるからです。

投稿2016/07/04 16:27

編集2016/07/04 16:30
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/07/05 03:14

ご回答有難うございます。 申し訳ありません。回答文にいくつか誤記がありましたので修正しました。 上記のソース(ERRMODE_EXCEPTIONで例外を投げる方法)は、接続だけでなく接続中に発生した例外も投げてくれるが、 もう一方のソース(ERRMODE_EXCEPTIONは、使わない方法 )は、接続以外の例外は、投げないということですね。 またPDOクラスの第四引数に配列を指定するのとERRMODE_EXCEPTIONで例外を投げる方法は、動作は同じであるが前者の方がソースの記述が軽減できると認識しておりますが合っていますか。
KiyoshiMotoki

2016/07/05 05:47

> 上記のソース(ERRMODE_EXCEPTIONで例外を投げる方法)は、接続だけでなく接続中に発生した例外も投げてくれるが、 もう一方のソース(ERRMODE_EXCEPTIONは、使わない方法 )は、接続以外の例外は、投げないということですね。 おっしゃる通りです。 > またPDOクラスの第四引数に配列を指定するのとERRMODE_EXCEPTIONで例外を投げる方法は、動作は同じであるが前者の方がソースの記述が軽減できると認識しておりますが合っていますか。 たった1行の違いではありますが、おっしゃる通りです。 しかし、だからといって前者の記法を推奨するつもりはありません。 回答にも記載させていただきましたが、そこはご自身の好み次第です。
guest

0

後者ってエラーメッセージ受け取れなくない?

投稿2016/07/04 12:56

yambejp

総合スコア114825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問