web-dev-qa-db-de.com

Wie man PDO jedes Mal, wenn ich eine Verbindung herstelle, SET NAMES utf8 ausführen lässt, in ZendFramework

Wie man den PDO Adapter jedes Mal, wenn ich eine Verbindung herstelle, SET NAMES utf8 ausführen lässt, in ZendFramework. Ich verwende eine INI Datei, um die Adapterkonfigurationsdaten zu speichern. Welche Einträge soll ich dort hinzufügen?

Wenn es nicht klar war, suche ich nach der richtigen Syntax, um dies in der config.ini-Datei meines Projekts und nicht im PHP-Code zu tun, da ich diesen Teil des Konfigurationscodes betrachte.

40

Itay,

Eine sehr gute Frage. Zum Glück ist die Antwort ganz einfach:

database.params.driver_options.1002 = "SET NAMES utf8"

1002 ist der Wert der Konstante PDO :: MYSQL_ATTR_INIT_COMMAND

Sie können die Konstante in der config.ini nicht verwenden

47

fürchte mein google-f

$pdo = new PDO(
    'mysql:Host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

erster Treffer;)

121
SchizoDuckie

lege dies einfach in deine config

database.params.charset = "utf8"

oder nach ZF 1.11 würde dies funktionieren, um resources.db.params.charset = utf8 das ist es

32
tawfekov

Die Verbindung in zend_db ist träge, was bedeutet, dass sie bei der ersten Abfrage eine Verbindung herstellt. Wenn Sie eine statische Seite ohne Abfragen haben, wird sie nicht einmal eine Verbindung herstellen - auch wenn sie in Ihrer bootstrap file) initialisiert ist.

so läuft:

$db->query("SET NAMES 'utf8'");

Ist nicht so schlau. Ein großes Dankeschön an dcaunt für seine Lösung.

4
Leon Fedotov

Alle diese Methoden shoud funktionieren, außer unter bestimmten Umständen. Wenn Sie beispielsweise einen Webserver lokal auf einem Windows-Computer mit PHP <5.3.1 ausführen, wird nur eine 'manuelle' $ db-> Abfrage ("SET NAMES 'utf8'") ausgeführt. bevor Ihre eigentliche Abfrage funktioniert. Alle anderen Methoden, die versuchen, MYSQL_ATTR_INIT_COMMAND zu verwenden, schlagen fehl.

Folgendes habe ich heute gelernt, als ich mit genau diesem Problem zu kämpfen hatte:

  1. Sie können in einigen Umgebungen (d. H. In meinen Umgebungen, insbesondere wenn ich es nicht weiß) nicht auf PDO :: MYSQL_ATTR_INIT_COMMAND verweisen. Sie müssen stattdessen explizit 1002 verwenden

  2. Mit Zend Framework 1.11 (möglicherweise seit 1.8, muss noch bestätigt werden) müssen Sie nicht database.params.driver_options.1002 = "SET NAMES utf8" in Ihrer config.ini festlegen: resources.db.params.charset = "utf8 "wird für Zend_Db_Adapter_Pdo_Mysql ausreichen, um es für Sie zu tun.

  3. Unter Windows benötigen Sie php> = 5.3.1, damit MYSQL_ATTR_INIT_COMMAND funktioniert.

  4. Wenn Sie Ihre PHP-Version durch 5.3.1 oder höher ersetzen (ich habe auch 5.3.3 getestet), müssen Sie sicherstellen, dass Sie in Ihrer php.ini einen Wert für pdo_mysql.default_socket festlegen. Der voreingestellte leere Wert wird nicht funktionieren (zur Bestätigung: Ich habe etwas darüber gelesen, habe es aber nicht versucht, nachdem ich über Punkt 5 erfahren habe)

  5. Sie müssen auch sicherstellen, dass Sie '127.0.0.1 localhost' in Ihrer versteckten Windows\System32\Treiber\etc\Hosts-Systemdatei haben (das war kein Problem für PHP 5.3.0)

Vor diesem Hintergrund sollten Sie in der Lage sein, sich einen Tag des Googelns zu ersparen und einige Ihrer Haare zu behalten! ;)

3
mlarcher

Sie müssen diesen Befehl nur ausführen, bevor Sie Abfragen starten. Sie müssen ihn nur einmal vor den Abfragen und nicht für jede Abfrage ausführen.

$pdo->query("SET NAMES 'utf8'");

Vollständiges Beispiel

$servername = "localhost";
$username = "root";
$password = "test";
$dbname = "yourDB";

try {
    $pdo = new PDO("mysql:Host=$servername;dbname=$dbname", $username, $password);

    $pdo->query("SET NAMES 'utf8'");

    //set the PDO error mode to exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT name FROM nations";
    foreach ($pdo->query($sql) as $row) {
       echo "<option value='".$row['name']."'>".$row['name']."</option>";
    }


} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$pdo = null; 
1
Black

In Ihrer bootstrap Datei ...

$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");

dann speichern Sie diese Instanz in Ihrer Registrierung

Zend_Registry::set('db', $db);
0
patchinko