PDOException "tidak dapat menemukan driver"

292

Saya baru saja menginstal Debian Lenny dengan Apache, MySQL, dan PHP dan saya menerima PDOException could not find driver.

Ini adalah baris kode spesifik yang dimaksud:

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

DB_HOST, DB_NAME, DB_USER, Dan DB_PASSadalah konstanta yang saya didefinisikan. Ini berfungsi dengan baik pada server produksi (dan pada pengaturan Server Ubuntu saya sebelumnya).

Apakah ini ada hubungannya dengan instalasi PHP saya?

Mencari di internet tidak membantu, yang saya dapatkan hanyalah pertukaran pakar dan contoh, tetapi tidak ada solusi.

Mike Moore
sumber
21
Lihat di file php.ini` php.ini' file and uncomment ekstensi Anda = php_pdo_mysql.dll . The path to your dapat ditemukan dengan melihat phpinfo Anda ().
styfle
3
FYI ke pembaca di masa mendatang, jika Anda mendapatkan kesalahan ini dan GoDaddy adalah tuan rumah Anda, login akun admin Anda. Detail Hosting -> Bahasa Pemrograman. Tingkatkan versi PHP Anda ke versi terbaru atau setidaknya 5,4
Joe
@ Jo, saya memutakhirkan tetapi masih mendapatkan kesalahan (GoDaddy)
Eugen Sunic
@styfle 1up, Di mesin Linux, saya atur extension=msql.sodan berfungsi!
AjayKumarBasuthkar
Kepada siapa pun yang berkepentingan: jika Anda menggunakan php 7.1+ pada buruh pelabuhan, Anda bisa docker execmasuk ke dalam wadah dan menjalankannya docker-php-ext-install pdo pdo_mysql.
cleybertandre

Jawaban:

240

Anda perlu memiliki modul bernama pdo_mysql. Mencari mengikuti di phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44
ZZ Coder
sumber
2
@ZZ Coder Ini tidak ada di phpinfo (). Apakah Anda tahu bagaimana saya bisa menginstal pdo_mysql?
Mike Moore
14
@letseatfood ... Bagaimana Anda mengetahui hal ini? Saya mempunyai masalah yang sama!
Hristo
17
Saya dapat merekomendasikan paket Ubuntu "php5-mysql" untuk menginstal dukungan PDO untuk MySQL
Tom Carver
3
Perhatikan bahwa, bagi mereka yang menggunakan Apache atau server web lain, seseorang harus memulai ulang Apache agar perubahan diterapkan:sudo systemctl restart httpd.service
Mugoma J. Okomba
50
Untuk penggunaan Ubuntu 16.04 dan PHP7sudo apt-get install php-mysql
Ivan Marjanovic
199

Dsn dalam kode Anda mengungkapkan Anda mencoba untuk terhubung dengan driver mysql. Pesan kesalahan Anda menunjukkan bahwa driver ini tidak tersedia.

Periksa apakah ekstensi mysql telah diinstal di server Anda.

Di Ubuntu / Debian Anda memeriksa paket dengan:

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

Instal paket php5-mysql jika Anda tidak memilikinya.

Di Ubuntu / Debian Anda dapat menggunakan:

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

Terakhir, untuk membuatnya berfungsi, Anda harus me-restart server web Anda:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart
ghbarratt
sumber
3
ahh ... restart adalah apa yang menggigitku!
KOGI
Saya memiliki masalah yang sama, pastikan Anda me-restart php5-fpm!
Eko3alpha
Menghabiskan hampir sepanjang malam mencoba memecahkan ini, sampai saya melihat jawaban Anda. Telah melakukan semuanya dengan benar tetapi lupa untuk me-restart apache.
Mugoma J. Okomba
php-mysql sudah menjadi versi terbaru (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Ketika mencoba menjalankan perintah sudo apt-get install php-mysql di ubuntu 16.04 dengan nginx php fpm saya juga me-restart php fpm dan kemudian restart nginx.
Prashant Barve
Saat ini tampaknya php-mysql dan php7.1-mysql. Semoga pola ini bergerak maju.
John P
83

Perbarui : versi yang lebih baru harus menggunakan php-sqlite3paket, bukan php5-sqlite. Jadi gunakan ini, jika Anda menggunakan versi ubuntu terbaru:

sudo apt-get install sqlite php-sqlite3

Jawaban asli untuk pertanyaan ada di sini:

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

Jika phpinfo Anda () tidak menampilkan baris pdo_sqlite (dalam kasus saya, di Ubuntu Server saya), Anda hanya perlu menjalankan baris-baris di atas dan kemudian Anda dapat melanjutkan.

Sudipta Chatterjee
sumber
57
Mengapa Anda memberikan instruksi untuk sqlite ketika OP menggunakan MySQL?
Andrew Ensley
7
@Andrew jika Anda menggunakan pdo_sqlitedan tidak menginstal php5-sqliteAnda hanya mendapatkan PDOExceptiontanpa info tentang sqlite yang hilang dan mencoba menginstal php5-mysqldua kali.
Aitch
2
Perhatikan bahwa php5-sqlite telah menjadi usang dan mungkin tidak tersedia lagi untuk sistem Anda, yaitu Ubuntu 16.04. Instal php-sqlite3 sebagai gantinya.
Matthias
2
@ Briankip Tentu saja, jika Anda mencoba untuk terhubung ke SQLite dan driver itu hilang. Tetapi OP sedang mencoba untuk terhubung ke MySQL. Menginstal sqlite tidak akan bisa menyelesaikan masalahnya.
Andrew Ensley
2
@AndrewEnsley. Judul halaman ini adalah kesalahan yang didapat semua orang terlepas dari platform db mereka. Akibatnya, halaman ini memiliki peringkat pencarian google tertinggi jika Anda hanya kesalahan google. Oleh karena itu, IMO, jawaban apa pun untuk pertanyaan ini yang relevan dengan basis data lain harus diterima di sini. Jika mereka tidak bekerja untuk OP, maka ... OP tidak harus menerima jawaban itu. Itu tidak berarti jawaban ini tidak "berguna" bagi orang lain yang menyelidiki pesan kesalahan dalam judul yang memberikan pertanyaan ini dengan peringkat pencarian Zoltar. +1
elrobis
34

Untuk versi Ubuntu yang lebih baru yang memiliki PHP 7.0 Anda bisa mendapatkan php-mysqlpaket:

sudo apt-get install php-mysql

Kemudian restart server Anda:

sudo service apache2 restart
ThomasAFink
sumber
Saya pikir sekarang Anda harus spesifik dengan versi sudo apt-get install php7.2-mysql
Stan Sokolov
25

Saya memiliki masalah yang sama. Solusinya tergantung pada OS. Dalam kasus saya, saya punya debian, jadi untuk menyelesaikannya:

  • Diperbarui versi php saya dari ( php5 ke php7 )
  • Instal php-mysql dan php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • Saya mengedit php.inilokasi saya di /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
  • Kemudian restart apache:

    service apache2 restart

Ini menyelesaikan masalah saya

hanya saya
sumber
Sebagai samping bagi orang seperti saya yang menemukan ini tidak cukup cukup dan tidak ingin pergi melalui langkah-langkah untuk menghapus php5 sebelum memverifikasi php7 yang akan bekerja: a2dismod php5,a2enmod php7.0 , dan service apache2 restartakhirnya saya kembali dan berjalan.
depwl9992
21

Di mesin Windows saya, saya harus memberikan jalur absolut ke direktori ekstensi di php.ini saya:

extension_dir = "c:\php5\ext"

berdzi
sumber
2
Saya baru saja mengkonfirmasi ini benar (Win2008). Strange - ekstensi lain berfungsi hanya dengan yang disarankan extension_dir = "ext", tetapi tidak yang ini.
scipilot
sama disini. menambahkan jalur dan mulai bekerja. Windows10, php7.1
Chris Gibb
14

Di Ubuntu jalankan saja

sudo apt-get install php5-mysql
Dmitry Sobolev
sumber
1
Saya berada di belakang Symfony2 dan Ubuntu. Pdo_mysql tidak ditemukan ([PDOException] tidak dapat menemukan driver). Ini memecahkan masalah.
Reinherd
2
Bagi saya, saya kurang Postgresql sehingga akhirnya menjadi:sudo apt-get install php5-pgsql
Kzqai
@Kzqai 02:30 sekarang dan Anda baru saja menyelesaikan masalah saya, saya tidak menggunakan mysql saya menggunakan postgres (> ლ)
Dheeraj
9
sudo apt-get install php-mysql 

bekerja dengan baik di ubuntu dan php 7

Moses Nandwa
sumber
Ini bekerja untuk saya, Meskipun saya tidak menggunakan php7 tetapi php5.6. Tapi saya sudah menginstal 7. Saya menginstal 5.6 kemudian dan beralih ke yang tanpa menghapus instalan php7
Abbas
9

Periksa apakah modul tersedia dengan php -m | grep pdo_mysql.

Jika tidak, untuk PHP 7.2, Anda dapat menginstal paket yang relevan dengannya sudo apt install php7.2-mysql.

Gunakan perintah serupa pada versi PHP lain dan manajer paket.

Pratik
sumber
6

Ketika menambahkan ini ke php.ini Anda memastikan referensi php_pdo.dll adalah yang pertama sebelum dll driver db jika tidak, ini juga akan menyebabkan pesan kesalahan ini. Tambahkan mereka seperti ini:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
Paul Foster
sumber
2
karena PHP v5.3 php_pdo.dllmodul tidak diperlukan (tidak ada) lagi. php.net/manual/en/pdo.installation.php mungkin merupakan jawaban akhir untuk pertanyaan ini.
Martin Zeitler
5

Apakah Anda memeriksa php.ini Anda (periksa lokasi yang benar dengan phpinfo ()) jika MySQL dan driver diinstal dengan benar?

cem
sumber
2
Saya mencari di php.ini, tetapi apa yang harus saya cari? Saya melihat bagian yang dimulai dengan[MySQL]
Mike Moore
4

Karena PHP 5.5pada CentOSsaya memperbaikinya dengan menginstal php55-mysqlndpaket.

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

Untuk bantuan menginstal, tulis komentar karena tergantung pada cara PHP diinstal pada sistem Anda. Repo yang tersedia adalah webtaticdan remi.

SimonW
sumber
4

untuk Windows 8.1 / 10 di: \\ file php.ini Anda harus batalkan komentar pada baris "extension = pdo_mysql"

Egor Doynikov
sumber
3

Dalam kasus saya, string DSN saya salah, khususnya tidak berisi mysql://. saya akan mengharapkan pesan kesalahan yang berbeda, mungkin sesuatu seperti 'string DSN tidak menentukan driver / protokol.'

Menambahkan mysql://ke awal string DSN menyelesaikan masalah.

gposton
sumber
3

Saya menghabiskan hari terakhir mencoba mencari tahu mengapa saya mendapatkan kesalahan berikut. Saya menjalankan Ubuntu 14.04.

Masalahnya:
Saya perhatikan bahwa versi PHP-CLI saya menjalankan php7.0 tetapi php_info () (versi web) sedang menampilkan php 5.5.9. Meskipun php_info () mengatakan pdo diaktifkan, menggunakan baris perintah (CLI) tidak mengenali perintah pdo_mysql. Ternyata mysql diaktifkan untuk versi lama saya tetapi bukan versi CLI. Yang saya lakukan adalah menginstal mysql untuk php7.0 dan itu bisa berfungsi.

Inilah yang berhasil:

Untuk memeriksa versi:

php -v

Untuk menginstal mysql untuk php7.0

sudo apt-get install php7.0-mysql

1) pastikan versi CLI Anda sama dengan versi web Anda
2) Jika berbeda, pastikan versi CLI Anda memiliki plug-in mysql karena tidak disertakan sebagai default.

Kutu Berkembang
sumber
2

Periksa apakah extension_dir dalam file konfigurasi php diatur dengan benar. Cobalah untuk berkomentar / batalkan komentar pada beberapa ekstensi dan lihat apakah ekstensi tersebut tercermin di phpinfo (). Jika tidak maka file konfigurasi php tidak dapat dimuat (lokasi salah) extension_dir dikomentari atau disetel ke lokasi yang salah.

hserge
sumber
2

Masalahnya adalah php hilang ke perpustakaan mysql. Di CentOs saya memperbaikinya dengan menjalankan # yum install php-mysqldan kemudian memulai kembali apache dengan # /bin/systemctl restart httpd.serviceCatatan bahwa penamaan sedikit berbeda dari distro berbasis debian / ubuntu, php-> php5 dan httpd-> apache2.

Japheth Ongeri - inkalimeva
sumber
2

Saya memiliki masalah yang sama selama menjalankan tes dengan php.ini terpisah. Saya harus menambahkan baris ini ke file php.ini saya sendiri:

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

Perhatikan: Persis dalam urutan ini

Menunduk
sumber
2

Saya sangat merekomendasikan mysqllnddaripada mysqlkarena Anda akan memiliki banyak masalah seperti jumlah konversi dan tipe bit mengevaluasi masalah dengan mysqlekstensi.

di ubuntu instal mysqllnddengan perintah berikut:

sudo apt-get install php5-mysqlnd
MSS
sumber
1

Saya Memperbaiki masalah ini pada Debian saya 6. Biasanya saya baru saja menginstal php5-commonpaket. Setelah instalasi, Anda harus me-restart server web Anda (apache atau nginx tergantung yang mana yang Anda instal). Kemudian saya hanya melakukan lsofid proses apache ( lsof -p process_id) sebagai berikut:

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

Seperti yang Anda lihat di atas, modul-modul tersebut diinstal pada path file yang tidak dikenal atau dipandu oleh path library umum: / usr/lib/php5/20090626/. Untuk instalasi Anda, mungkin berbeda, tetapi hanya jalur pdo_mysql.so, pdo.so, mysqli.so. Jadi, inilah mengapa Drupal atau mesin php lain tidak dapat menemukan perpustakaan dan menunjukkan kesalahan itu:PDOException: could not find driver

Aku hanya tidak tahu mengapa ia terinstal di suatu jalan yang aneh, bagi saya itu hanya bug di script paket instalasi perpustakaan di debian 6. Aku memecahkan masalah ini dengan menciptakan simbolis untuk semua file di bawah /usr/lib/php5/20090626/untuk /usr/lib/php5/dengan perintah ini:

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

douggynix
sumber
php-mysql sudah menjadi versi terbaru (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

Ini berhasil untuk saya.

Persianuser
sumber
1
tanpa driver, pengguna ini akan tetap mendapatkan pengecualian yang sama
eggmatters
1

Saya menghadapi masalah yang sama setelah saya menghapus paket php5 (yang mencakup semua driver juga) untuk menginstal paket php7. Saya benar-benar menginstal paket php7 tanpa modul mysql.

Saya berhasil menyelesaikannya dengan mengetik di terminal:

1) $ pencarian pencarian apt-cache php7 yang berisi daftar semua modul, mencari melalui modul yang saya temukan,

php7.0-mysql - modul MySQL untuk PHP

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

Itu dia. Ini bekerja untuk saya di sistem linux saya.

(gunakan versi php yang sesuai, milik Anda bisa php5)

Roshimon
sumber
1

Hanya satu hal lain untuk mengonfirmasi karena beberapa orang menyalin / menempelkan kode contoh dari Internet untuk memulai. Pastikan Anda memasukkan MySQL di sini:

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

Dalam beberapa contoh ini menunjukkan

$dbh = new PDO ("dblib ...
Joe
sumber
1

Dalam kasus saya, saya menggunakan PDO dengan php-cli, dan itu berfungsi dengan baik.

Hanya ketika saya mencoba terhubung dari apache, saya mendapat masalah "driver yang hilang", yang saya tidak mengerti.

Sederhana apt-get install php-mysqlmenyelesaikannya. (Ubuntu 16.04 / PHP7. Kredit diberikan ke jawaban yang dipilih & komentar Ivan)

Semoga bisa membantu.

Balmipour
sumber
1

Bagi mereka yang menggunakan Symfony2 / 3 dan bertanya-tanya mengapa Anda mendapatkan kesalahan ini. Jika Anda menggunakan "mapping_types", Anda mungkin mengalami kesalahan ini. Alasannya adalah "mapping_types" ditempatkan pada level yang salah. Misalnya :

doctrine:
  dbal:
    mapping_types:
        set: string

"Mapping_types" ini harus ditempatkan di level ini:

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

saya harap ini membantu

Saya menemukan solusinya di sini: https://github.com/doctrine/DoctrineBundle/issues/327

aneth101
sumber
1

Ke mana pun saya pergi, saya membaca bahwa jalan extension_dirharus diubah dari extmenjadi jalan absolut. Ini berhasil untuk saya. Namun, ketika mencoba membangun server PC kolega saya, saya harus membiarkan nilainya extdaripada meletakkan jalur absolut.

Jika Anda memang meletakkan jalur absolut dan ekstensi itu masih tidak ditemukan, pertimbangkan untuk mencoba keduanya dengan jalur absolut dan ext.

papillon
sumber
1

Instalasi PHP yang salah sedang dipanggil

Saya mengalami masalah yang sama. Dan saya berharap ini akan membantu seseorang yang memiliki masalah serupa dengan saya.

Skenario

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

Saya membuat phpinfo.phpfile di publicfolder dan menjalankan phpinfo()untuk mencari lokasi php.inifile saya .

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

Masalah
Panggilan c:\xampp\htdocs> php -vkembali PHP 7.2.3tetapi phpinfo.phpmuncul PHP 7.2.2.

Solusi
Daripada menelepon

php artisan migrate:install   

yang memberi saya kesalahan ini, saya gunakan

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

dan itu berhasil.

RealSollyM
sumber
1

Periksa jalur yang benar di extension_dir di Anda phpinfo ().

Alexandr Nizhnik
sumber
1
PHP Fatal error:  Uncaught PDOException: could not find driver

Saya berjuang dan berjuang dengan "apt install php-mysql php7toInfinity dan jangan lupa sqlite-what-ever's" dan tidak bisa menghilangkan pesan kesalahan ini sampai saya kembali ke dasar-dasar dan mereset file-permissions file di situs web dalam pertanyaan.

3 perintah ini mengatur ulang izin file dan folder di situs web dan membuatnya berfungsi kembali.

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
sumber
0

Saya memiliki pengecualian yang sama ketika mencoba menggunakan pdo_sqlite. Masalahnya adalah bahwa secara otomatis dibuat 20-pdo_sqlite.inidan 20-sqlite3.inisymlinks (di/etc/php5/mods-enabled ) rusak.

Menghapus symlink yang rusak dan menambahkannya secara manual dengan:

  • 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

memperbaiki masalah.

Catatan: ini tidak akan berfungsi untuk versi php yang lebih lama karena mereka tidak mencari konfigurasi /etc/php5/mods-enabled

ioleo
sumber