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.
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.
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")
);
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.
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.