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.

Mike Moore
quelle
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
ZZ Coder
quelle
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
Ghbarratt
quelle
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.

Sudipta Chatterjee
quelle
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
ThomasAFink
quelle
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

nur ich
quelle
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"

berdzi
quelle
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
Dmitry Sobolev
quelle
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

Moses Nandwa
quelle
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.

Pratik
quelle
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
Paul Foster
quelle
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?

cem
quelle
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.

SimonW
quelle
4

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

Egor Doynikov
quelle
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.

gposton
quelle
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.

Knurrender Floh
quelle
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.

hserge
quelle
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.

Japheth Ongeri - inkalimeva
quelle
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

Facedown
quelle
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
MSS
quelle
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/

Douggynix
quelle
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.

Persianuser
quelle
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)

Roshimon
quelle
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 ...
Joe
quelle
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.

Balmipour
quelle
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

aneth101
quelle
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.

Papillon
quelle
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.

RealSollyM
quelle
1

Überprüfen Sie den korrekten Pfad in extension_dir in Ihrer phpinfo ().

Alexandr Nizhnik
quelle
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 '{}' \;
SamTzu
quelle
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

Ioleo
quelle