我刚刚安装了带有 Nginx 的 Ubuntu Server 16.04,并且我以这种方式安装了 php:
sudo apt-get install php7.0-cli php7.0-cgi php7.0-fpm php7.0-curl
对于 MySql,我已经安装了 percona,以这种方式:
apt-get install percona-server-server-5.7 percona-server-client-5.7
但我不明白为什么我不能在我的 php 脚本中使用 PDO,这是我的代码:
$db = new PDO("mysql:dbname=db;host=localhost;charset=utf8", "username", "password");
我收到此错误:
Uncaught PDOException: could not find driver
我在网上搜索了一下,发现我必须在 Windows 中的 php.ini 中取消注释这一行:
;extension=php_pdo_mysql.dll
或者 Linux 上的这一行:
;extension=php_pdo_mysql.so
我已经检查了我的 php.ini:
/etc/php/7.0/fpm/php.ini
并且我有一个.dll
文件而不是.so
文件,我也无法理解为什么我有一个dll而不是so。无论如何,启用该 .dll 文件并重新启动 php 没有任何变化。有人可以帮助我吗?
谢谢
最佳答案
安装 mysql 客户端/服务器包不会影响 PHP。 PHP 仍然需要绑定(bind)来与您的 mysql 服务器通信,特别是在您的情况下是 PDO mysql 驱动程序。
该软件包可能会被称为php7.0-pdo-mysql
,具体取决于您的 Ubuntu 软件包管理器配置的存储库。如果您在 Ubuntu 16.04 上使用 PHP 7,它很可能是一个包含 php7.0-mysql
的元包。以下是我使用 Ondrej PPA 从 aptitude 16.04 获得的信息。
能力显示 php7.0-pdo-mysql
Package: php7.0-mysql State: installed Automatically installed: no Version: 7.0.9-1+deb.sury.org~trusty+1 Priority: optional Section: php Maintainer: Debian PHP Maintainers Architecture: amd64 Uncompressed Size: 514 k Depends: php-common (>= 1:35), ucf, php7.0-common, libc6 (>= 2.15) Provides: php-mysqli, php-mysqlnd, php-pdo-mysql, php7.0-mysqli, php7.0-mysqlnd, php7.0-pdo-mysql Description: MySQL module for PHP This package provides the MySQL module(s) for PHP.
php7.0-pdo-mysql
是我们感兴趣的,用于在 PHP 中加载 PDO 的 mysql 驱动程序。因此,请确保在尝试安装之前搜索您的软件包管理器以找到正确的软件包,但您的发行版/存储库应该有一个类似的软件包。
安装后,您需要重新启动 php-fpm,例如 sudo service php7.0-fpm restart
然后检查您的 phpinfo()
确保 pdo_mysql
驱动程序现已加载。
通过包管理器安装时,您不需要手动编辑 php.ini。另外,如果扩展不存在,则将 extension=pdo_mysql.so
行添加到 php.ini 中不会产生任何效果。显然,尝试加载 dll 在 Linux 上是行不通的,这些都是 Windows 专用的库。
关于php - 未捕获的 PDOException : could not find driver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39089731/