205 votes

PHP PDO : charset, noms ?

J’ai eu cela auparavant dans ma connexion normale mysql_ * :

Ai-je besoin de l’AOP ? Et où je devrais l’ai ?

504voto

Cobra_Fast Points 5531

Il vous aurez dans votre chaîne de connexion comme :

Cependant, avant PHP 5.3.6, l’option charset a été ignorée. Si vous utilisez une ancienne version de PHP, vous devez le faire comme ceci :

64voto

9nix00 Points 698

Avant PHP 5.3.6, l’option charset a été ignorée. Si vous utilisez une ancienne version de PHP, vous devez le faire comme ceci :

46voto

Jpsy Points 2811

C’est probablement la manière la plus élégante de le faire.
Droit à l’appel de constructeur PDO, mais en évitant l’option charset buggy (comme mentionné ci-dessus) :

Fonctionne très bien pour moi.

15voto

Álvaro G. Vicario Points 57607

Pour être complet, il y a en fait trois façons de définir l'encodage lors de la connexion à MySQL à partir de PDO, et ceux qui sont disponibles dépendent de votre version de PHP. L'ordre de préférence:

  1. charset paramètre dans la chaîne de DSN
  2. PDO::MYSQL_ATTR_INIT_COMMAND option de connexion
  3. Exécutez SET NAMES utf8 manuellement

Cet exemple de code met en œuvre tous les trois:

<?php

define('DB_HOST', 'localhost');
define('DB_SCHEMA', 'test');
define('DB_USER', 'test');
define('DB_PASSWORD', 'test');
define('DB_ENCODING', 'utf8');


$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);

if( version_compare(PHP_VERSION, '5.3.6', '<') ){
    if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
        $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
    }
}else{
    $dsn .= ';charset=' . DB_ENCODING;
}

$conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);

if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
    $sql = 'SET NAMES ' . DB_ENCODING;
    $conn->exec($sql);
}

Faire tous les trois est peut-être exagéré (sauf si vous écrivez une classe que vous envisagez de distribuer ou de réutilisation).

1voto

Medda86 Points 497

Je tiens juste à ajouter que vous devez vous assurer que votre base de données est créée avec COLLATE utf8_general_ci ou selon le classement que vous souhaitez utiliser, Sinon vous risquez de vous retrouver avec un autre que prévu.

Dans phpmyadmin, vous pouvez voir le classement en cliquant sur votre base de données et choisir les opérations. Si vous essayez de créer des tableaux avec un autre classement que votre base de données, vos tables de fin avec le classement de base de données, de toute façon.

Donc, assurez-vous que le classement de votre base de données est juste avant la création de tables. Espérons que cela sauve quelqu'un quelques heures lol

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X