PDOException "Treiber konnte nicht gefunden werden"


292

Ich habe gerade Debian Lenny mit Apache, MySQL und PHP installiert und erhalte eine PDOException could not find driver.

Dies ist die spezifische Codezeile, auf die es sich bezieht:

$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS)

DB_HOST, DB_NAME, DB_USER, Und DB_PASSsind Konstanten , die ich definiert haben. Es funktioniert gut auf dem Produktionsserver (und auf meinem vorherigen Ubuntu Server-Setup).

Hat das etwas mit meiner PHP-Installation zu tun?

Das Durchsuchen des Internets hat nicht geholfen, ich bekomme nur Expertenaustausch und Beispiele, aber keine Lösungen.


21
Schauen Sie in Ihre php.ini' file and uncomment Erweiterung = php_pdo_mysql.dll . The path to your Die Datei php.ini` finden Sie in Ihrer phpinfo ().
Styfle

3
Wenn Sie diesen Fehler erhalten und GoDaddy Ihr Host ist, melden Sie sich bei Ihrem Administratorkonto an. Hosting-Details-> Programmiersprachen. Aktualisieren Sie Ihre PHP-Version auf die neueste oder mindestens 5.4
Joe

@ Joe Ich habe ein Upgrade durchgeführt, erhalte aber immer noch einen Fehler (GoDaddy)
Eugen Sunic

@styfle 1up, Auf einem Linux-Rechner habe ich eingestellt extension=msql.sound es funktioniert!
AjayKumarBasuthkar

Für wen es wichtig sein könnte: Wenn Sie PHP 7.1+ auf Docker verwenden, können Sie docker execin den Container und ausführen docker-php-ext-install pdo pdo_mysql.
Cleybertandre

Antworten:


240

Sie benötigen ein Modul namens pdo_mysql. Auf der Suche nach folgenden Informationen in phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

2
@ZZ Coder Dies ist in phpinfo () nicht vorhanden. Wissen Sie, wie ich installieren kann pdo_mysql?
Mike Moore

14
@letseatfood ... Wie hast du das herausgefunden? Ich habe das gleiche Problem!
Hristo

17
Ich kann das Ubuntu-Paket "php5-mysql" für die Installation der PDO-Unterstützung für MySQL empfehlen
Tom Carver

3
Beachten Sie, dass für diejenigen, die Apache oder einen anderen Webserver verwenden, Apache neu sudo systemctl restart httpd.service
gestartet werden

50
Für Ubuntu 16.04 und PHP7 verwendensudo apt-get install php-mysql
Ivan Marjanovic

199

Der dsn in Ihrem Code zeigt an, dass Sie versuchen, eine Verbindung mit dem MySQL-Treiber herzustellen. Ihre Fehlermeldung zeigt an, dass dieser Treiber nicht verfügbar ist.

Überprüfen Sie, ob Sie die MySQL-Erweiterung auf Ihrem Server installiert haben.

In Ubuntu / Debian suchen Sie nach dem Paket mit:

dpkg --get-selections | grep php | grep mysql

Installieren Sie das php5-mysql-Paket, wenn Sie es nicht haben.

In Ubuntu / Debian können Sie verwenden:

  • PHP5: sudo apt-get install php5-mysql
  • PHP7: sudo apt-get install php7.0-mysql

Um es zum Laufen zu bringen, müssen Sie Ihren Webserver neu starten:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart

3
ahh ... der Neustart hat mich gebissen!
KOGI

Ich hatte das gleiche Problem, stellen Sie sicher, dass Sie php5-fpm neu starten!
Eko3alpha

Verbrachte fast eine ganze Nacht damit, dies zu knacken, bis ich deine Antwort sah. Hatte alles richtig gemacht, aber vergessen, Apache neu zu starten.
Mugoma J. Okomba

