PDOException „nie można znaleźć sterownika”


292

Właśnie zainstalowałem Debian Lenny z Apache, MySQL i PHP i otrzymuję wyjątek PDO could not find driver.

Jest to konkretny wiersz kodu, do którego się odnosi:

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

DB_HOST, DB_NAME, DB_USER, I DB_PASSsą stałymi że mam zdefiniowane. Działa dobrze na serwerze produkcyjnym (i na mojej poprzedniej konfiguracji serwera Ubuntu).

Czy to ma coś wspólnego z moją instalacją PHP?

Przeszukiwanie Internetu nie pomogło, wszystko, co otrzymuję, to wymiana ekspertów i przykłady, ale żadnych rozwiązań.


21
Zajrzyj do php.ini' file and uncomment rozszerzenia = . The path to your plik php_pdo_mysql.dll plik php.ini` można znaleźć, patrząc na swoją phpinfo ().
styfle

3
Do Twojej wiadomości dla przyszłych czytelników, jeśli pojawi się ten błąd, a GoDaddy jest Twoim gospodarzem, zaloguj się na swoje konto administratora. Szczegóły hostingu-> Języki programowania. Zaktualizuj swoją wersję PHP do najnowszej lub co najmniej 5.4
Joe

@Joe Uaktualniłem, ale wciąż pojawia się błąd (GoDaddy)
Eugen Sunic,

@styfle 1up, na komputerze z systemem Linux ustawiłem extension=msql.soi działa!
AjayKumarBasuthkar

Do kogo może to dotyczyć: jeśli używasz php 7.1+ na dokerze, możesz docker execwejść do kontenera i uruchomić docker-php-ext-install pdo pdo_mysql.
cleybertandre

Odpowiedzi:


240

Musisz mieć moduł o nazwie pdo_mysql. Szukam następujących w phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

2
@ZZ Coder Nie występuje w phpinfo (). Czy wiesz jak mogę zainstalować pdo_mysql?
Mike Moore,

14
@letseatfood ... Jak to wymyśliłeś? Mam ten sam problem!
Hristo

17
Mogę polecić pakiet „php5-mysql” Ubuntu do instalacji obsługi PDO dla MySQL
Tom Carver

3
Należy zauważyć, że w przypadku osób korzystających z Apache lub innego serwera WWW należy ponownie uruchomić Apache, aby zmiany sudo systemctl restart httpd.service
odniosły

50
W przypadku Ubuntu 16.04 i PHP7sudo apt-get install php-mysql
Ivan Marjanovic

199

Dsn w twoim kodzie ujawnia, że ​​próbujesz połączyć się ze sterownikiem mysql. Twój komunikat o błędzie wskazuje, że ten sterownik jest niedostępny.

Sprawdź, czy masz zainstalowane rozszerzenie mysql na serwerze.

W Ubuntu / Debian sprawdzasz pakiet za pomocą:

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

Zainstaluj pakiet php5-mysql, jeśli go nie masz.

W Ubuntu / Debian możesz używać:

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

Wreszcie, aby go uruchomić, musisz ponownie uruchomić serwer WWW:

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

3
ahh ... ponowne uruchomienie jest tym, co mnie ugryzło!
KOGI

Miałem ten sam problem, pamiętaj o ponownym uruchomieniu php5-fpm!
Eko3alpha

Spędziłem prawie całą noc, próbując to rozwalić, dopóki nie zobaczyłem twojej odpowiedzi. Zrobił wszystko poprawnie, ale zapomniałem ponownie uruchomić apache.
Mugoma J. Okomba

