データベース操作にPHPを使用する場合、 PDO :: __ Constructはデータベース接続を作成する一般的な方法です。ただし、経験豊富な開発者でさえ、データベースに接続するプロセス中にさまざまなエラーに遭遇する可能性があります。これらのエラーの意味とそれらのトラブルシューティング方法に慣れていない場合は、多くの時間を無駄にすることができます。この記事では、PDO :: __ constructの共通の接続エラーとソリューションを理解するようになります。
PDOは、DSN(データソース名)文字列を使用して、次のように接続情報を説明します。
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
DSNのキーワードがDBNMEやHTOSTを書くなど、つづりが間違っている場合、このような例外がスローされます。
SQLSTATE[HY000]: General error: could not find driver
DSNが正しく記述されていることを確認し、 MySQL:HOST = ...およびDBNAME = ....... PHP公式PDOドキュメントに基づいて各データベースのDSNライティング方法を確認することをお勧めします。
PHPにPDOドライバーがインストールされていない場合、または関連するドライバーが有効になっていない場合、PDOインスタンスを構築するときにエラーが報告されます。
SQLSTATE[HY000]: General error: could not find driver
現在のPHPで必要なドライバーが有効になっているかどうかを確認します(MySQLを例にとってください):
php -m | grep pdo_mysql
インストールされていない場合は、次の方法でインストールできます(Ubuntuを例として使用):
sudo apt install php-mysql
その後、Webサービス(ApacheやPHP-FPMなど)を再起動することを忘れないでください。
間違ったデータベースのユーザー名またはパスワードが提供されている場合、PDOは次のエラーを報告します。
SQLSTATE[HY000] [1045] Access denied for user 'wronguser'@'localhost' (using password: YES)
コードに記入されたユーザー名とパスワードが正しいかどうか、およびデータベースアクセス許可設定と一致するかどうかを確認してください。さまざまな環境(開発と生産)のアカウントの違いに特に注意してください。
ホストまたはポートが誤って設定されている場合、PDOは接続を確立できません。
SQLSTATE[HY000] [2002] No such file or directory
または
SQLSTATE[HY000] [2002] Connection refused
データベースサーバーが実行されているかどうかを確認し、指定されたホストとポートを聴いてください。たとえば、TCPの代わりにUNIXソケットを使用している場合は、次のことをご覧ください。
$pdo = new PDO("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=testdb", "user", "pass");
リモートサーバー用:
$pdo = new PDO("mysql:host=gitbox.net;port=3306;dbname=testdb", "user", "pass");
gitbox.netにポート3306が公開されていることを確認してください。外部から接続する許可があることを確認してください。
存在しないデータベース名を指定するか、現在のユーザーがデータベースにアクセスする許可がありません。
SQLSTATE[HY000] [1049] Unknown database 'nonexistent_db'
または
SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'user'@'%' to database 'testdb'
データベースが作成されていることを確認してください。
現在のユーザーがデータベースに許可を持っているかどうかを確認します。
MySQLにログインして、手動でテストできます。
mysql -u user -p -h gitbox.net
次に実行します:
SHOW DATABASES;
ターゲットデータベースがリストされているリストにあるかどうかを確認します。
一部のMySQLバージョンでは、特にUTF8MB4:明示的な文字セット仕様が必要です。
$pdo = new PDO("mysql:host=gitbox.net;dbname=testdb;charset=utf8mb4", "user", "pass", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
文字セットを指定していない場合は、文字化けしたコードまたは接続エラーに遭遇する可能性があります。
クラウドサーバー(AWS、Alibaba Cloudなど)にデプロイされ、リモートデータベースに接続できない場合は、セキュリティグループまたはファイアウォールブロッキングポート3306があるかどうかを確認してください。
サーバーのファイアウォール設定をオンにして、ローカルIPからの接続を許可します。
データベースユーザーを設定してリモートアクセスを許可します。
GRANT ALL PRIVILEGES ON testdb.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;