При этом когда вывожу полученые данные из модели при обращении к методу - то с данными все нормально. т.е. портятся они уже именно в базе а не до записи.
как можно решить проблему? в php.ini дефаулт чарсет тоже utf-8 поставил но не помогло. на странице в хедере также прописан utf-8
А что выводит $comment->text после сохранения, но перед редиректом или рефрешем?
в том то и суть что $comment->text и до и после сохранения выводит всё нормально. ну только если уже следать повторный find то получу белиберду с базы.
в конфиге менял “UTF8” на “utf8” - ничего не поменялось.
Открыл функцию которая устанавливает соединение и задает начальную кодировку:
protected function initConnection($pdo)
{
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if($this->emulatePrepare && constant('PDO::ATTR_EMULATE_PREPARES'))
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);
if($this->charset===null)
return;
switch(strtolower($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)))
{
case 'pgsql':
$stmt=$pdo->prepare('SET client_encoding TO ?');
$stmt->execute(array($this->charset));
break;
case 'mysqli':
case 'mysql':
$stmt=$pdo->prepare('SET CHARACTER SET ?');
$stmt->execute(array($this->charset));
break;
}
}
сделал вот так:
protected function initConnection($pdo)
{
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if($this->emulatePrepare && constant('PDO::ATTR_EMULATE_PREPARES'))
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);
if($this->charset===null)
return;
switch(strtolower($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)))
{
case 'pgsql':
$stmt=$pdo->prepare('SET client_encoding TO ?');
$stmt->execute(array($this->charset));
break;
case 'mysqli':
case 'mysql':
$stmt=$pdo->prepare('SET CHARACTER SET ?');
$stmt->execute(array($this->charset));
$pdo->query("set character_set_client='utf8'");
$pdo->query("set character_set_results='utf8'");
$pdo->query("set collation_connection='utf8_general_ci'");
// $pdo->query('INSERT INTO abc VALUES ("test");');
break;
}
}
но это тоже не помогло. в качестве проверки работоспособности query с этой функции я написал простой инсерт который говорит мне о том что это место кода отработало.
еще очень интересная фигня. если в этом инсерте вставляю русский текст напечатанный через редактор т.е.
$pdo->query('INSERT INTO abc VALUES ("пум пурум");');
то в базу он приходит в норм кодировке. а вот комментарии все также приходят в голимой кодировке как и раньше. оч странно.
Мне помогло то что я вошел в framework/db/CDbConnection.php и в функцию initConnection добавил те 3 строчки. т.е. у меня она выглядит вот так вот:
/**
* Initializes the open db connection.
* This method is invoked right after the db connection is established.
* The default implementation is to set the charset for MySQL and PostgreSQL database connections.
* @param PDO the PDO instance
*/
protected function initConnection($pdo)
{
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if($this->emulatePrepare && constant('PDO::ATTR_EMULATE_PREPARES'))
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);
if($this->charset===null)
return;
switch(strtolower($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)))
{
case 'pgsql':
$stmt=$pdo->prepare('SET client_encoding TO ?');
$stmt->execute(array($this->charset));
break;
case 'mysqli':
case 'mysql':
$stmt=$pdo->prepare('SET CHARACTER SET ?');
$stmt->execute(array($this->charset));
$pdo->query("set character_set_client='utf8'");
$pdo->query("set character_set_results='utf8'");
$pdo->query("set collation_connection='utf8_general_ci'");
break;
}
}
после этого в базу начало все нормально приходить и работать. при удалении этих строчек - в базу в запросах снова начинают идти иероглифы. вот такая спицифика походу зенд сервера.
При выводе данных с базы (комментария) я использовал функцию htmlentities. по своей глупости подумал что функция сама должна понять кодировку. в итоге она при выводе портила все данные. проблема решается указанием третего параметра: