带有 pdo 的未定义类常量“MYSQL_ATTR_INIT_COMMAND”
Posted
技术标签:
【中文标题】带有 pdo 的未定义类常量“MYSQL_ATTR_INIT_COMMAND”【英文标题】:Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' with pdo 【发布时间】:2011-01-26 07:55:57 【问题描述】:$db = new PDO('mysql:dbname=xnews;host=localhost;port=' . $LOCAL_DB_PORT,
$LOCAL_DB_USER,
$LOCAL_DB_PASS,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'")
);
报告:
未定义的类常量 'MYSQL_ATTR_INIT_COMMAND'
改名了吗?
【问题讨论】:
好像是php5.3的bug... 这是一个错误:bugs.php.net/47224 每次升级 PHP 时,请务必备份 php.ini。在 Windows 上,您可能有一个新的 PHP 目录。如果它只是 PHP 的次要版本/补丁,请复制您以前的 php.ini。如果您正在更改版本,请比较新旧 php.ini 以查看您可能希望保留/传输到新 php.ini 文件的扩展名和设置。 【参考方案1】:虽然这个问题已经相当老了,但我刚到这里时遇到了类似的问题。现在使用 PHP 命名空间,您似乎需要 \PDO
而不仅仅是 PDO
。例如:
$options = array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");
代替:
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");
【讨论】:
【参考方案2】:对于后来出现的任何人,就像我一样,看到这个......
我收到了同样的错误,因为我的 php.ini 文件中没有“启用”扩展名。我想如果您最近升级了您的 php 版本并且没有正确更新您的 php.ini 文件,您也可能会收到此错误。
如果您在升级 php 版本后不久收到此错误,以下信息可能会对您有所帮助:
PHP 7.4 略微更改了 php.ini 文件中的语法。
现在,要启用 mysql pdo,请确保在您的 php.ini 文件中取消注释 extension=pdo_mysql
。 (默认 php.ini 设置中的第 931 行)
该行曾经是:
extension=php_pdo_mysql.dll 在 Windows 上
extension=php_pdo_mysql.so 在 Linux/Mac 上
正如 Sk8erPeter 指出的那样。但是 .dll 和 .so 结尾将被弃用,因此最好的做法是开始摆脱这些结尾并仅使用 extension=<ext>
以下内容来自“动态扩展”下的 php 7.4 zip 下载中的默认 php.ini-production 文件:
注意:以前的 PHP 版本中使用的语法('extension=.so' 和 'extension='php_.dll')由于遗留原因而受到支持,并且可能在未来的 PHP 主要版本中被弃用。因此,如果可能,请改用新的 (
extension=<ext>
) 语法。
【讨论】:
你能解释一下这与给定的关于任何缺失常量的问题有什么关系吗? 对不起,你是对的,我应该提供更多的上下文。我收到与上述相同的错误,因为我没有启用扩展。我一定会进行编辑以澄清。【参考方案3】:我在 debian6 上遇到了同样的错误,当时我还没有安装 php5-mysql
。
所以我安装了它,然后重新启动了 apache2
apt-get install php5-mysql
/etc/init.d/apache2 restart
然后错误就消失了。
如果你在 Ubuntu 上遇到同样的错误,而不是:
/etc/init.d/apache2 restart
类型:
service apache2 restart
【讨论】:
感谢修复我的语言。【参考方案4】:对于 Centos,我缺少 php-mysql 库:
yum install php-mysql
service httpd restart
php.ini中无需开启任何扩展,默认加载。
【讨论】:
最近在 Fedora 26 上变成了:dnf install mysqlnd【参考方案5】:我刚刚遇到了同样的错误(使用 PHP 5.2.6),我所要做的就是enable the MySQL-specific PDO driver:
TL;DR
在您的 php.ini
文件中,您应该有以下行(未注释):
extension=php_pdo_mysql.dll
在 Windows 上
extension=php_pdo_mysql.so
在 Linux/Mac 上
更长的解释:
在文本编辑器中打开 php.ini
C:\Program Files (x86)\PHP\v5.X\php.ini
(用你安装的版本代替v5.x)或C:\Windows\php.ini
等
或在 Linux 上:/etc/php5/apache2/php.ini
(例如,这是 Ubuntu 上的路径)或/etc/php5/cli/php.ini
、/etc/php5/cgi/php.ini
等
或you can get to know where it is like this:
php --ini | find /i "Loaded"
在 Windows 命令提示符或
php --ini | grep "Loaded"
在 Linux/Mac 终端中
使用phpinfo()
,并寻找“加载的配置文件”这一行
并从以下行的开头删除分号(取消注释):
;extension=php_pdo_mysql.dll
在 Windows 上
在 Linux/Mac 上或 ;extension=php_pdo_mysql.so
当然,如果这行不存在,你应该粘贴它
作为结果,php.ini
中的预期行将如下所示:
extension=php_pdo_mysql.dll
在 Windows 上
在 Linux/Mac 上或 extension=php_pdo_mysql.so
您可能需要重新启动您的网络服务器。
这解决了我的问题。
【讨论】:
也适用于 PHP 7。 嗨,我试过了,但现在我收到警告PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/php_pdo_mysql.so' - /usr/lib/php/20151012/php_pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
谢谢!这适用于我在 Windows IIS 7 和 PHP 7.1.21 上。
我还必须禁用 php7.2 并启用 php7.3 a2dismod php7.2; a2enmod php7.3; systemctl restart apache2
【参考方案6】:
对我来说,它缺少 MySQL PDO,我使用 --with-pdo-mysql
选项重新编译了我的 PHP,安装它并重新启动 apache,一切正常
【讨论】:
【参考方案7】:这是由于 Windows 上的 PHP 5.3.0 错误导致 MYSQL_ATTR_INIT_COMMAND 不可用。 PHP 错误报告是:
http://bugs.php.net/bug.php?id=47224
如果您遇到这种情况,请将您的 WAMP 产品更新到使用 PHP 5.3.1 或更高版本的版本。
【讨论】:
【参考方案8】:使用 int 值 1002
似乎适用于 PHP 5.3.0:
public static function createDB()
$dbHost="localhost";
$dbName="project";
$dbUser="admin";
$dbPassword="whatever";
$dbOptions=array(1002 => 'SET NAMES utf8',);
return new DB($dbHost, $dbName, $dbUser, $dbPassword,$dbOptions);
function createConnexion()
return new PDO(
"mysql:host=$this->dbHost;dbname=$this->dbName",
$this->dbUser,
$this->dbPassword,
$this->dbOptions);
【讨论】:
我使用 PHP 5.3.0 (cli) 尝试了这种方法,结果出现“致命错误:未捕获的异常 'PDOException' 和消息 '找不到驱动程序'”【参考方案9】:今天早上我收到了这个错误,我刚刚重新安装了 Fedora 14,并试图让我的本地项目重新上线。我错过了 php-mysql,我通过 yum 安装了它,现在错误消失了。
【讨论】:
【参考方案10】:您可以尝试将其替换为 1002 或在打开连接后立即发出初始化查询。
【讨论】:
【参考方案11】:我刚刚尝试使用 PHP 5.2,并且该常量似乎存在:
var_dump(PDO::MYSQL_ATTR_INIT_COMMAND);
给我:
int 1002
但似乎 PHP 5.3 中存在一个错误,导致该常量不再存在 - 或者,至少在使用 mysqlnd 驱动程序时不存在(它是默认配置的那个)
我想一个临时解决方案,正如this bug report 所建议的那样,可能是直接使用整数1002
值,而不是常量...
但请注意,您应该尽快重新使用该常量——因为这会使代码更容易理解。
【讨论】:
【参考方案12】:它似乎只能使用 mysqlnd 驱动程序。 尝试用它代表的整数替换它; 1002,如果我没记错的话。
【讨论】:
以上是关于带有 pdo 的未定义类常量“MYSQL_ATTR_INIT_COMMAND”的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 有来自 tinker 的未定义常量 App\User