带有 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

    例如Windows默认路径: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

预定义常量

mariadb 使用啥 PDO 驱动程序?

php 带有$ _POST的未定义索引

带有 JsonpModule 的未定义导入错误 Angular 2

typedef和模板的未定义符号? [复制]