PHP PDO: jeu de caractères, le nom du set?
Je l'avais déjà dans mes normale mysql_* connexion:
mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");
Ai-je besoin d'une AOP? Et où dois-je avoir?
$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
- "SET NAMES utf8" doit être évitée en raison de l'injection SQL. Voir php.net/manual/en/mysqlinfo.concepts.charset.php pour précise-t-il.
- si vous avez des problèmes de charset alors vous avez pas le choix, mais de mettre en utf8. Je pense que la prise de distance doit être d'utiliser chaîne de connexion, comme indiqué par Cobra_Fast ci-dessous. Utiliser PDO::prepare pour préparer vos instructions SQL avec des paramètres liés.
- alors comment doit-on spécifier le classement en tant que "SET NAMES utf8 COLLATE utf8_unicode_ci"
Vous devez vous connecter pour publier un commentaire.
Vous l'aurez dans votre chaîne de connexion comme:
CEPENDANT, avant PHP 5.3.6, le jeu de caractères de l'option a été ignorée. Si vous utilisez une ancienne version de PHP, vous devez faire comme ceci:
SET NAMES
requête manuellement.Avant PHP 5.3.6, le jeu de caractères de l'option a été ignorée. Si vous utilisez une ancienne version de PHP, vous devez faire comme ceci:
C'est probablement la façon la plus élégante de le faire.
Droit à l'appellation d'appel de constructeur, mais en évitant le buggy option charset (comme mentionné ci-dessus):
Fonctionne très bien pour moi.
array(1002 => 'SET NAMES utf8',...)
.charset=utf8
dans la chaîne de dsn fonctionne! J'ai été à essayer de comprendre le problème dans le groups.google.com/d/msg/auraphp/syMS26Rz-q8/9laQr9tR4EoJPour être complet, il y a effectivement 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:
charset
paramètre dans la chaîne de DSNSET NAMES utf8
avecPDO::MYSQL_ATTR_INIT_COMMAND
option de connexionSET NAMES utf8
manuellementCet exemple de code met en œuvre tous les trois:
Faire tous les trois est probablement excessif (sauf si vous écrivez une classe que vous envisagez de distribuer ou de réutilisation).
Je veux juste ajouter que vous avez pour 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
Je pense que vous avez besoin d'un de plus de la requête parce que l'option charset du DSN est en fait ignoré. voir le lien posté dans le commentaire de l'autre réponse.
Regarder comment Drupal 7 est de le faire dans http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7:
$con = new PDO ( "mysql:host=$dbhost;dbname=$database;charset=$encodage", "$dbuser", "$dbpassword");
J'ai tester ce code et