web-dev-qa-db-fra.com

Constante de classe non définie 'MYSQL_ATTR_INIT_COMMAND' avec 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'")
      );

rapports:

Constante de classe non définie 'MYSQL_ATTR_INIT_COMMAND' 

Est-il renommé?

30
user260019

Je viens d'avoir la même erreur (avec PHP 5.2.6), et tout ce que j'avais à faire est de activer le pilote PDO spécifique à MySQL :

TL; DR

Dans votre fichier php.ini, vous devriez avoir la ligne suivante (non commentée): 

  • extension=php_pdo_mysql.dll sous Windows
  • extension=php_pdo_mysql.so sous Linux/Mac

Explication plus longue:

  1. ouvrir php.ini dans un éditeur de texte

    • par exemple. son chemin par défaut sous Windows: C:\Program Files (x86)\PHP\v5.X\php.ini (remplacez v5.x par la version que vous avez installée) ou C:\Windows\php.ini, etc.
    • ou sous Linux: /etc/php5/Apache2/php.ini (par exemple, il s’agit du chemin sous Ubuntu) ou /etc/php5/cli/php.ini, /etc/php5/cgi/php.ini, etc.
    • ou vous pouvez savoir où il en est :
      • php --ini | find /i "Loaded" dans l'invite de commande Windows OU
      • php --ini | grep "Loaded" sous Linux/Mac
      • en utilisant phpinfo() et en recherchant la ligne "Fichier de configuration chargé"
  2. et supprime le point-virgule à partir du début de la ligne suivante (pour la décommenter):

    • ;extension=php_pdo_mysql.dll sous Windows
      • OU ;extension=php_pdo_mysql.so sous Linux/Mac
    • bien sûr, si cette ligne n'existe pas, vous devez la coller
    • ainsi, en tant que result, la ligne attendue devrait ressembler à ceci dans php.ini: .____.
      • extension=php_pdo_mysql.dll sous Windows
      • OU extension=php_pdo_mysql.so sous Linux/Mac
  3. Vous devrez peut-être redémarrer votre serveur Web.

Cela a résolu mon problème.

44
Sk8erPeter

J'ai eu la même erreur, sur debian6, alors que je n'avais pas encore installé php5-mysql.

Alors je l'ai installé, puis redémarré Apache2

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

Alors l'erreur est partie.

Si vous avez la même erreur sur Ubuntu, au lieu de: 

/etc/init.d/Apache2 restart  

Type: 

service Apache2 restart
27
Sverre

Il semble être disponible uniquement avec le pilote mysqlnd .
Essayez de le remplacer par le nombre entier qu’il représente; 1002, si je ne me trompe pas.

5
Atli

Pour Centos, il me manquait la bibliothèque php-mysql:

yum install php-mysql

service httpd restart

Il n'est pas nécessaire d'activer une extension dans php.ini, elle est chargée par défaut.

3
Aris

Je viens d'essayer avec PHP 5.2, et cette constante semble exister:

var_dump(PDO::MYSQL_ATTR_INIT_COMMAND);

Donne moi :

int 1002


Mais il semble qu'il y ait un bogue dans PHP 5.3, ce qui fait que cette constante n'existe plus - ou du moins, pas lorsque le pilote mysqlnd est utilisé (et c'est celui qui est configuré par défaut)

Je suppose qu'une solution temporaire, comme suggéré sur ce rapport de bogue , pourrait être d'utiliser directement la valeur entière 1002, au lieu du contenu ...

Mais notez que vous devriez recommencer à utiliser la constante le plus tôt possible, car cela rend le code plus facile à comprendre.

2
Pascal MARTIN

Vous pouvez essayer de le remplacer par 1002 ou d'émettre votre requête d'initialisation juste après l'ouverture d'une connexion.

1
Andrew

Pour moi, il manquait MySQL PDO, j'ai recompilé mon PHP avec l'option --with-pdo-mysql, je l'ai installé, puis redémarré Apache et tout fonctionnait correctement.

1
Reza S

Ceci est dû à un bogue PHP 5.3.0 sous Windows où MYSQL_ATTR_INIT_COMMAND n'est pas disponible. Le rapport de bogue PHP est:

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

Si vous rencontrez ce problème, veuillez mettre à jour votre produit WAMP vers une version utilisant PHP 5.3.1 ou une version ultérieure.

0
Siraj Khan

Utiliser la valeur int 1002 semble fonctionner pour 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); 
}
0
JDelage

J'ai eu cette erreur ce matin, je venais de faire une nouvelle installation de Fedora 14 et j'essayais de remettre mes projets locaux en ligne. Il me manquait php-mysql, je l'ai installé via yum et l'erreur est maintenant partie.

0
Jeff Busby