php-mysql ist bereits die neueste Version (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Wenn ich versuche, den Befehl sudo apt-get install php-mysql in Ubuntu 16.04 mit nginx php fpm auszuführen, starte ich auch das php fpm neu und starte dann das nginx neu.
Prashant Barve

Derzeit scheint es php-mysql und php7.1-mysql zu sein. Hoffentlich ist dies das Muster, das sich vorwärts bewegt.
John P

83

Update : Neuere Versionen sollten php-sqlite3Paket anstelle von verwenden php5-sqlite. Verwenden Sie dies also, wenn Sie eine aktuelle Ubuntu-Version verwenden:

sudo apt-get install sqlite php-sqlite3

Die ursprüngliche Antwort auf die Frage ist hier:

sudo apt-get install sqlite php5-sqlite
sudo /etc/init.d/apache2 restart

Wenn in phpinfo () die Zeile pdo_sqlite nicht angezeigt wird (in meinem Fall auf meinem Ubuntu-Server), müssen Sie nur die obigen Zeilen ausführen, und schon kann es losgehen.


57
Warum haben Sie Anweisungen für SQLite gegeben, wenn das OP MySQL verwendet?
Andrew Ensley

7
@ Andrew Wenn Sie verwenden pdo_sqliteund nicht installiert haben, erhalten php5-sqliteSie nur eine PDOExceptionohne Informationen über fehlendes SQLite und versuchen, php5-mysqlzweimal zu installieren .
Aitch

2
Beachten Sie, dass php5-sqlite veraltet ist und möglicherweise nicht mehr für Ihr System verfügbar ist, dh Ubuntu 16.04. Installieren Sie stattdessen php-sqlite3.
Matthias

2
@briankip Natürlich, wenn Sie versuchen, eine Verbindung zu SQLite herzustellen, und dieser Treiber fehlt. Das OP versucht jedoch, eine Verbindung zu MySQL herzustellen. Die Installation von SQLite würde / konnte sein Problem nicht lösen.
Andrew Ensley

2
@ AndrewEnsley. Der Titel dieser Seite ist der Fehler, den jeder unabhängig von seiner Datenbankplattform erhält. Infolgedessen hat diese Seite den höchsten Google-Suchrang, wenn Sie nur den Fehler googeln. Daher sollte IMO jede Antwort auf diese Frage, die für andere Datenbanken relevant ist, hier willkommen sein. Wenn sie nicht für das OP arbeiten, soll es so sein ... Das OP muss diese Antworten nicht akzeptieren. Das bedeutet nicht, dass diese Antwort für andere, die die Fehlermeldung im Titel untersuchen, die diese Frage mit Zoltars Suchrang versehen hat, nicht "nützlich" ist. +1
Elrobis

34

Für neuere Versionen von Ubuntu mit PHP 7.0 erhalten Sie das php-mysqlPaket:

sudo apt-get install php-mysql

Starten Sie dann Ihren Server neu:

sudo service apache2 restart

Ich denke, heutzutage muss man mit der Version sudo apt-get install php7.2-mysql
Stan Sokolov

25

Ich hatte das gleiche Problem. Die Lösung hängt vom Betriebssystem ab. In meinem Fall habe ich Debian, um es zu lösen:

  • Aktualisierte meine PHP-Version von ( PHP5 auf PHP7 )
  • Installieren Sie php-mysql und php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • Ich habe meinen php.iniStandort unter /etc/php/7.0/apache2/php.ini bearbeitet

    uncomment the line : extension=php_pdo_mysql.dll
  • Starten Sie dann Apache neu:

    service apache2 restart

Dies löst mein Problem


Als beiseite wie ich diejenigen , die dies genügt nicht ganz gefunden und wollen nicht vollständig durch die einzelnen Schritte gehen php5 zu entfernen , bevor diese php7 Überprüfung funktioniert: a2dismod php5, a2enmod php7.0und service apache2 restartbekam schließlich sichern mich und läuft.
depwl9992

21

Auf meinem Windows-Computer musste ich den absoluten Pfad zum Erweiterungsverzeichnis in meiner php.ini angeben:

extension_dir = "c:\php5\ext"


2
Ich habe gerade bestätigt, dass dies wahr ist (Win2008). Seltsam - die anderen Erweiterungen funktionieren nur mit den empfohlenen extension_dir = "ext", aber nicht mit dieser.
Scipilot

hier gilt das gleiche. fügte den Pfad hinzu und begann zu arbeiten. Windows10, php7.1
Chris Gibb

14

Unter Ubuntu einfach ausführen

sudo apt-get install php5-mysql

1
Ich war hinter einem Symfony2 und Ubuntu. Pdo_mysql wurde nicht gefunden ([PDOException] konnte Treiber nicht finden). Dies löste das Problem.
Reinherd

2
Für mich fehlte Postgresql, so dass es endete:sudo apt-get install php5-pgsql
Kzqai

@ Kzqai 2:30 Uhr jetzt und Sie haben gerade mein Problem gelöst, ich habe nicht MySQL verwendet, ich habe Postgres verwendet (> ლ)
Dheeraj

9
sudo apt-get install php-mysql 

funktionierte gut auf Ubuntu und PHP 7


Es hat bei mir funktioniert, obwohl ich nicht php7 sondern php5.6 benutze. Aber ich habe 7 installiert. Ich habe 5.6 später installiert und darauf umgestellt, ohne php7 zu deinstallieren
Mubashar Abbas

9

Überprüfen Sie, ob das Modul mit verfügbar ist php -m | grep pdo_mysql.

Wenn nicht, können Sie für PHP 7.2 das entsprechende Paket mit installieren sudo apt install php7.2-mysql.

Verwenden Sie einen ähnlichen Befehl für andere PHP-Versionen und Paketmanager.


6

Wenn Sie diese zu Ihrer php.ini hinzufügen, stellen Sie sicher, dass die Referenz php_pdo.dll zuerst vor den DLLs der DB-Treiber steht. Andernfalls führt dies auch zu dieser Fehlermeldung. Fügen Sie sie wie folgt hinzu:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll

2
seit PHP v5.3 wird das php_pdo.dllModul nicht mehr benötigt (existiert nicht mehr). php.net/manual/en/pdo.installation.php ist wahrscheinlich die ultimative Antwort auf diese Frage.
Martin Zeitler

5

Haben Sie Ihre php.ini überprüft (mit phpinfo () nach dem richtigen Speicherort suchen), ob MySQL und der Treiber korrekt installiert sind?


2
Ich suche in php.ini, aber wonach sollte ich suchen? Ich sehe einen Abschnitt, der mit[MySQL]
Mike Moore

4

Für PHP 5.5on habe CentOSich dies durch die Installation des php55-mysqlndPakets behoben .

sudo yum -y install php55w-mysqlnd # For Webtatic
sudo yum -y install php55u-mysqlnd # For Remi

Um Hilfe bei der Installation zu erhalten, schreiben Sie einen Kommentar, da dies von der Art und Weise abhängt, wie PHP auf Ihrem System installiert ist. Verfügbare Repos sind webtaticund remi.


4

Für Windows 8.1 / 10 in der Datei: \\ php.ini sollten Sie die Zeile "extension = pdo_mysql" auskommentieren.


3

In meinem Fall war meine DSN-Zeichenfolge falsch, insbesondere enthielt sie nicht. mysql://. Ich hätte eine andere Fehlermeldung erwartet, möglicherweise so etwas wie "DSN-Zeichenfolge gibt keinen Treiber / kein Protokoll an."

Durch Hinzufügen mysql://am Anfang der DSN-Zeichenfolge wurde das Problem behoben.


3

Ich habe den letzten Tag damit verbracht herauszufinden, warum ich den folgenden Fehler erhalten habe. Ich verwende Ubuntu 14.04.

Das Problem:
Ich habe festgestellt, dass auf meiner PHP-CLI-Version php7.0 ausgeführt wurde, auf php_info () (der Webversion) jedoch php 5.5.9 angezeigt wurde. Obwohl php_info () sagte, dass pdo aktiviert war, erkannte die Verwendung der Befehlszeile (CLI) den Befehl pdo_mysql nicht. Es stellt sich heraus, dass MySQL für meine alte Version aktiviert war, nicht jedoch für die CLI-Version. Alles was ich getan habe war MySQL für PHP7.0 zu installieren und es konnte funktionieren.

Das hat funktioniert:

So überprüfen Sie die Version:

php -v

So installieren Sie MySQL für PHP7.0

sudo apt-get install php7.0-mysql

1) Stellen Sie sicher, dass Ihre CLI-Version mit Ihrer Webversion identisch ist.
2) Wenn sie unterschiedlich sind, stellen Sie sicher, dass Ihre CLI-Version über das MySQL-Plug-In verfügt, da es nicht standardmäßig mitgeliefert wird.


