Không thể tìm thấy PDOException


292

Tôi vừa cài đặt Debian Lenny với Apache, MySQL và PHP và tôi đang nhận được PDOException could not find driver.

Đây là dòng mã cụ thể mà nó đang đề cập đến:

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

DB_HOST, DB_NAME, DB_USER, Và DB_PASSlà hằng số mà tôi đã xác định. Nó hoạt động tốt trên máy chủ sản xuất (và trên thiết lập Máy chủ Ubuntu trước đây của tôi).

Đây có phải là một cái gì đó để làm với cài đặt PHP của tôi?

Tìm kiếm trên internet không giúp được gì, tất cả những gì tôi nhận được là các chuyên gia - trao đổi và ví dụ, nhưng không có giải pháp.


21
Tìm trong php.ini' file and uncomment phần mở rộng của bạn = php_pdo_mysql.dll Tệp . The path to your php.ini` có thể được tìm thấy bằng cách xem phpinfo () của bạn.
styfle

3
FYI cho bất kỳ độc giả nào trong tương lai, nếu bạn gặp lỗi này và GoDaddy là máy chủ của bạn, hãy đăng nhập tài khoản quản trị của bạn. Chi tiết lưu trữ-> Ngôn ngữ lập trình. Nâng cấp phiên bản PHP của bạn lên phiên bản mới nhất hoặc ít nhất là 5,4
Joe

@Joe Tôi đã nâng cấp nhưng vẫn gặp lỗi (GoDaddy)
Eugen Sunic

@styfle 1up, Trên máy Linux, tôi đã thiết lập extension=msql.sovà nó hoạt động!
AjayKumarBasuthkar

Đối với người mà nó có thể quan tâm: nếu bạn đang sử dụng php 7.1+ trên docker, bạn có thể docker execvào container và chạy docker-php-ext-install pdo pdo_mysql.
cleybertandre

Câu trả lời:


240

Bạn cần phải có một mô-đun gọi là pdo_mysql. Tìm kiếm theo sau trong phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

2
@ZZ Coder Điều này không có trong phpinfo (). Bạn có biết làm thế nào tôi có thể cài đặt pdo_mysql?
Mike Moore

14
@letseatfood ... Làm thế nào bạn tìm ra điều này? Im có cùng một vấn đề!
Hristo

17
Tôi có thể đề xuất gói Ubuntu "php5-mysql" để cài đặt hỗ trợ PDO cho MySQL
Tom Carver

3
Lưu ý rằng, đối với những người sử dụng Apache hoặc máy chủ web khác, người ta cần khởi động lại Apache để các thay đổi có hiệu lực:sudo systemctl restart httpd.service
Mugoma J. Okomba

50
Đối với Ubuntu 16.04 và PHP7 sử dụngsudo apt-get install php-mysql
Ivan Marjanovic

199

Mã DSn trong mã của bạn cho thấy bạn đang cố gắng kết nối với trình điều khiển mysql. Thông báo lỗi của bạn chỉ ra rằng trình điều khiển này không có sẵn.

Kiểm tra xem bạn đã cài đặt tiện ích mở rộng mysql trên máy chủ của mình chưa.

Trong Ubuntu / Debian bạn kiểm tra gói với:

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

Cài đặt gói php5-mysql nếu bạn không có.

Trong Ubuntu / Debian bạn có thể sử dụng:

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

Cuối cùng, để làm cho nó hoạt động, bạn sẽ cần phải khởi động lại máy chủ web của mình:

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

3
ahh ... khởi động lại là những gì tôi bit!
KOGI

Tôi gặp vấn đề tương tự, hãy đảm bảo bạn khởi động lại php5-fpm!
Eko3alpha

Đã gần như cả đêm cố gắng để phá vỡ điều này, cho đến khi tôi thấy câu trả lời của bạn. Đã làm mọi thứ chính xác nhưng quên khởi động lại apache.
Mugoma J. Okomba