php-mysql jest już najnowszą wersją (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Kiedy próbuję uruchomić polecenie sudo apt-get install php-mysql w Ubuntu 16.04 z nginx php fpm, również zrestartuję php fpm, a następnie zrestartuję nginx.
Prashant Barve,

Obecnie wydaje się, że jest to php-mysql i php7.1-mysql. Mam nadzieję, że jest to wzór idący naprzód.
John P,

83

Aktualizacja : nowsze wersje powinny używać php-sqlite3pakietu zamiast php5-sqlite. Więc skorzystaj z tego, jeśli używasz najnowszej wersji ubuntu:

sudo apt-get install sqlite php-sqlite3

Oryginalna odpowiedź na pytanie znajduje się tutaj:

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

Jeśli twoja phpinfo () nie pokazuje linii pdo_sqlite (w moim przypadku na moim Ubuntu Server), wystarczy uruchomić powyższe linie i będziesz gotowy.


57
Dlaczego podałeś instrukcje dla sqlite, gdy OP używa MySQL?
Andrew Ensley,

7
@Andrew, jeśli używasz pdo_sqlitei nie instalowałeś php5-sqlite, dostaniesz tylko PDOExceptionbrak informacji o brakującym sqlite i spróbuj zainstalować php5-mysqldwa razy.
Aitch

2
Zauważ, że php5-sqlite stał się przestarzały i może nie być już dostępny dla twojego systemu, tj. Ubuntu 16.04. Zamiast tego zainstaluj php-sqlite3.
Matthias

2
@briankip Oczywiście, że tak, jeśli próbujesz połączyć się z SQLite i brakuje tego sterownika. Ale OP próbuje połączyć się z MySQL. Zainstalowanie sqlite rozwiązałoby / nie mogło rozwiązać jego problemu.
Andrew Ensley,

2
@AndrewEnsley. Tytuł tej strony to błąd, który każdy popełnia niezależnie od platformy db. W rezultacie ta strona ma najwyższą pozycję w wyszukiwarce google, jeśli google to tylko błąd. Dlatego też IMO powinna powitać tutaj każdą odpowiedź na to pytanie odnoszącą się do innych baz danych. Jeśli nie działają dla PO, niech tak będzie ... PO nie musi akceptować tych odpowiedzi. To nie znaczy, że ta odpowiedź nie jest „przydatna” dla innych osób badających komunikat o błędzie w tytule, który dał to pytanie z rangą wyszukiwania Zoltara. +1
elrobis

34

Dla nowszych wersji Ubuntu, które mają PHP 7.0, możesz uzyskać php-mysqlpakiet:

sudo apt-get install php-mysql

Następnie uruchom ponownie serwer:

sudo service apache2 restart

Myślę, że w dzisiejszych czasach musisz być konkretny w wersji sudo apt-get install php7.2-mysql
Stan Sokolov

25

Miałem ten sam problem. Rozwiązanie zależy od systemu operacyjnego. W moim przypadku mam debian, więc aby go rozwiązać:

  • Zaktualizowałem moją wersję php z ( php5 do php7 )
  • Zainstaluj php-mysql i php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • Zredagowałem swoją php.inilokalizację na /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
  • Następnie uruchom ponownie apache:

    service apache2 restart

To rozwiązuje mój problem


Tak na marginesie dla takich jak ja, którzy znaleźli to nie całkiem wystarczające i nie chce przejść przez kroki, aby całkowicie usunąć php5 przed weryfikacji, czy php7 zadziała: a2dismod php5, a2enmod php7.0, i service apache2 restartwreszcie mnie z powrotem i działa.
depwl9992,

21

Na moim komputerze z Windows musiałem podać bezwzględną ścieżkę do katalogu rozszerzenia w moim php.ini:

extension_dir = "c:\php5\ext"


2
Właśnie potwierdziłem, że to prawda (Win2008). Dziwne - inne rozszerzenia działają tylko z zalecanymi extension_dir = "ext", ale nie z tym.
scipilot

to samo tutaj. dodał ścieżkę i zaczął działać. Windows10, php7.1
Chris Gibb,

14

Na Ubuntu po prostu uruchom

sudo apt-get install php5-mysql

1
Byłem za Symfony2 i Ubuntu. Nie znaleziono Pdo_mysql ([PDOException] nie mógł znaleźć sterownika). To rozwiązało problem.
Reinherd

2
Dla mnie brakowało Postgresql, więc skończyło się na:sudo apt-get install php5-pgsql
Kzqai

@Kzqai 2:30 teraz i właśnie rozwiązałeś mój problem, nie korzystałem z mysql, korzystałem z postgres (> ლ)
Dheeraj,

9
sudo apt-get install php-mysql 

działał dobrze na Ubuntu i php 7


Działa dla mnie, chociaż nie używam php7, ale php5.6. Ale mam 7 zainstalowanych. Zainstalowałem 5.6 później i przełączyłem się na to bez odinstalowywania php7
Mubashar Abbas

9

Sprawdź, czy moduł jest dostępny z php -m | grep pdo_mysql .

Jeśli nie, dla PHP 7.2 możesz zainstalować odpowiedni pakiet za pomocą sudo apt install php7.2-mysql .

Użyj podobnej komendy w innych wersjach PHP i menedżerach pakietów.


6

Podczas dodawania ich do php.ini upewnij się, że odwołanie php_pdo.dll jest pierwsze przed bibliotekami DLL sterowników db, w przeciwnym razie spowoduje to również ten komunikat o błędzie. Dodaj je w ten sposób:

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

2
od wersji PHP 5.3 php_pdo.dllmoduł nie jest już wymagany (nie istnieje). php.net/manual/en/pdo.installation.php jest prawdopodobnie najlepszą odpowiedzią na to pytanie.
Martin Zeitler,

5

Czy sprawdziłeś php.ini (sprawdź poprawność lokalizacji za pomocą phpinfo ()), czy MySQL i sterownik są poprawnie zainstalowane?


2
Szukam w php.ini, ale czego powinienem szukać? Widzę sekcję, która zaczyna się od[MySQL]
Mike Moore

4

Na PHP 5.5on CentOSnaprawiłem to, instalując php55-mysqlndpakiet.

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

Aby uzyskać pomoc dotyczącą instalacji, napisz komentarz, ponieważ zależy to od sposobu zainstalowania PHP w twoim systemie. Dostępne repo to webtatici remi.


4

dla Windows 8.1 / 10 w pliku: \\ php.ini powinieneś odkomentować wiersz "extension = pdo_mysql"


3

W moim przypadku mój ciąg DSN był niepoprawny, a konkretnie nie zawierał mysql://. , oczekiwałbym innego komunikatu o błędzie, być może coś w rodzaju „Ciąg DSN nie określa sterownika / protokołu”.

Dodanie mysql://na początku ciągu DSN rozwiązało problem.


3

Ostatni dzień spędziłem, próbując dowiedzieć się, dlaczego pojawia się następujący błąd. Używam Ubuntu 14.04.

Problem:
Zauważyłem, że moja wersja PHP-CLI używała php7.0, ale php_info () (wersja internetowa) wyświetlała php 5.5.9. Mimo że php_info () powiedział, że pdo jest włączone, użycie wiersza poleceń (CLI) nie rozpoznało polecenia pdo_mysql. Okazuje się, że mysql został włączony dla mojej starej wersji, ale nie dla wersji CLI. Wszystko, co zrobiłem, to zainstalować mysql dla php7.0 i był w stanie działać.

To działało:

Aby sprawdzić wersję:

php -v

Aby zainstalować mysql dla php7.0

sudo apt-get install php7.0-mysql

1) upewnij się, że wersja CLI jest taka sama jak wersja internetowa
2) Jeśli są różne, upewnij się, że wersja CLI ma wtyczkę mysql, ponieważ nie ma jej domyślnie.


