【问题标题】:Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' with pdo带有 pdo 的未定义类常量“MYSQL_ATTR_INIT_COMMAND”
【发布时间】: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 文件的扩展名和设置。

标签: php pdo


【解决方案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 上

    更长的解释:

    1. 在文本编辑器中打开 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(),并寻找“加载的配置文件”这一行
    2. 从以下行的开头删除分号(取消注释):

      • ;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
    3. 您可能需要重新启动您的网络服务器。

    这解决了我的问题。

    【讨论】:

    • 也适用于 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,如果我没记错的话。

              【讨论】:

                猜你喜欢
                • 2016-10-06
                • 2023-01-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-02
                • 1970-01-01
                • 2016-10-18
                相关资源
                最近更新 更多