php-mysql đã là phiên bản mới nhất (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Khi thử chạy lệnh sudo apt-get install php-mysql trong ubfox 16.04 với nginx php fpm tôi cũng khởi động lại php fpm và sau đó khởi động lại nginx.
Prashant Barve

Hiện tại nó có vẻ là php-mysql và php7.1-mysql. Hy vọng rằng đây là mô hình di chuyển về phía trước.
John P

83

Cập nhật : phiên bản mới hơn nên sử dụng php-sqlite3gói thay vì php5-sqlite. Vì vậy, hãy sử dụng cái này, nếu bạn đang sử dụng phiên bản Ubuntu gần đây:

sudo apt-get install sqlite php-sqlite3

Câu trả lời gốc cho câu hỏi ở đây:

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

Nếu phpinfo () của bạn không hiển thị dòng pdo_sqlite (trong trường hợp của tôi, trên Máy chủ Ubuntu của tôi), bạn chỉ cần chạy các dòng trên và sau đó bạn sẽ ổn.


57
Tại sao bạn lại đưa ra hướng dẫn cho sqlite khi OP đang sử dụng MySQL?
Andrew Oblley

7
@Andrew nếu bạn sử dụng pdo_sqlitevà không cài đặt, php5-sqlitebạn chỉ nhận được một PDOExceptionthông tin không có về sqlite bị thiếu và cố gắng cài đặt php5-mysqlhai lần.
Aitch

2
Lưu ý rằng php5-sqlite đã trở nên lỗi thời và có thể không còn khả dụng cho hệ thống của bạn nữa, tức là Ubuntu 16.04. Cài đặt php-sqlite3 thay thế.
Matthias

2
@briankip Tất nhiên là vậy, nếu bạn đang cố gắng kết nối với SQLite và trình điều khiển đó bị thiếu. Nhưng OP đang cố gắng kết nối với MySQL. Cài đặt sqlite sẽ / không thể giải quyết vấn đề của mình.
Andrew Oblley ngày

2
@AndrewEnsley. Tiêu đề của trang này là lỗi mà mọi người đều mắc phải bất kể nền tảng db của họ. Do đó, trang này có thứ hạng tìm kiếm google cao nhất nếu bạn google chỉ là lỗi. Do đó, IMO, bất kỳ câu trả lời cho câu hỏi này có liên quan đến các cơ sở dữ liệu khác nên được chào đón ở đây. Nếu họ không làm việc cho OP, vậy thì ... OP không phải chấp nhận những câu trả lời đó. Điều đó không có nghĩa là câu trả lời này không "hữu ích" cho những người khác điều tra thông báo lỗi trong tiêu đề tặng câu hỏi này với thứ hạng tìm kiếm của Zoltar. +1
elrobis

34

Đối với các phiên bản Ubuntu mới hơn có PHP 7.0, bạn có thể nhận php-mysqlgói:

sudo apt-get install php-mysql

Sau đó khởi động lại máy chủ của bạn:

sudo service apache2 restart

Tôi nghĩ rằng ngày nay bạn phải cụ thể với phiên bản sudo apt-get install php7.2-mysql
Stan Sokolov

25

Tôi gặp vấn đề tương tự. Giải pháp phụ thuộc vào HĐH. Trong trường hợp của tôi, tôi có debian, vì vậy để giải quyết nó:

  • Đã cập nhật phiên bản php của tôi từ ( php5 lên php7 )
  • Cài đặt php-mysql và php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • Tôi đã chỉnh sửa php.inivị trí của mình tại /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
  • Sau đó khởi động lại apache:

    service apache2 restart

Điều này giải quyết vấn đề của tôi


Là một dành cho những người như tôi đã tìm thấy điều này không hoàn toàn là đủ và không muốn phải trải qua các bước để hoàn toàn loại bỏ php5 trước khi xác minh php7 rằng sẽ làm việc: a2dismod php5, a2enmod php7.0, và service apache2 restartcuối cùng đã cho tôi sao lưu và chạy.
depwl9992

21

Trên máy Windows của tôi, tôi đã phải đưa đường dẫn tuyệt đối đến thư mục mở rộng trong php.ini của mình:

extension_dir = "c:\php5\ext"


2
Tôi vừa xác nhận điều này là đúng (Win2008). Lạ - các tiện ích mở rộng khác chỉ hoạt động với đề xuất extension_dir = "ext", nhưng không phải tiện ích mở rộng này.
scipilot

tương tự ở đây thêm đường dẫn và bắt đầu làm việc Windows10, php7.1
Chris Gibb

14

Trên Ubuntu chỉ cần thực thi

sudo apt-get install php5-mysql

1
Tôi đã đứng sau một Symfony2 và Ubuntu. Không tìm thấy Pdo_mysql ([PDOException] trình điều khiển). Điều này đã giải quyết vấn đề.
Reinherd

2
Đối với tôi, tôi đã thiếu Postgresql nên cuối cùng nó trở thành:sudo apt-get install php5-pgsql
Kzqai

@Kzqai 2:30 sáng và bạn vừa giải quyết vấn đề của mình, tôi đã không sử dụng mysql tôi đang sử dụng postgres (>)
Dheeraj

9
sudo apt-get install php-mysql 

hoạt động tốt trên Ubuntu và php 7


Nó hoạt động với tôi, Mặc dù tôi không sử dụng php7 nhưng php5.6. Nhưng tôi có 7 cài đặt. Tôi đã cài đặt 5.6 sau đó và chuyển sang đó mà không cần gỡ cài đặt php7
Mubashar Abbas

9

Kiểm tra nếu mô-đun có sẵn với php -m | grep pdo_mysql.

Nếu không, đối với PHP 7.2, bạn có thể cài đặt gói có liên quan với sudo apt install php7.2-mysql.

Sử dụng lệnh tương tự trên các phiên bản PHP và trình quản lý gói khác.


6

Khi thêm chúng vào php.ini, đảm bảo tham chiếu php_pdo.dll trước tiên trước các trình điều khiển db dll nếu không điều này cũng sẽ gây ra thông báo lỗi này. Thêm chúng như thế này:

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

2
vì PHP v5.3, php_pdo.dllmô-đun không bắt buộc (không tồn tại) nữa. php.net/manual/en/pdo.installation.php có lẽ là câu trả lời cuối cùng cho câu hỏi này.
Martin Zeitler

5

Bạn đã kiểm tra php.ini của mình (kiểm tra vị trí chính xác với phpinfo ()) nếu MySQL và trình điều khiển được cài đặt đúng chưa?


2
Tôi đang tìm kiếm trong php.ini, nhưng tôi nên tìm cái gì? Tôi thấy một phần bắt đầu bằng[MySQL]
Mike Moore

4

Đối với PHP 5.5trên CentOStôi cố định này bằng cách cài đặt php55-mysqlndgói.

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

Để được trợ giúp cài đặt, hãy viết bình luận vì nó phụ thuộc vào cách PHP được cài đặt trên hệ thống của bạn. Có sẵn của repo webtaticremi.


4

đối với Windows 8.1 / 10 trong: \ \ Tập tin php.ini, bạn nên bỏ dòng "mở rộng = pdo_mysql"


3

Trong trường hợp của tôi, chuỗi DSN của tôi không chính xác, cụ thể là nó không chứa mysql://. tôi sẽ mong đợi một thông báo lỗi khác, có lẽ giống như 'chuỗi DSN không chỉ định trình điều khiển / giao thức.'

Thêm mysql://vào đầu chuỗi DSN đã giải quyết vấn đề.


3

Tôi đã dành ngày cuối cùng để cố gắng tìm ra lý do tại sao tôi nhận được lỗi sau. Tôi đang chạy Ubuntu 14.04.

Vấn đề:
Tôi nhận thấy rằng phiên bản PHP-CLI của tôi đang chạy php7.0 nhưng php_info () (phiên bản web) đang hiển thị php 5.5.9. Mặc dù php_info () cho biết pdo đã được bật, nhưng sử dụng dòng lệnh (CLI) sẽ không nhận ra lệnh pdo_mysql. Hóa ra mysql đã được kích hoạt cho phiên bản cũ của tôi chứ không phải phiên bản CLI. Tất cả những gì tôi đã làm là cài đặt mysql cho php7.0 và nó đã có thể hoạt động.

Đây là những gì đã làm việc:

Để kiểm tra phiên bản:

php -v

Để cài đặt mysql cho php7.0

sudo apt-get install php7.0-mysql

1) đảm bảo phiên bản CLI của bạn giống với phiên bản web
2 của bạn ) Nếu chúng khác nhau, hãy đảm bảo phiên bản CLI của bạn có bổ trợ mysql vì nó không đi kèm với nó như một mặc định.