2

Sprawdź, czy katalog rozszerzenie_pliku w pliku konfiguracyjnym php jest ustawiony poprawnie. Spróbuj skomentować / odkomentować niektóre rozszerzenia i sprawdź, czy ma to odzwierciedlenie w phpinfo (). Jeśli tak się nie stanie, nie można załadować pliku konfiguracyjnego php (zła lokalizacja) katalog_dodatku jest komentowany lub ustawiony w niewłaściwej lokalizacji.


2

Problemem jest brak biblioteki php do mysql. W CentOs naprawiłem to, uruchamiając, # yum install php-mysqla następnie ponownie uruchamiając apache z # /bin/systemctl restart httpd.serviceUwaga, że ​​nazewnictwo różni się nieco od dystrybucji opartych na debian / ubuntu, php-> php5 i httpd-> apache2.


2

Miałem ten sam problem podczas uruchamiania testów z oddzielnym plikiem php.ini. Musiałem dodać te linie do własnego pliku php.ini:

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

Uwaga: Dokładnie w tej kolejności


2

Zdecydowanie polecam mysqllndzamiast mysqlciebie, ponieważ miałbyś wiele problemów, takich jak konwersja liczb i typ bitów ocenia problemmysql rozszerzeniem.

na Ubuntu zainstaluj za mysqllndpomocą następującego polecenia:

sudo apt-get install php5-mysqlnd

1

Naprawiłem ten problem na moim Debianie 6. Zwykle właśnie zainstalowałem php5-commonpakiet. Po instalacji musisz zrestartować serwer WWW (apache lub nginx w zależności od tego, który zainstalowałeś). Następnie wykonuję po prostu lsofproces id ( lsof -p process_id) procesu apache w następujący sposób:

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

Jak widać powyżej, moduły są instalowane na ścieżce pliku nieznanej lub prowadzonej przez wspólną ścieżkę biblioteki: / usr/lib/php5/20090626/. W przypadku instalacji może być inna, ale tylko ścieżka do pdo_mysql.so, pdo.so, mysqli.so. Oto dlaczego Drupal lub inny silnik php nie mógł znaleźć biblioteki i pokazuje ten błąd:PDOException: could not find driver

