[SOLVED] Проблема с кодировкой в Zend Server на Windows

База UTF-8. Все таблицы заточены под utf8_general_ci.

В конфиге уже прописано:



            'charset'=>'UTF8'

После выполнения ->save() в базу русский текст записывается белибердой а именно:

�¿�µ���²���¹ �º�¾�¼�¼�µ�½��

При этом когда вывожу полученые данные из модели при обращении к методу - то с данными все нормально. т.е. портятся они уже именно в базе а не до записи.

как можно решить проблему? в php.ini дефаулт чарсет тоже utf-8 поставил но не помогло. на странице в хедере также прописан utf-8

Проверь:

  • чтоб таблицы в БД имели кодировку утф-8

  • чтобы нужные поля в таблицах также имели кодировку утф-8

  • чтобы остальной текст на странице также реально был в утф-8, а не только в хедере было прописано.

Quote

Проверь:
  • чтоб таблицы в БД имели кодировку утф-8

  • чтобы нужные поля в таблицах также имели кодировку утф-8

  • чтобы остальной текст на странице также реально был в утф-8, а не только в хедере было прописано.

Уже 100 раз проверил. все верно.

Вот кусок контроллера:

			$comment = new Comments();


			


			if (!empty($_POST['Comments']))


			{


				$comment->attributes=$_POST['Comments'];


				if($comment->validate()) {


					$comment->id_post = $post->id;


					$comment->id_user = Yii::app()->user->id;


					$comment->login = Yii::app()->user->name;


					$comment->created = date('Y-m-d H:i:s');


					$comment->save();


					$this->redirect(array('list', 'url' => $url));


				}


			}

После этого в базу идет фигня вместо русского комментария.

Если до сэйва (или после) обратится к echo $comment->text - то на экран увидим что переменная нормально заполнена комментарием и он не испорчен.

Вот часть шапки которая говорит что на странице utf-8. Текст на странице отображается в норм кодировке.

<html>


<head>


<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


Вот еще скрины таблицы и базы что б не подумали что я забыл указать кодировку.

Мда… что могу сказать? клиника :)

Вот только последнее предположение:

Ты написал, что у тебя:



    'charset'=>'UTF8'


Вместо этого попробуй:



'charset'=>'utf8'


То есть, строчными.

А что выводит $comment->text после сохранения, но перед редиректом или рефрешем?

Quote

А что выводит $comment->text после сохранения, но перед редиректом или рефрешем?

в том то и суть что $comment->text и до и после сохранения выводит всё нормально. ну только если уже следать повторный find то получу белиберду с базы.

в конфиге менял “UTF8” на “utf8” - ничего не поменялось. :(

непонятная фигня блин…

Тогда я пас.

Вот еще почитай:

http://www.yiiframew…opic,974.0.html

http://www.yiiframew…oc/cookbook/16/

Проверь my.cnf (если у тебя Мускуль)

Quote

В my.cnf в разделе [mysqld] прописываем init-connect=”SET NAMES cp1251”

А так же php.ini:

Quote

4. В /etc/php.ini - выставляем: default_charset = “cp1251” - это то

Только в твоем случае cp1251 меняется на utf-8.

Скорее всего у тебя просто не с той кодировкой php подключается к Мускулю.

to rosko

читал уже)

всеравно сенк. попробую еще сам поковырять, а потом уже буду амерекосам писать :)

to cr0t

щя попробую. а default_charset уже выставлен в ютф8

Если что получится, обязательно здесь отпишись. В назидание потомкам :)

самое интересное что пхпмуадмином когда добавляю записи через вставить - то данные не портятся. фигня что my.cnf найти немогу в зенд сервере блин

phpmyadmin, кажется, сам выставляет кодировки при подключении к серверу. Это делается примерно так (из моего старого проекта):



$this->mMysqliHandle = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);


$this->mMysqliHandle->query ("set character_set_client='utf8'");


$this->mMysqliHandle->query ("set character_set_results='utf8'");


$this->mMysqliHandle->query ("set collation_connection='utf8_general_ci'");


После этого, в принципе, плевать на то какие установки в php.ini или my.cnf :)

Quote

самое интересное что пхпмуадмином когда добавляю записи через вставить - то данные не портятся. фигня что my.cnf найти немогу в зенд сервере блин

/etc/mysql/my.cnf ?

Или у тебя винда? Что-то я не сталкивался с Zend Server…

У меня винда. http://www.zend.com/…roducts/server/

Они походу в своем конфиге где то держут настройки мускула то поиск нече не показывает. щяс буду ковырять их хелп.

Залез я в framework/db/CDbConnection.php

Открыл функцию которая устанавливает соединение и задает начальную кодировку:

	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 ("пум пурум");');

то в базу он приходит в норм кодировке. а вот комментарии все также приходят в голимой кодировке как и раньше. оч странно.

И еще что интересно запрос в том месте где я показал выше код типа:

$pdo->query('INSERT INTO comments VALUES (null, 1, 1, "", "русский текст", "2009-03-31 12:00:00");');


нормально вставит комментарий не подпортив русский текст. очень странно, что же мешает нормально работать AR->save

Все. Проблема решена.

  1. Мне помогло то что я вошел в 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;


		}


	}

после этого в базу начало все нормально приходить и работать. при удалении этих строчек - в базу в запросах снова начинают идти иероглифы. вот такая спицифика походу зенд сервера.

  1. При выводе данных с базы (комментария) я использовал функцию htmlentities. по своей глупости подумал что функция сама должна понять кодировку. в итоге она при выводе портила все данные. проблема решается указанием третего параметра:
htmlentities($comments->text, null, "UTF-8")

Спасибо всем за помощь :)

[move]УРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРАУРА[/move]

На здоровье!

Поменяй тему топика на "[SOLVED] Проблема с кодировкой в Zend Server на Windows", так будет удобнее ориентироваться впоследствии.

Поздравляю :)