Jak zrobić PDO run SET NAMES utf8 za każdym razem gdy się podłączam, w ZendFramework

Jak sprawić, by adapter PDO uruchamiał nazwy zestawów utf8 za każdym razem, gdy się podłączam, w ZendFramework. Używam pliku INI, aby zapisać dane konfiguracyjne adaptera. jakie wpisy powinienem tam dodać?

Jeśli nie było jasne, Szukam poprawnej składni, aby to zrobić w config.plik ini mojego projektu, a nie w kodzie php, ponieważ uważam tę część kodu konfiguracyjnego.

Author: Itay Moav -Malimovka, 2009-02-25

8 answers

Itay,

Bardzo dobre pytanie. Na szczęście dla Ciebie Odpowiedź jest bardzo prosta:
database.params.driver_options.1002 = "SET NAMES utf8"

1002 jest wartością stałej PDO:: MYSQL_ATTR_INIT_COMMAND

Nie możesz użyć stałej w konfiguracji.ini

 47
Author: David Snabel-Caunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-31 20:11:09

Fear my google-fu

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

Pierwsze trafienie;)

 119
Author: SchizoDuckie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-05 08:22:24

Po prostu umieść to w swoim config

database.params.charset = "utf8"

Lub po ZF 1.11 to by działało do resources.db.params.charset = utf8 to jest to

 32
Author: tawfekov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-26 07:53:28

Połączenie w zend_db jest leniwe, co oznacza, że łączy się przy pierwszym zapytaniu. jeśli masz statyczną stronę bez zapytania, nigdy się nie połączy - nawet jeśli jest zainicjowana w Twoim pliku bootstrap.

So running:

$db->query("SET NAMES 'utf8'");
Nie jest taki mądry. Wielkie podziękowania dla dcaunt za jego rozwiązanie.
 4
Author: Leon Fedotov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 06:41:48

Wszystkie te metody shoud działają, z wyjątkiem pewnych szczególnych okoliczności. Na przykład, jeśli uruchamiasz serwer WWW lokalnie na komputerze z systemem Windows z php query ("SET NAMES 'utf8'"); zanim twoje rzeczywiste zapytanie zadziała. Każda inna metoda próbująca użyć MYSQL_ATTR_INIT_COMMAND zakończy się niepowodzeniem.

Oto czego się dzisiaj nauczyłem, zmagając się z tym problemem:

  1. Nie możesz odwoływać się do PDO::MYSQL_ATTR_INIT_COMMAND w niektórych środowiskach (tj. mój, konkretnie Nie wiem). Musisz użyć 1002 zamiast

  2. Zend Framework 1.11 (być może od 1.8, do potwierdzenia), nie musisz ustawiać bazy danych.params.driver_options.1002 = "Ustaw nazwy utf8" w konfiguracji.ini: zasoby.db.params.charset = "utf8" wystarczy, aby Zend_Db_Adapter_Pdo_Mysql zrobił to za Ciebie.

  3. W systemie windows potrzebujesz php > = 5.3.1, aby MYSQL_ATTR_INIT_COMMAND działało.

  4. W przypadku zastąpienia php w wersji 5.3.1 lub wyższej (testowałem również 5.3.3), musisz się upewnić, że ustawiłeś wartość na pdo_mysql.default_socket w Twoim php.ini. Domyślna pusta wartość nie będzie działać ( do potwierdzenia: czytałem coś o tym, ale nie próbowałem bez niego po dowiedzeniu się o punkcie 5)

  5. Musisz również upewnić się, że masz '127.0.0.1 localhost' w ukrytym pliku systemowym windows\system32\drivers\etc\hosts (to nie był problem dla php 5.3.0)

Z wszystko to na uwadze, powinieneś być w stanie zaoszczędzić od siebie dzień googlowania i zachować niektóre włosy! ;)

 3
Author: mlarcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 18:42:37

Musisz wykonać to polecenie przed rozpoczęciem zapytań, musisz wykonać je tylko raz przed zapytaniami, a nie dla każdego zapytania.

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

Pełny przykład

$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
Author: Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 07:50:46

W Twoim pliku bootstrap...

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

Następnie zapisujesz tę instancję w rejestrze

Zend_Registry::set('db', $db);
 0
Author: patchinko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-06 18:59:26
$table->getAdapter()->query('SET NAMES UTF8');
 -1
Author: wormhit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-10 15:07:35