Плавающая ошибка с кодировкой (сайт на PHP/SMARTY/MySQL)

MikhailK

Новичок
Плавающая ошибка с кодировкой (сайт на PHP/SMARTY/MySQL)

Сайт на PHP/SMARTY/MySQL. Шаблоны SMARTY выполнены в windows-1251. При отдаче сайта хеадер с чарсетом windows-1251 из PHP отсылается:
header('Content-Type: text/html; charset=windows-1251;');

В HTML-коде метатег с windows-1251 прописан:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

Через шаблоны показываются данные из базы. База в cp1251_general_ci и таблица в cp1251_general_ci. После установки соединения отрабатывается сет нэймс:
mysql_query("SET NAMES 'cp1251'");

Когда проверяешь сайт снаружи, то видно что сервер отдает его в windows-1251. Нигде в коде данные из базы не модифицируются, фактически выводятся напрямую. Ошибка проявляется нерегулярно и выражается в том, что периодически данные из базы вылазят в UTF-8. Русские слова, которые прошиты в шаблоне, остаются русскими. Баг видели вроде как в FireFox 3.5 (сам, к сожалению, воспроизвести ошибку не могу, но источнику можно верить). Причем даже на одном и том же компьютере/браузере ошибка то есть, то нет. Баг видели на нескольких компьютерах, т.е., это не проблема конкретного кривого клиента.

Версии ПО на сервере (для справки, изменить и что-либо переставить нельзя)
PHP 5.2.3
MySQL 5.1.19
FreeBSD


PS. Аварийный выход у меня есть - в методе, который таскает данные из БД, поставить проверку получаемых данных и перекодировать их на лету, но это уж очень как-то по военному. Хотелось бы найти причину.
PPS. Сайт целиком на UTF-8 перевести не получится.

PPPS. Тему "Если у вас MySQL 4.x/5.x и ЛЮБЫЕ ПРОБЛЕМЫ С РУССКИМ - ЧИТАТЬ ЭТО!", естественно прочел, но своего случая не нашел.
 

MikhailK

Новичок
Это было первое, что я проверил. Снял дамп, собственно, и посмотрел внутрь. С данными вроде все в порядке.

А кроме того, одни и те же данные показываются то в кодировке windows-1251, то в юникоде. Причем даже на одном и том же компьютере и в одном и том же браузере, как я писал выше.

Не может это как-то быть связано с работой непосредственно MySQL-сервера? Там примерно 30-40 баз данных, которые используются сайтами, стоящими на сервере. Понятно, что все они работают под своими пользователями, но тем не менее. Не может ли какой-нибудь сайт менять какие-либо глобальные настройки сервера, которые влияют на выдачу данных из этой конкретной базы?

Еще, не знаю, может поможет - в тестовой версии сайт стоит на PHP 5.2.8/MySQL 5.1.28 и там этого бага замечено не было.
 

x-yuri

Новичок
вставь в код проверки кодировки, если utf
-8 - пиши отладочную информацию в файл
 

DiMA

php.spb.ru
Команда форума
Боже, развел какие-то сопли...
Напиши на пхп скрипт, чтобы раз в секунду скачивать главную страницу. Если в исходнике нет ключевого слова (есть, но не в той кодировке) - сохраняй на диск страницу. Проанализируй логи скрипта. И логи апача в таких случаях, т.к. размер должен отличаться.
 

MikhailK

Новичок
О, вижу настоящих программеров. :D
Прям эксбит лет пять назад. Спрашиваешь конкретную вещь, а получаешь в ответ RTFM или что-то вроде того. Если бы у меня было время на детальный анализ ситуации, стал бы я спрашивать?

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

В общем, в связи с отсутствием лишнего времени локализовал ситуацию на уровне метода доступа к данным.
 

DiMA

php.spb.ru
Команда форума
ага, ща соберется колоквиум, будет исправлять твой говнокод
 

vovanium

Новичок
Можно начать с того что MySQL 5.1.19, это еще бета двухлетней давности, мало ли какие у неё там глюки были, поставь нормальный релиз, тогда можно будет думать.
 

weregod

unserializer
MikhailK, чужой код - потёмки
можно было бы сформулировать вопрос в виде "не сталкивался ли кто с ... и как лечил?"
бывает ломаный код с остатками защиты
бывает невовремя уволенный программист, оставляющий строки вида #define TRUE (false)
 

MikhailK

Новичок
я согласен со всеми :)

Кстати, блокировка ошибки прошла успешно, так что искать дальше резона нет.
 
Сверху