2

Kiểm tra xem extension_dir trong tập tin cấu hình php được đặt chính xác. Hãy thử nhận xét / bỏ ghi chú một số tiện ích mở rộng và xem liệu nó có được phản ánh trên phpinfo () không. Nếu không, thì tệp cấu hình php không thể được tải (vị trí sai) extension_dir được nhận xét hoặc đặt thành vị trí sai.


2

Vấn đề là một thư viện php to mysql bị thiếu. Trong CentO tôi đã sửa nó bằng cách chạy # yum install php-mysqlvà sau đó khởi động lại apache bằng # /bin/systemctl restart httpd.serviceLưu ý rằng việc đặt tên hơi khác so với các distro dựa trên debian / ub Ubuntu, php-> php5 và httpd-> apache2.


2

Tôi gặp vấn đề tương tự trong khi chạy thử nghiệm với php.ini riêng. Tôi đã phải thêm các dòng này vào tệp php.ini của riêng mình:

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

Lưu ý: Chính xác theo thứ tự này


2

Tôi thực sự khuyên bạn mysqllndthay mysqlvì vì bạn sẽ có rất nhiều vấn đề như chuyển đổi số và loại bit đánh giá vấn đề với mysqltiện ích mở rộng.

trên cài đặt Ubuntu mysqllndvới lệnh sau:

