it-swarm.com.de

PHP PDO: Zeichensatz, Namen setzen?

Ich hatte das vorher in meiner normalen mysql_ * Verbindung:

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

Brauche ich es für die PDO? Und wo soll ich es haben?

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

Sie haben es in Ihrer Verbindungszeichenfolge wie:

"mysql:Host=$Host;dbname=$db;charset=utf8"

Die Charset-Option wurde jedoch vor PHP 5.3.6 ignoriert. Wenn Sie eine ältere Version von PHP verwenden, müssen Sie Folgendes tun:

$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh->exec("set names utf8");
412
Cobra_Fast

Vor PHP 5.3.6 wurde die Charset-Option ignoriert. Wenn Sie eine ältere Version von PHP verwenden, müssen Sie Folgendes tun:

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");

?>
60
9nix00

Dies ist wahrscheinlich der eleganteste Weg, dies zu tun.
Direkt im PDO-Konstruktoraufruf, aber unter Vermeidung der fehlerhaften Zeichensatzoption (wie oben erwähnt):

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

Funktioniert gut für mich.

37
Jpsy

Der Vollständigkeit halber gibt es drei Wege, um die Kodierung festzulegen, wenn Sie von PDO aus eine Verbindung zu MySQL herstellen. Welche davon verfügbar sind, hängt von Ihrer PHP -Version ab. Die Reihenfolge der Präferenz wäre:

  1. charset Parameter in der DSN-Zeichenfolge
  2. Führen Sie SET NAMES utf8 mit der Verbindungsoption PDO::MYSQL_ATTR_INIT_COMMAND aus
  3. Führen Sie SET NAMES utf8 manuell aus

Dieser Beispielcode implementiert alle drei:

<?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);
}

Alle drei zu tun ist wahrscheinlich übertrieben (es sei denn, Sie schreiben eine Klasse, die Sie verteilen oder wiederverwenden möchten).

16

Ich denke, Sie benötigen eine zusätzliche Abfrage, da die Zeichensatzoption im DSN tatsächlich ignoriert wird. Siehe den Link im Kommentar der anderen Antwort.

Schauen Sie sich an, wie Drupal 7 dies in http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7 ausführt. _:

// 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

Ich möchte nur hinzufügen, dass Sie sicherstellen müssen, dass Ihre Datenbank mit COLLATE utf8_general_ci erstellt wurde, oder welche Art von Kollation Sie auch verwenden möchten. Andernfalls erhalten Sie möglicherweise eine andere als die beabsichtigte.

In phpmyadmin können Sie die Kollatierung sehen, indem Sie auf Ihre Datenbank klicken und Operationen auswählen. Wenn Sie versuchen, Tabellen mit einer anderen Sortierung als Ihrer Datenbank zu erstellen, erhalten Ihre Tabellen sowieso die Datenbank-Sortierung.

Stellen Sie daher sicher, dass die Kollatierung für Ihre Datenbank korrekt ist, bevor Sie Tabellen erstellen. Ich hoffe, das erspart jemandem ein paar Stunden

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

Ich teste diesen Code und

$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; Zeichensatz = $ 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