2

Überprüfen Sie, ob extension_dir in der PHP-Konfigurationsdatei richtig eingestellt ist. Versuchen Sie, einige Erweiterungen zu kommentieren / zu kommentieren, und prüfen Sie, ob sie in phpinfo () enthalten sind. Wenn dies nicht der Fall ist, kann keine der PHP-Konfigurationsdateien geladen werden (falscher Speicherort). Extension_dir wird kommentiert oder auf den falschen Speicherort gesetzt.


2

Das Problem ist ein fehlendes PHP zur MySQL-Bibliothek. In CentOs habe ich es behoben, indem ich # yum install php-mysqlApache mit ausgeführt und dann neu gestartet habe. # /bin/systemctl restart httpd.serviceBeachten Sie, dass sich die Benennung geringfügig von den auf Debian / Ubuntu basierenden Distributionen php-> php5 und httpd-> apache2 unterscheidet.


2

Ich hatte das gleiche Problem beim Ausführen von Tests mit separater php.ini. Ich musste diese Zeilen zu meiner eigenen php.ini-Datei hinzufügen:

[PHP]
extension = mysqlnd.so
extension = pdo.so
extension = pdo_mysql.so

Hinweis: Genau in dieser Reihenfolge


2

Ich empfehle sehr mysqllndstatt , mysqlweil Sie eine Menge Probleme haben würde , wie zum Umwandeln und auswertet Bit - Typs Problem mit der mysqlErweiterung.

