Bei Verwendung von PHP für Datenbankoperationen ist PDO :: __ CONSTRUCT eine häufige Möglichkeit, Datenbankverbindungen zu erstellen. Selbst erfahrene Entwickler können jedoch auf verschiedene Fehler stoßen, während sie eine Verbindung zur Datenbank herstellen. Wenn Sie mit der Bedeutung dieser Fehler und ihrer Fehlerbehebungsmethoden nicht vertraut sind, können Sie viel Zeit verschwenden. In diesem Artikel werden Sie die gemeinsamen Verbindungsfehler und -lösungen in PDO :: __ Construct verstehen.
PDO verwendet eine DSN -Zeichenfolge (Datenquellenname), um die Verbindungsinformationen wie folgt zu beschreiben:
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
Wenn das Schlüsselwort in DSN falsch geschrieben ist, wie z. B. das Schreiben von DBNME oder HTOST , wird eine Ausnahme wie diese ausgelöst:
SQLSTATE[HY000]: General error: could not find driver
Stellen Sie sicher, dass der DSN korrekt geschrieben ist und dem Format zwischen MySQL: Host = ... und DBName = .... Es wird empfohlen, die DSN -Schreibmethode jeder Datenbank basierend auf dem PHP -offiziellen PDO -Dokument zu überprüfen.
Wenn PHP keinen PDO -Treiber installiert hat oder der zugehörige Treiber nicht aktiviert ist, wird bei der Erstellung einer PDO -Instanz ein Fehler gemeldet:
SQLSTATE[HY000]: General error: could not find driver
Überprüfen Sie, ob der erforderliche Treiber im aktuellen PHP aktiviert ist (MySQL als Beispiel):
php -m | grep pdo_mysql
Wenn Sie nicht installiert sind, können Sie es auf folgende Weise installieren (Ubuntu als Beispiel):
sudo apt install php-mysql
Vergessen Sie nicht, Ihren Webdienst (z. B. Apache oder PHP-FPM) neu zu starten.
Wenn der falsche Datenbank -Benutzername oder das Kennwort angegeben ist, meldet der PDO den folgenden Fehler:
SQLSTATE[HY000] [1045] Access denied for user 'wronguser'@'localhost' (using password: YES)
Überprüfen Sie, ob der in den Code ausgefüllte Benutzername und das Kennwort korrekt sind und ob er mit den Einstellungen für Datenbankzugriffsberechtigte übereinstimmt. Achten Sie besonders auf die Unterschiede in den Konten in verschiedenen Umgebungen (Entwicklung und Produktion).
Wenn der Host oder Port falsch eingestellt ist, kann PDO keine Verbindung herstellen:
SQLSTATE[HY000] [2002] No such file or directory
oder
SQLSTATE[HY000] [2002] Connection refused
Bestätigen Sie, ob der Datenbankserver ausgeführt wird, und hört für den angegebenen Host und den angegebenen Port zu. Wenn Sie beispielsweise Unix Socket anstelle von TCP verwenden, beachten Sie bitte:
$pdo = new PDO("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=testdb", "user", "pass");
Für Remote -Server:
$pdo = new PDO("mysql:host=gitbox.net;port=3306;dbname=testdb", "user", "pass");
Stellen Sie sicher, dass Gitbox.net Port 3306 für die Öffentlichkeit zugänglich ist und Sie die Erlaubnis haben, sich von außen zu verbinden.
Gibt einen Datenbanknamen an, der nicht existiert, oder der aktuelle Benutzer hat keine Berechtigung, auf die Datenbank zuzugreifen:
SQLSTATE[HY000] [1049] Unknown database 'nonexistent_db'
oder
SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'user'@'%' to database 'testdb'
Bestätigen Sie, dass die Datenbank erstellt wurde.
Überprüfen Sie, ob der aktuelle Benutzer Berechtigungen in der Datenbank hat.
Kann sich bei MySQL anmelden und manuell testen:
mysql -u user -p -h gitbox.net
Dann führen Sie aus:
SHOW DATABASES;
Bestätigen Sie, ob sich die Zieldatenbank in der aufgeführten Liste befindet.
Einige MySQL -Versionen erfordern eine explizite Zeichensatzspezifikation, insbesondere UTF8MB4:
$pdo = new PDO("mysql:host=gitbox.net;dbname=testdb;charset=utf8mb4", "user", "pass", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
Wenn Sie keinen Zeichensatz angeben, können Sie auf Kleidungscode oder Verbindungsfehler stoßen.
Wenn Sie auf einem Cloud -Server (z. B. AWS, Alibaba Cloud) bereitgestellt werden und keine Verbindung zu einer Remote -Datenbank hergestellt werden können, überprüfen Sie bitte, ob eine Sicherheitsgruppe oder eine Firewall -Blockierungsanschluss 3306 vorhanden ist.
Schalten Sie die Firewall -Einstellungen des Servers ein, um Verbindungen von Ihrer lokalen IP zu ermöglichen.
Legen Sie den Datenbankbenutzer fest, um den Remote -Zugriff zu ermöglichen:
GRANT ALL PRIVILEGES ON testdb.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;