Ja po prostu nie wiem, dlaczego jest on zainstalowany na takiej ścieżce dziwne, dla mnie to po prostu błąd w bibliotece skryptu instalacyjnego pakietu w Debianie 6. I rozwiązać problem tworząc symboliczny dla wszystkich plików w /usr/lib/php5/20090626/celu /usr/lib/php5/poleceniem:

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


php-mysql jest już najnowszą wersją (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

To zadziałało dla mnie.


1
bez sterownika ten użytkownik nadal otrzyma ten sam wyjątek
eggmatters

1

Ten sam problem napotkałem po usunięciu pakietu php5 (który obejmuje również wszystkie sterowniki) w celu zainstalowania pakietu php7. Właściwie zainstalowałem pakiet php7 bez modułu mysql.

Udało mi się to rozwiązać, wpisując terminal:

1) $ apt-cache search php7, który zawiera listę wszystkich modułów, przeglądając znalezione moduły,

php7.0-mysql - moduł MySQL dla PHP

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

Otóż ​​to. To działało dla mnie w moim systemie Linux.

(użyj odpowiedniej wersji php, twoją może być php5)


1

Jeszcze jedna rzecz do potwierdzenia, ponieważ niektóre osoby kopiują / wklejają przykładowy kod z Internetu, aby rozpocząć. Upewnij się, że wpisałeś MySQL tutaj:

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

W niektórych przykładach pokazuje to

$dbh = new PDO ("dblib ...

1

W moim przypadku używałem PDO z php-cli i działało dobrze.

Dopiero gdy próbowałem połączyć się z Apache, dostałem problem „brakującego sterownika”, którego nie do końca rozumiałem.

Prosty apt-get install php-mysqlto rozwiązał. (Ubuntu 16.04 / PHP7. Kredyty przejdź do wybranej odpowiedzi i komentarza Ivana)

Mam nadzieję, że to może pomóc.


1

Dla tych, którzy używają Symfony2 / 3 i zastanawiają się, dlaczego pojawia się ten błąd. Jeśli używasz „mapping_types”, możesz napotkać ten błąd. Powodem jest to, że „typy mapowania” są umieszczone na niewłaściwym poziomie. Na przykład :

doctrine:
  dbal:
    mapping_types:
        set: string

Te „typy mapowania” należy umieścić na tym poziomie:

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

mam nadzieję, że to pomoże

Znalazłem rozwiązanie tutaj: https://github.com/doctrine/DoctrineBundle/issues/327


1

Gdziekolwiek idę, czytam, że ścieżkę extension_dirnależy zmienić z extabsolutnej. To zadziałało dla mnie. Jednak, gdy próbowałem zbudować serwer na komputerze mojego kolegi, musiałem pozwolić sobie na wartość extzamiast stawiać absolutną ścieżkę.

Jeśli podałeś ścieżkę bezwzględną, ale rozszerzenie nadal nie zostało znalezione, rozważ próbowanie ścieżki bezwzględnej i ext.


1

Wywoływano niepoprawną instalację PHP

Miałem ten sam problem. Mam nadzieję, że pomogłoby to komuś, kto ma podobny problem jak ja.

Scenariusz

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

Utworzyłem phpinfo.phpplik w publicfolderze i uruchomiłem, phpinfo()aby wyszukać lokalizację mojego php.inipliku.

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

Problem z
połączeniem c:\xampp\htdocs> php -vwrócił, PHP 7.2.3ale phpinfo.phppokazał się PHP 7.2.2.

Rozwiązanie
Zamiast dzwonić

php artisan migrate:install   

który dał mi ten błąd, użyłem

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

i zadziałało.



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

Walczyłem i walczyłem z „apt install php-mysql php7toInfinity i nie zapomnij o sqlite-what-ever's” i po prostu nie mogłem pozbyć się tego komunikatu o błędzie, dopóki nie wróciłem do podstaw i nie zresetowałem uprawnień do plików na stronie internetowej w pytaniu.

Te 3 polecenia resetują uprawnienia do plików i folderów na stronie internetowej i sprawiają, że znów działa.

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

Miałem ten sam wyjątek przy próbie użycia pdo_sqlite. Problem polegał na tym, że automatycznie utworzone 20-pdo_sqlite.inii 20-sqlite3.inidowiązania symboliczne (w /etc/php5/mods-enabled) zostały zerwane.

Usuwanie zepsutych dowiązań symbolicznych i ręczne dodawanie ich za pomocą:

  • 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

naprawiono problem.

Uwaga: to nie zadziała dla starszych wersji php, ponieważ nie szukały one konfiguracji /etc/php5/mods-enabled

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.