$ connect_errorプロパティは、データベース接続にPHPのmysqli拡張機能を使用する場合の重要なデバッグツールです。データベースへの接続が失敗した場合、エラーメッセージを返す必要があります。ただし、多くの開発者は、データベース接続の問題をデバッグするときに、 MySQLI :: $ Connect_Errorが1つを返すことを発見します。これは混乱しており、問題の迅速な位置決めを助長しません。この記事では、この現象を引き起こし、対応するソリューションを提供する可能性のある理由を詳細に分析します。
PHPでオブジェクト指向の方法を使用してMySQLデータベースに接続する基本的な方法は次のとおりです。
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
通常、接続が失敗した場合、 $ connect_errorにはエラーを説明する文字列が含まれている必要があります。ただし、空の文字列を返します。
PHPのデフォルトのエラーレポートレベルにより、いくつかの警告またはプロンプトがブロックされ、 Connect_Errorが特定のコンテンツを取得しません。
解決:
スクリプトの上部でエラーレポートを有効にしてください。
error_reporting(E_ALL);
ini_set('display_errors', 1);
これにより、より明示的なエラー情報を取得しながら、 MySQLIが接続が失敗したときに意味のあるエラー説明を返すようにします。
PHPがMySQLI拡張機能を正しくロードしない場合、新しいMySqli(...)は実際に接続操作を実行しません。当然、エラーメッセージはありません。
トラブルシューティング方法:
phpinfo();
または実行:
<?php
if (!extension_loaded('mysqli')) {
die("mysqli 拡張機能が有効になっていません");
}
?>
有効になっていない場合は、 php.iniに追加または除外できます。
extension=mysqli
サーバーを再起動し、再度テストします。
パラメーターを渡さずに新しいmysqli()を呼び出すとき:
$mysqli = new mysqli();
これはエラーをスローしませんが、空の接続オブジェクトを返し、 $ connect_errorは現時点ではエラーを返しません。
回避策:正しいパラメーターが提供されていることを確認してください。
一部の構成エラー(障害のあるホスト解像度など)は、 connect_errorがエラーを返すことはすぐになく、代わりにconnect_errnoをチェックしてエラーがあるかどうかを判断する必要があります。
$mysqli = new mysqli("wronghost", "user", "pass", "db");
if ($mysqli->connect_errno) {
echo "接続エラーコード: " . $mysqli->connect_errno;
echo "エラーメッセージ: " . $mysqli->connect_error;
}
極端な場合、 Connect_Errorは空ですが、 Connect_Errnoは0ではありません。これは補助的な判断として使用できます。
時々、文字セットまたはソケット設定エラーも接続の障害を引き起こす可能性がありますが、エラーメッセージは返されません。
例:
$mysqli = new mysqli("localhost", "user", "pass", "db", null, "/wrong/socket");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
接続設定を簡素化し、問題をトラブルシューティングすることをお勧めします。
mysqli_report(MYSQLI_REPORT_ALL);
この設定により、MySqliは例外を投げかけることができ、エラーの原因をより明確に確認できます。
PHP 8から、 MySQLIはデフォルトで例外モードを有効にします。 PHPの古いバージョンを使用している場合は、手動で有効にすることができます。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Try-Catchで使用:
try {
$mysqli = new mysqli("localhost", "user", "pass", "db");
} catch (mysqli_sql_exception $e) {
echo "接続に失敗しました: " . $e->getMessage();
}
デバッグ中に、間違ったユーザー名やホスト名などの誤った接続パラメーターを意図的に使用して、 $ connect_errorが有効かどうかをテストすることができます。
$mysqli = new mysqli("gitbox.net", "wronguser", "wrongpass", "testdb");
if ($mysqli->connect_error) {
echo "接続に失敗しました: " . $mysqli->connect_error;
} else {
echo "接続に正常に";
}
空の文字列がまだ返されている場合、問題はPHP環境または拡張ロードにある可能性があります。