sudo apt-get install php5-mysqlnd

1

Tôi đã sửa lỗi này trên Debian 6. Thông thường tôi mới cài đặt php5-commongói. Sau khi cài đặt, bạn phải khởi động lại máy chủ web của mình (apache hoặc nginx tùy thuộc vào cái nào bạn đã cài đặt). Sau đó, tôi chỉ thực hiện một lsofquá trình apache id ( lsof -p process_id) như sau:

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

Như bạn có thể thấy ở trên, các mô-đun được cài đặt trên một đường dẫn tệp không được biết hoặc được hướng dẫn bởi đường dẫn thư viện chung: / usr/lib/php5/20090626/. Đối với cài đặt của bạn, nó có thể khác nhau, nhưng chỉ có đường dẫn của pdo_mysql.so, pdo.so, mysqli.so. Vì vậy, đây là lý do tại sao Drupal hoặc bất kỳ công cụ php nào khác không thể tìm thấy thư viện và hiển thị lỗi đó:PDOException: could not find driver

Tôi chỉ không biết tại sao nó được cài đặt trên một con đường kỳ lạ như vậy, đối với tôi nó chỉ là một lỗi trong các kịch bản cài đặt gói thư viện trong debian 6. Tôi giải quyết vấn đề này bằng cách tạo ra một biểu tượng cho tất cả các file dưới /usr/lib/php5/20090626/để /usr/lib/php5/bằng lệnh này:

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


php-mysql đã là phiên bản mới nhất (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

Điều này làm việc cho tôi.


1
không có trình điều khiển, người dùng này vẫn sẽ có ngoại lệ tương tự
đánh trứng

1

Tôi đã gặp vấn đề tương tự sau khi tôi gỡ bỏ gói php5 (bao gồm tất cả các trình điều khiển) để cài đặt gói php7. Tôi thực sự đã cài đặt gói php7 mà không có mô-đun mysql.

Tôi quản lý để giải quyết nó bằng cách gõ vào thiết bị đầu cuối:

1) $ apt-cache search php7 liệt kê tất cả các mô-đun, xem qua các mô-đun tôi tìm thấy,

php7.0-mysql - Mô-đun MySQL cho PHP

