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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Q&A

解決済

1回答

2652閲覧

PHPでpg_connectの例外処理を実装したい

spon

総合スコア15

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

0グッド

0クリップ

投稿2018/09/22 02:20

編集2018/09/22 03:30

前提・実現したいこと

現在PHPでウェブアプリを作成中です。
Postgresqlへ接続するコードにて例外処理を実装中にエラーが捕捉できない(落ちる/コードが停止する)状況になりました。
何か解決の糸口が御座いましたらご助言頂けますと幸いです。
よろしくお願い致します。

発生している問題・エラーメッセージ

pg_connectで接続を確立する際に、接続文字列が間違えているとエラーになります。
ネットの情報を見ると「pg_last_error() でエラー内容を判断せよ」とありますが、
実際にはpg_connect() を呼び出した時点でPHPが落ちます。

ブラウザには下記の表示がされます。apacheのログにはエラー情報は出力されません。phpのエラーログは出力されません。

このサイトにアクセスできません 接続がリセットされました。

該当のソースコード

php

1 $conn = "host=dbsv01 dbname=postgres user=postgres password=abcdefg"; // ①この接続文字列が間違えている時 2 $link = pg_connect($conn); // ②pg_connectを呼び出すと落ちて 3 if (!$link) { // ③このステップは流れない 4 echo pg_last_error(); 5 }

試したこと

・デバッグ実行で1ステップずつ確認して③は流れず②で落ちていることを確認
・ネットでエラーハンドリングやphp,apache設定などを調査するも有効な答えが見つけられず。
・落ちるのはpg_connectのみならずpg_queryなどpostgresql呼び出し関連は全て同じ現象。

補足情報(FW/ツールのバージョンなど)

Apache/2.4.23 (Win64) PHP/7.1.18
Postgresql 9.3 (開発サーバーにインストール)

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

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

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

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

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

m.ts10806

2018/09/22 03:19

dbname=postgres とありますが、本当にその名前でDB作ったのでしょうか? DB環境回りを一度確認されてみては?あまりそのままの名前でDB作ることってないように思います
spon

2018/09/22 03:32

記載情報に誤りがございましたので修正しました。「pg_last_errorを呼び出した時点でPHPが落ちる」のではなく「pg_connect」を呼び出した時点で落ちます。
spon

2018/09/22 03:33

落ちる(停止する)という書き方が他に表現がありませんでして、try-chatch、set_error_handler、register_shutdown_functionのどれでも捕捉できず、pg_coneectを呼び出した段階で停止します。
spon

2018/09/22 03:35

接続文字列については意図的に適当にしています。接続文字列が間違えていた時にpg_connectでエラ-となり、pg_last_errorにてエラー内容を取得するという実装を試行しているためです。しかし、pg_last_errorを呼び出す以前に、pg_connectで停止してしまうのです。
spon

2018/09/22 03:36

尚、これはpg_connectに限らずpg_queryやpg_query_paramsでも発生します。(正しくない情報を引数に渡すと落ちる)
spon

2018/09/22 03:37

もちろん正しい情報(有効な接続文字列やSELECT文)を引数に指定すると問題なく動作します。
m.ts10806

2018/09/22 03:40

すみません読み違えてました。接続自体のエラー捕捉ですね。
guest

回答1

0

ベストアンサー

pg_last_error
にもありますが、

特定の接続から直近のエラーメッセージ文字列を取得する

つまり、何かしらの接続が成立してる前提でのエラー捕捉となります。
接続自体のエラーととりたければ、
pg_connectのNotesにあるようにor die()でつなぐのが良いかと思います。

PDOで接続すればPDOExceptionがとれるのでtry-catchでも捕捉は可能かとは思います。

投稿2018/09/22 03:46

編集2018/09/22 03:47
m.ts10806

総合スコア80850

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

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

spon

2018/09/22 03:56

die('connection failed')が実行される場合は画面に「connection failed」と出力されます。 しかしながら、「$link = pg_connect($conn) or die('connection failed');」と書いたとしても「connection failed」は出力されません。 何度も同じ表現で恐縮ですが、やはり「pg_connectで落ちる」という表現が一番近いのです。 phpのエラーログは何も出力されません。 そもそもapacheのアクセスログすら出力されてないようです。 とするとphpレベルの話ではなくapacheのスレッド自体が落ちたのでしょうか。
spon

2018/09/22 03:59

尚、「pg_***」のメソッドで落ちる場合を除いてはapacheのアクセスログはきちんと出力されます。また、一般的なエラーが発生した場合にもアクセスログは出力されますし、phpに起因する場合(構文エラーなど)はphpのエラーログも出力されます。
spon

2018/09/22 04:27

PDOで試してみたところエラー時にCatchできました。どうも「pg_***」の不具合のようです。 こだわりはありませんのでPDOに切り替えようと思います。 mts10806様、親切にご回答頂きまして誠にありがとうございました。
m.ts10806

2018/09/22 04:45

解決されたようで何よりですが、私の回答で直接解決に至っていないのであればご自身で具体的な回答を書いて解決済みとされた方が同件で困っている人のためにもなるかと思いますので、ご検討ください。
spon

2018/09/25 09:16

根本的な解決方法は不明でして依然として「pg_***」で誤ったクエリ等を投げると異常終了してしまいます。 mts10806様からの回答で「PDOで接続すれば~」とのヒントを得て、代替手段にて要件を満たしたというのが解決の理由です。 PDOを使用するという発想がなく、「pg_***」が前提で「本事象をなんとか解決しないと」という頭でいたものですから、良い気付きを与えていただきました。 今後、同様の事象が発生した方で「pg_***」が必須の場合には残念ながらお力になれる情報は提供できませんが、選択が自由であれば私同様PDOへの書き換えを検討頂ければと思います。
m.ts10806

2018/09/25 09:17

了解です。 解決に至れたようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問