質問するログイン新規登録

質問編集履歴

4

誤字修正

2017/10/24 09:24

投稿

mi-c3
mi-c3

スコア20

title CHANGED
File without changes
body CHANGED
@@ -37,10 +37,10 @@
37
37
  prepare()でDBにアクセスするかどうかは、ネットを見ると意見が別れているようです。なんで???
38
38
  まあデータベースハンドラのメソッドなんでDBにアクセスする可能性があるので、一応PDO::errorInfo()を組み込むことにします。
39
39
  ★追記
40
- prepare()でsyntacs error とか存在しないテーブルを指定しても、PDO::errorInfo()の返り値がfalseになることはなかった
40
+ prepare()で変な構文だったり存在しないテーブルを指定しても、prepareの返り値がfalseになることはありませんした
41
- 環境の問題で、ネットワーク遮断するとどうなるかとか確認できませんでしたが、
41
+ 環境の問題で、ネットワーク遮断するとどうなるかとか確認できませんでしたが、
42
42
  まあおそらくDBにはアクセスしていないものと思うことにしました。
43
- 正直、phpの公式サイトに書いてるサンプルコードは役に立ちませんね。
43
+ 正直、phpの公式サイトに書いてるサンプルコードは役に立ちませんね。DBのドライバによるのかと思いますが、Postgresqlの場合再現できません。
44
44
 
45
45
 
46
46
  質問が3つありますが、1つでもお答えいただければ助かります。

3

追記

2017/10/24 09:24

投稿

mi-c3
mi-c3

スコア20

title CHANGED
File without changes
body CHANGED
@@ -36,7 +36,11 @@
36
36
  よくわからないですが、対応方法は決めました。
37
37
  prepare()でDBにアクセスするかどうかは、ネットを見ると意見が別れているようです。なんで???
38
38
  まあデータベースハンドラのメソッドなんでDBにアクセスする可能性があるので、一応PDO::errorInfo()を組み込むことにします。
39
+ ★追記
40
+ prepare()でsyntacs error とか存在しないテーブルを指定しても、PDO::errorInfo()の返り値がfalseになることはなかったです。
41
+ 環境の問題で、ネットワーク遮断するとどうなるかとか確認できませんでしたが、
42
+ まあおそらくDBにはアクセスしていないものと思うことにしました。
43
+ 正直、phpの公式サイトに書いてるサンプルコードは役に立ちませんね。
39
44
 
40
45
 
41
-
42
46
  質問が3つありますが、1つでもお答えいただければ助かります。

2

追記

2017/10/24 09:09

投稿

mi-c3
mi-c3

スコア20

title CHANGED
File without changes
body CHANGED
@@ -1,26 +1,42 @@
1
- phpのPDOを使ってDBを更新しているプログラムがあります。
1
+ phpのPDOを使ってDBを更新しているプログラムがあり、errorInfo()を使ってエラー情報を取得したいと思っています。
2
- エラーコードを取得するために、PDO::errorInfo()を使う予定ですが、
3
- erroInfo()による取得できた配列の2番目に「ドライバ固有のエラーコード」を取れるようです。
4
- http://php.net/manual/ja/pdo.errorinfo.php
5
2
 
6
3
  ※エラー発生時にexceptionを発生する設定にすれば簡単に行くのは知っていますが、
7
4
  諸事情によりerrorInfo()を使った方法でしか実現したいです。
8
5
 
9
6
  <質問1>
7
+ エラーコードを取得するために、PDO::errorInfo()を使う予定ですが、
8
+ erroInfo()による取得できた配列の2番目に「ドライバ固有のエラーコード」を取れるようです。
9
+ http://php.net/manual/ja/pdo.errorinfo.php
10
10
  しかし、どんだけWebを探しても、「ドライバ固有のエラーコード」の一覧を見つけられません。
11
11
  DBはPostgresです。
12
12
  ご存知のかた、URLを教えていただけないですか。
