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.
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
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;)
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
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:
Nie jest taki mądry. Wielkie podziękowania dla dcaunt za jego rozwiązanie.$db->query("SET NAMES 'utf8'");
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:
-
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
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.
W systemie windows potrzebujesz php > = 5.3.1, aby MYSQL_ATTR_INIT_COMMAND działało.
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)
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! ;)
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;
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);
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');
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