데이터베이스 작업에 PHP를 사용하는 경우 PDO :: __ 구성은 데이터베이스 연결을 만드는 일반적인 방법입니다. 그러나 숙련 된 개발자조차도 데이터베이스에 연결하는 과정에서 다양한 오류가 발생할 수 있습니다. 이러한 오류의 의미와 문제 해결 방법에 익숙하지 않은 경우 많은 시간을 낭비 할 수 있습니다. 이 기사에서는 PDO :: __ 구성 의 공통 연결 오류 및 솔루션을 이해하게됩니다.
PDO는 DSN (데이터 소스 이름) 문자열을 사용하여 연결 정보를 설명합니다.
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
DBNME 또는 HTOST 작성과 같이 DSN의 키워드가 틀린 경우 이와 같은 예외가 발생합니다.
SQLSTATE[HY000]: General error: could not find driver
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
그 후 웹 서비스 (예 : 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;