未定义的类常量'MYSQL_ATTR_INIT_COMMAND'与pdo

时间:2010-03-11 11:02:15

标签: php pdo

$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'

是否重命名?

12 个答案:

答案 0 :(得分:44)

我遇到了同样的错误(使用PHP 5.2.6),我所要做的只是enable the MySQL-specific PDO driver

TL; DR

php.ini文件中,您应该拥有以下行(取消注释):

    Windows上的
  • extension=php_pdo_mysql.dll
  • Linux / Mac上的
  • extension=php_pdo_mysql.so

更长的解释:

  1. 在文本编辑器中打开 php.ini

    • <子> e.g。 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
        Windows命令提示符
      • php --ini | find /i "Loaded"
      • php --ini | grep "Loaded"在Linux / Mac终端
      • 使用phpinfo(),并查找“已加载的配置文件”行
  2. 从以下行的开头删除分号(取消注释):

      Windows上的
    • ;extension=php_pdo_mysql.dll
      • 在Linux / Mac上的;extension=php_pdo_mysql.so
    • 当然,如果此行不存在,则应将其粘贴
    • 所以结果预期的行在php.ini中看起来像这样:
        Windows上的
      • extension=php_pdo_mysql.dll
      • 在Linux / Mac上的extension=php_pdo_mysql.so
  3. 您可能需要重新启动网络服务器。

  4. 这解决了我的问题。

答案 1 :(得分:27)

当我还没有安装php5-mysql时,我在debian6上遇到了同样的错误。

所以我安装了它,然后重新启动了apache2

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

然后错误就消失了。

如果您在Ubuntu上遇到相同的错误,而不是:

/etc/init.d/apache2 restart  

输入:

service apache2 restart

答案 2 :(得分:5)

似乎只能使用 mysqlnd 驱动程序。
尝试用它代表的整数替换它; 1002,如果我没弄错的话。

答案 3 :(得分:3)

对于Centos,我缺少php-mysql库:

yum install php-mysql

service httpd restart

不需要在php.ini中启用任何扩展名,默认情况下会加载它。

答案 4 :(得分:3)

对于以后跟我一样,看到这个的人

我收到相同的错误,因为我的php.ini文件中没有扩展名“ enabled”。我想如果您最近升级了php版本并且没有正确更新php.ini文件,您可能还会收到此错误。

如果您在升级php版本后不久收到此错误,则以下信息可能会对您有所帮助:

PHP 7.4在php.ini文件中略微更改了其语法。 现在,要启用mysql pdo,请确保您的php.ini文件中未注释extension=pdo_mysql。 (默认php.ini设置中的931行)

该行以前是:

Windows上的

extension = php_pdo_mysql.dll

在Linux / Mac上

extension = php_pdo_mysql.so

正如Sk8erPeter指出的那样。但是.dll和.so结尾不建议使用,因此最好的方法是开始摆脱这些结尾,而仅使用extension=<ext>

以下内容是从“动态扩展”下的php 7.4 zip下载的默认php.ini-production文件中提取的:

注意:出于遗留原因,支持以前的PHP版本中使用的语法(“ extension = .so”和“ extension ='php_.dll”),并且在以后的PHP主版本中可能会弃用该语法。因此,请尽可能使用新的(extension=<ext>)语法。

答案 5 :(得分:2)

我刚尝试使用PHP 5.2,并且该常量似乎存在:

var_dump(PDO::MYSQL_ATTR_INIT_COMMAND);

给我:

int 1002


但似乎PHP 5.3中存在一个错误,导致此常量不再存在 - 或者,至少,当使用mysqlnd驱动程序时(并且它是默认配置的那个)

我认为this bug report建议的临时解决方案可能是直接使用整数1002值,而不是直接使用...

但请注意,您应该尽快使用常量 - 因为这会使代码更容易理解。

答案 6 :(得分:1)

您可以尝试将其替换为1002,或在打开连接后立即发出初始化查询。

答案 7 :(得分:1)

对我而言,它缺少MySQL PDO,我使用--with-pdo-mysql选项重新编译了我的PHP,安装了它并重新启动了apache并且它全部正常工作

答案 8 :(得分:1)

虽然这个问题已经很老了,但我刚刚遇到了类似的问题。现在有了 PHP 命名空间,您似乎需要 \PDO 而不仅仅是 PDO。例如:

$options = array(\PDO::MYSQL_ATTR_INIT_COMMAND =>  "SET NAMES 'UTF8'");

代替:

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND =>  "SET NAMES 'UTF8'");

答案 9 :(得分:0)

今天早上我收到了这个错误,我刚刚安装了Fedora 14,并试图让我的本地项目重新上线。我缺少php-mysql,我通过yum安装它,错误现在消失了。

答案 10 :(得分:0)

使用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); 
}

答案 11 :(得分:0)

这是由于Windows上的PHP 5.3.0错误导致MYSQL_ATTR_INIT_COMMAND不可用。 PHP错误报告是:

http://bugs.php.net/bug.php?id=47224

如果您遇到此问题,请将您的WAMP产品更新为使用PHP 5.3.1或更高版本的版本。