J'avais ceci précédemment dans ma connexion mysql_ * normale:
mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");
En ai-je besoin pour l'AOP? Et où dois-je l'avoir?
$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
Réponses:
Vous l'aurez dans votre chaîne de connexion comme:
"mysql:host=$host;dbname=$db;charset=utf8"
CEPENDANT, avant PHP 5.3.6, l'option charset était ignorée. Si vous utilisez une ancienne version de PHP, vous devez le faire comme ceci:
$dbh = new PDO("mysql:$connstr", $user, $password); $dbh->exec("set names utf8");
la source
Avant PHP 5.3.6, l'option charset était ignorée. Si vous utilisez une ancienne version de PHP, vous devez le faire comme ceci:
<?php $dbh = new PDO("mysql:$connstr", $user, $password); $dbh -> exec("set names utf8"); ?>
la source
C'est probablement la manière la plus élégante de le faire.
Directement dans l'appel du constructeur PDO, mais en évitant l'option buggy charset (comme mentionné ci-dessus):
$connect = new PDO( "mysql:host=$host;dbname=$db", $user, $pass, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ) );
Fonctionne très bien pour moi.
la source
array(1002 => 'SET NAMES utf8',...)
.charset=utf8
dans la chaîne DSN fonctionne! J'essayais de résoudrePour être complet, il existe en fait trois façons de définir l'encodage lors de la connexion à MySQL à partir de PDO et celles qui sont disponibles dépendent de votre version de PHP. L'ordre de préférence serait:
charset
paramètre dans la chaîne DSNSET NAMES utf8
avec l'PDO::MYSQL_ATTR_INIT_COMMAND
option de connexionSET NAMES utf8
manuellementCet exemple de code implémente 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 les trois est probablement exagéré (à moins que vous n'écrivez un cours que vous prévoyez de distribuer ou de réutiliser).
la source
Je veux 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 pourriez vous retrouver avec un autre que prévu.
Dans phpmyadmin, vous pouvez voir le classement en cliquant sur votre base de données et en choisissant les opérations. Si vous essayez de créer des tables avec un autre classement que votre base de données, vos tables se retrouveront de toute façon avec le classement de la base de données.
Assurez-vous donc que le classement de votre base de données est correct avant de créer des tables. J'espère que cela sauve à quelqu'un quelques heures lol
la source
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
la source
Je pense que vous avez besoin d'une requête supplémentaire car l'option charset dans le DSN est en fait ignorée. voir le lien posté dans le commentaire de l'autre réponse.
En regardant comment Drupal 7 le fait dans http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7 :
// Force MySQL to use the UTF-8 character set. Also set the collation, if a // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci' // for UTF-8. if (!empty($connection_options['collation'])) { $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']); } else { $this->exec('SET NAMES utf8'); }
la source
$con=""; $MODE=""; $dbhost = "localhost"; $dbuser = "root"; $dbpassword = ""; $database = "name"; $con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
la source
Je teste ce code et
$db=new PDO('mysql:host=localhost;dbname=cwDB','root','', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $sql="select * from products "; $stmt=$db->prepare($sql); $stmt->execute(); while($result=$stmt->fetch(PDO::FETCH_ASSOC)){ $id=$result['id']; }
la source