auf Ubuntu mysqllndmit folgendem Befehl installieren :

sudo apt-get install php5-mysqlnd

1

Ich habe dieses Problem auf meinem Debian 6 behoben. Normalerweise hatte ich gerade ein php5-commonPaket installiert . Nach der Installation müssen Sie Ihren Webserver neu starten (Apache oder Nginx, je nachdem, welchen Sie installiert haben). Dann mache ich einfach eine lsofauf dem Apache-Prozess-ID ( lsof -p process_id) wie folgt:

sudo lsof -p 1399   #replace 1399 by your apache process id
apache2 1399 root  mem    REG  254,2    80352 227236 /usr/lib/php5/20090626/xmlrpc.so
apache2 1399 root  mem    REG  254,2   166496 227235 /usr/lib/php5/20090626/suhosin.so
apache2 1399 root  mem    REG  254,2    31120 227233 /usr/lib/php5/20090626/pdo_mysql.so
apache2 1399 root  mem    REG  254,2   100776 227216 /usr/lib/php5/20090626/pdo.so
apache2 1399 root  mem    REG  254,2   135864 227232 /usr/lib/php5/20090626/mysqli.so

Wie Sie oben sehen können, werden die Module in einem Dateipfad installiert, der nicht bekannt ist oder von einem gemeinsamen Bibliothekspfad geleitet wird: / usr/lib/php5/20090626/. Für Ihre Installation kann es anders sein, aber nur der Pfad von pdo_mysql.so, pdo.so, mysqli.so. Aus diesem Grund konnte Drupal oder eine andere PHP-Engine die Bibliothek nicht finden und zeigt diesen Fehler an:PDOException: could not find driver

Ich weiß nur nicht, warum es auf einem so seltsamen Pfad installiert ist. Für mich ist es nur ein Fehler im Installationsskript des Bibliothekspakets in Debian 6. Ich habe das Problem gelöst, indem ich mit diesem Befehl ein Symbol für alle Dateien unter erstellt /usr/lib/php5/20090626/habe /usr/lib/php5/:

