web-dev-qa-db-fra.com

PDO + MySQL et encodage UTF-8 cassé

J'utilise la bibliothèque PDO avec une base de données MySQL en PHP, mais si j'insère des données encodées en UTF-8, comme des mots arabes, elles sont insérées dans la base de données, mais comme ?????????.

Dans mon propre framework, après avoir créé la connexion PDO, j'envoie deux requêtes - SET NAMES utf8 et SET CHARACTER SET utf8. Cela ne fonctionne toujours pas.

Exemple:

loadclass('PDO', array(
    sprintf(
        'mysql:Host=%s;port=%s;dbname=%s',
        confitem('database', 'Host'),
        confitem('database', 'port'),
        confitem('database', 'name')
    ),
    confitem('database', 'username'),
    confitem('database', 'password'),
    array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect'))
));
$this->query('SET NAMES ' . confitem('database', 'charset'));
$this->query('SET CHARACTER SET ' . confitem('database', 'charset'));

Solution: utilisez le json_encode fonction pour convertir les données avant de les insérer dans la base de données et utiliser json_decode pour le décoder après la récupération. Voilà comment je le fais maintenant.

27
Jason4Ever

Utilisation:

$pdo = new PDO( 
    'mysql:Host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 

Il force UTF-8 sur la connexion PDO. Ça a marché pour moi.

124
shark555

Vous devez définir le jeu de caractères correct pour la connexion. Ajouter le charset=utf8 option au DSN (ceci est spécifique à MySQL!)

$pdo = new PDO(
    'mysql:Host=hostname;dbname=defaultDbName;charset=utf8',
    'username',
    'password'
);

Cependant, dans les versions PHP antérieures à 5.3.6, vous devez utiliser une solution de contournement car l'option charset n'est pas prise en charge.

$pdo = new PDO(
    'mysql:Host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
43
Palec

Toutes les tentatives comme:

PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "

ou

$this->connection = new PDO('mysql:Host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt);

ou

$this->connection->exec("set names utf8");

encore généré un mess texte illisible.

Dans mon cas, la cause du problème était: htmlentities utilisé avant d'insérer des données dans une base de données. lettres cyrilliques ont été complètement détruites.

3
bbe

Essayez de définir le default_charset valeur dans php.ini en UTF-8. Ou vous pouvez le définir en utilisant la fonction ini_set .

De plus, si l'entrée provient de soumissions de formulaire, assurez-vous que vos pages Web sont définies sur UTF-8 à l'aide de la balise META.

2
Burak Guzel