13
13
 
14
+ ★追記
15
+ 相変わらずわからないです。正直、「ドライバ固有のエラーメッセージ」が出れば問題ないと思うので、よしとします。
16
+ もし、分かる人がいれば教えてください。
17
+
14
18
  <質問2>
15
19
  また、キー重複になるようなInsert文を作成し、execute実行後にerrorInfo()を動かしてみましたが、
16
20
  何故か「SQLSTATE エラーコード」が正常(00000)で帰ってきており、
17
21
  「ドライバ固有のエラーメッセージ」にはキー重複に関するメッセージが帰ってきました。
18
- これはどうしてでしょうか
22
+ なぜ、00000が帰っきたのでしょうか
19
23
  PDOStatement::errorInfo()を使えば、正しい「SQLSTATE エラーコード」を取得できるのは確認していますが、http://php.net/manual/ja/pdo.errorinfo.phpを見てもPDO::errorInfo()のだめな理由がよくわかりません。
20
24
 
25
+ ★追記
26
+ おそらくですが、わかりました。
27
+ PDO::errorInfo()は、「データベースハンドラにおける直近の操作に関連する SQLSTATE を取得する」ようです。ですので、PDOのnew したオブジェクトのメソッド(prepare、rollback、commitなど)を実行したときに発生したエラーのみ取得できると思われます。
28
+ PDOStatement::errorInfo()はprepareStatementオブジェクトのメソッドを実行(executeなど)を実行したときに発生したエラーのみ取得できるエラーのようですね。
29
+
21
30
  <質問3>
22
31
  prepare()でエラーが発生する可能性がわかったので、prepare()の実行結果に問題があった場合(返り値がfalse)、PDO::errorInfo()を使って情報を取得しようとしています。
23
32
  http://php.net/manual/ja/pdo.errorinfo.php にもある通り、エラー情報を取得できる記述がありますが、<質問2>に書いたとおり問題が発生したのにも関わらず「SQLSTATE エラーコード」が正常(00000)となることを懸念しています。
24
33
  ちゃんと「SQLSTATE エラーコード」を取得できるのでしょうか。
25
34
 
35
+ ★追記
36
+ よくわからないですが、対応方法は決めました。
37
+ prepare()でDBにアクセスするかどうかは、ネットを見ると意見が別れているようです。なんで???
38
+ まあデータベースハンドラのメソッドなんでDBにアクセスする可能性があるので、一応PDO::errorInfo()を組み込むことにします。
39
+
40
+
41
+
26
42
  質問が3つありますが、1つでもお答えいただければ助かります。

1

誤字の修正

2017/10/24 07:52

投稿

mi-c3
mi-c3

スコア20

title CHANGED
File without changes
body CHANGED
@@ -3,6 +3,9 @@
3
3
  erroInfo()による取得できた配列の2番目に「ドライバ固有のエラーコード」を取れるようです。
4
4
  http://php.net/manual/ja/pdo.errorinfo.php
5
5
 
6
+ ※エラー発生時にexceptionを発生する設定にすれば簡単に行くのは知っていますが、
7
+ 諸事情によりerrorInfo()を使った方法でしか実現したいです。
8
+
6
9
  <質問1>
7
10
  しかし、どんだけWebを探しても、「ドライバ固有のエラーコード」の一覧を見つけられません。
8
11
  DBはPostgresです。
@@ -20,4 +23,4 @@
20
23
  http://php.net/manual/ja/pdo.errorinfo.php にもある通り、エラー情報を取得できる記述がありますが、<質問2>に書いたとおり問題が発生したのにも関わらず「SQLSTATE エラーコード」が正常(00000)となることを懸念しています。
21
24
  ちゃんと「SQLSTATE エラーコード」を取得できるのでしょうか。
22
25
 
23
- 長々と書きしたが、よろしくます。
26
+ 質問が3つありが、1つでも答えただければ助かります。