ln -s /usr/lib/php5/20090626/* /usr/lib/php5/


php-mysql ist bereits die neueste Version (1: 7.1 + 49 + deb.sury.org ~ xenial + 4).
Prashant Barve

1
$DB_TYPE = 'mysql'; //Type of database<br>
$DB_HOST = 'localhost'; //Host name<br>
$DB_USER = 'root'; //Host Username<br>
$DB_PASS = ''; //Host Password<br>
$DB_NAME = 'database_name'; //Database name<br><br>

$dbh = new PDO("$DB_TYPE:host=$DB_HOST; dbname=$DB_NAME;", $DB_USER, $DB_PASS); // PDO Connection

Das hat bei mir funktioniert.


1
Ohne Treiber erhält dieser Benutzer immer noch die gleiche Ausnahme
Eggmatters

1

Ich hatte das gleiche Problem, nachdem ich das PHP5-Paket (das auch alle Treiber enthält) entfernt hatte, um das PHP7-Paket zu installieren. Ich habe tatsächlich ein PHP7-Paket ohne ein MySQL-Modul installiert.

Ich habe es geschafft, es durch Eingabe des Terminals zu lösen:

1) $ apt-cache search php7, das alle Module auflistet und die gefundenen Module durchsucht,

php7.0-mysql - MySQL-Modul für PHP

2) $ sudo apt-get install php7.0-mysql

Das ist es. Es hat bei mir in meinem Linux-System funktioniert.

(Verwenden Sie die entsprechende PHP-Version, Ihre könnte PHP5 sein)


1

Nur eine weitere Sache, die bestätigt werden muss, da einige Leute Beispielcode aus dem Internet kopieren / einfügen, um loszulegen. Stellen Sie sicher, dass Sie MySQL hier eingegeben haben:

... $dbh = new PDO ("mysql: ...  

In einigen Beispielen zeigt dies

$dbh = new PDO ("dblib ...

1

In meinem Fall habe ich PDO mit PHP-CLI verwendet und es hat gut funktioniert.

Erst als ich versuchte, eine Verbindung über Apache herzustellen, bekam ich das Problem "Fehlender Treiber", das ich nicht ganz verstand.

Ein einfaches apt-get install php-mysqllöste es. (Ubuntu 16.04 / PHP7. Credits gehen an die ausgewählte Antwort & Iwans Kommentar)

Hoffe es kann helfen.


1

Für diejenigen, die Symfony2 / 3 verwenden und sich fragen, warum dieser Fehler auftritt. Wenn Sie "Mapping_Typen" verwenden, tritt möglicherweise dieser Fehler auf. Der Grund ist, dass "Mapping_Typen" auf der falschen Ebene platziert ist. Zum Beispiel :

doctrine:
  dbal:
    mapping_types:
        set: string

Diese "Mapping-Typen" müssen auf dieser Ebene platziert werden:

doctrine:
dbal:
    #To counter the error caused by 'mapping_types'
    connections:
        default:
            server_version: %database_server_version%
            mapping_types:
                set: string

ich hoffe das hilft

Ich habe die Lösung hier gefunden: https://github.com/doctrine/DoctrineBundle/issues/327


1

Überall, wo ich hingehe, lese ich, dass der Pfad extension_dirvon extzu einem absoluten Pfad geändert werden sollte . Es hat bei mir funktioniert. Beim Versuch, einen Server für den PC meines Kollegen zu erstellen, musste ich den Wert jedoch zulassen, extanstatt einen absoluten Pfad anzugeben.

Wenn Sie einen absoluten Pfad eingegeben haben und die Erweiterung immer noch nicht gefunden wird, versuchen Sie es mit dem absoluten Pfad und ext.


1

Es wurde eine falsche Installation von PHP aufgerufen

Ich hatte das gleiche Problem. Und ich hoffe, das würde jemandem helfen, der ein ähnliches Problem hat wie ich.

Szenario

OS = Windows 10  
Platform = XAMPP  
PHP Version = 7 (Multiple Version seem to have been installed in the PC)  

Ich habe eine phpinfo.phpDatei im publicOrdner erstellt und die ausgeführt phpinfo(), um nach dem Speicherort meiner php.iniDatei zu suchen .

PHP.ini Location = c:\xampp\php\php.ini

Problem
Anruf c:\xampp\htdocs> php -vzurückgegeben, PHP 7.2.3aber phpinfo.phpangezeigt PHP 7.2.2.

Lösung
Anstatt anzurufen

php artisan migrate:install   

was mir diesen Fehler gab, habe ich benutzt

c:\xampp\php\php artisan migrate:install

und es hat funktioniert.



1
PHP Fatal error:  Uncaught PDOException: could not find driver

Ich kämpfte und kämpfte mit "apt install php-mysql php7toInfinity und vergiss sqlite-what-ever's nicht" und konnte diese Fehlermeldung einfach nicht loswerden, bis ich zu den Grundlagen zurückkehrte und die Dateiberechtigungen auf der Website zurücksetzte fraglich.

Diese 3 Befehle setzen die Datei- und Ordnerberechtigungen auf der Website zurück und bringen sie wieder zum Laufen.

cd /var/www/web-site-name.com/web/

# find (sub) directories and change permissions
find . -type d -exec chmod 755 {} \;

# find files and change permissions
find . -type f -exec chmod 664 '{}' \;

0

Ich hatte die gleiche Ausnahme beim Versuch zu verwenden pdo_sqlite. Das Problem war, dass die automatisch erstellten 20-pdo_sqlite.iniund 20-sqlite3.inisymlinks (in/etc/php5/mods-enabled ) waren.

Entfernen Sie die defekten Symlinks und fügen Sie sie manuell hinzu mit:

  • sudo ln -s /etc/php5/mods-avaliable/pdo_sqlite.ini /etc/php5/mods-enabled/20-pdo_sqlite.ini
  • sudo ln -s /etc/php5/mods-avaliable/sqlite3.ini /etc/php5/mods-enabled/20-sqlite3.ini

Das Problem wurde behoben.

Hinweis: Dies funktioniert nicht für ältere PHP-Versionen, da sie nicht nach Konfigurationen in gesucht haben /etc/php5/mods-enabled

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.