Uncaught Exception: Connect to DB failed
php8.1 へのバージョンアップで陥る問題の一つ.
PostgreSQL を使っている場合,これがこのバージョンアップで最も面食らう仕様変更ではないか?
pg_connect の返り値がリソースから PgSql\Connection クラスのインスタンスに変更
pg_connect の返り値がリソースから PgSql\Connection クラスのインスタンスに変わった.
テスト環境で 8.1 へ上げてみるといきなりシステムが動かなくなるのでびっくりする.
通常,DBへの接続は接続確認を返り値を持って行う.当たり前の話だが,この返り値がリソースだという前提でプログラムしてあるので,インスタンスなどが返ってくると当然の如く,リソースではないので失敗した時の動作になる.
エラーが出るようになっていなかったので,なかなかこの問題に気づかず困った.
バージョンアップ時には
PHP 8.1.x で推奨されなくなる機能
を参考にしているのだが,ここではそのことに触れていなかったので余計に気づけなかったわけだ.
全ての pgsql_*() 関数に対して、接続リソースを渡さないことは推奨されなくなりました。
とは書いてあるのだが.
いや,不満を言っているわけではない.
開発者やドキュメントを書かれている方々には感謝しかないので,少しではあるが投稿することによって,他の方に貢献できればと思って書いている.
Uncaught Exception: Connect to DB failed
返り値が全くの別物に変わるだけなので,エラーメッセージとしては現れない.
そこがまた厄介な仕様変更だった.
PHP を 8.1 にしてシステムにログインできないとか,データベースに接続できないという場合は真っ先にここを疑うことをお勧めする.
例えば,
$conn = pg_connect($connstring, $option);
if (!is_resource($conn)) {
// 接続できなかったときの処理
}
という PHP があった場合,
$conn = pg_connect($connstring, $option);
if (!$conn) {
// 接続できなかったときの処理
}
のように書き替える必要がある.
実際にはこの書き替えだけで終わるはずもなく,多重化とかしているとさらに修正箇所が多くなる.
リソースだとうまく動いていた箇所が,クラスのインスタンスにかわったせいで動かなくなる箇所があったりすると大変なことになる...
ご質問等ありましたら,お手数ですが弊社の個人情報保護方針をお読み頂いた上でフォームからお願い致します.
※このページと無関係な内容のセールスはご遠慮ください.