2) $ sudo apt-get cài đặt php7.0-mysql

Đó là nó. Nó làm việc cho tôi trong hệ thống linux của tôi.

(sử dụng phiên bản php thích hợp, phiên bản của bạn có thể là php5)


1

Chỉ cần một điều khác để xác nhận là một số người đang sao chép / dán mã ví dụ từ Internet để bắt đầu. Hãy chắc chắn rằng bạn đã nhập MySQL vào đây:

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

Trong một số ví dụ, điều này cho thấy

$dbh = new PDO ("dblib ...

1

Trong trường hợp của tôi, tôi đã sử dụng PDO với php-cli và nó hoạt động tốt.

Chỉ khi tôi cố gắng kết nối từ apache, tôi mới gặp phải vấn đề "thiếu tài xế", điều mà tôi không hiểu lắm.

Một cách đơn giản đã apt-get install php-mysqlgiải quyết nó. (Ubuntu 16.04 / PHP7. Tín dụng đi đến câu trả lời được chọn & nhận xét của Ivan)

Hy vọng nó có thể giúp đỡ.


1

Đối với những người sử dụng Symfony2 / 3 và tự hỏi tại sao bạn lại gặp lỗi này. Nếu bạn đang sử dụng "maps_types", bạn có thể gặp phải lỗi này. Lý do là "maps_types" được đặt ở cấp độ sai. Ví dụ :

doctrine:
  dbal:
    mapping_types:
        set: string

"Ánh xạ_types" này phải được đặt ở cấp độ này:

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

Tôi hi vọng cái này giúp được

Tôi đã tìm thấy giải pháp tại đây: https://github.com/doctrine/DoctrineBundle/issues/327


1

Ở mọi nơi tôi đến tôi đều đọc rằng con đường extension_dirnên được thay đổi từ extmột con đường tuyệt đối. Nó làm việc cho tôi. Tuy nhiên, khi cố gắng xây dựng một máy chủ của PC của đồng nghiệp, tôi đã phải để giá trị extthay vì đặt một đường dẫn tuyệt đối.

Nếu bạn đã đặt một đường dẫn tuyệt đối và nó vẫn không tìm thấy tiện ích mở rộng, hãy xem xét thử cả hai với đường dẫn tuyệt đối và ext.


1

Cài đặt PHP không chính xác đã được gọi

Tôi đã trải qua vấn đề tương tự. Và tôi hy vọng điều này sẽ giúp được ai đó đang gặp vấn đề tương tự như tôi.

Kịch bản

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

Tôi đã tạo phpinfo.phptập tin trong publicthư mục và chạy phpinfo()để tìm vị trí php.initập tin của tôi .

Vị trí PHP.ini = c:\xampp\php\php.ini

Vấn đề
gọi c:\xampp\htdocs> php -vlại PHP 7.2.3nhưng phpinfo.phpcho thấy PHP 7.2.2.

Giải pháp
thay vì gọi

php artisan migrate:install   

Tôi đã sử dụng lỗi này, tôi đã sử dụng

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

va no đa hoạt động.



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

Tôi đã vật lộn và vật lộn với "apt install php-mysql php7toInfinity và không quên sqlite-what-ever's" và không thể thoát khỏi thông báo lỗi này cho đến khi tôi quay lại cơ bản và đặt lại quyền truy cập tệp trên trang web trong câu hỏi.

3 lệnh này đặt lại quyền truy cập tệp và thư mục trên trang web và khiến nó hoạt động trở lại.

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

Tôi đã có ngoại lệ tương tự khi cố gắng sử dụng pdo_sqlite. Vấn đề là các liên kết được tạo tự động 20-pdo_sqlite.ini20-sqlite3.inisymlink (in /etc/php5/mods-enabled) đã bị hỏng.

Xóa các liên kết tượng trưng bị hỏng và thêm chúng bằng tay với:

  • 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

đã khắc phục sự cố.

Lưu ý: điều này sẽ không hoạt động đối với các phiên bản php cũ hơn vì chúng không tìm kiếm cấu hình trong /etc/php5/mods-enabled

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.