web-dev-qa-db-fra.com

PHP PDO: jeu de caractères, noms de jeu?

Je l'avais précédemment dans ma connexion mysql_ * normale:

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");

Est-ce que j'en ai besoin pour le PDO? Et où devrais-je l'avoir?

$connect = new PDO("mysql:Host=$Host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
171
Karem

Vous l'aurez dans votre chaîne de connexion comme ceci:

"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");
412
Cobra_Fast

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

?>
60
9nix00

C'est probablement la manière la plus élégante de le faire.
Droit 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"
  )
);

Ça marche bien pour moi.

37
Jpsy

Par souci d’exhaustivité, il existe trois méthodes pour définir l’encodage lors de la connexion à MySQL depuis PDO. Les options disponibles dépendent de votre version PHP. L'ordre de préférence serait:

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

Cet 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, c'est probablement exagéré (à moins d'écrire un cours que vous prévoyez de distribuer ou de réutiliser).

16
Álvaro González

Je pense que vous avez besoin d'une requête supplémentaire car l'option charset du DSN est en réalité ignorée. voir le lien posté dans le commentaire de l'autre réponse.

Voici 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');
}
2
Berdir

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 celui prévu.

Dans phpmyadmin, vous pouvez voir le classement en cliquant sur votre base de données et en choisissant des opérations. Si vous essayez de créer des tables avec un autre classement que votre base de données, vos tables se retrouveront quand même 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 économise quelques heures à quelqu'un lol

2
Medda86
$conn = new PDO("mysql:Host=$Host;dbname=$db;charset=utf8", $user, $pass);
0

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'];
}
0
elite andot

$ con = new PDO ("mysql: Host = $ dbhost; dbname = $ database; charset = $ encoding ", "$ dbuser", "$ dbpassword");

0
Dilmurod
$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 );   
0
Jayanit Satani