Проблема с кириллицей после обновления PHP. Где искать?
Привет, друзья!
Сегодня на моем сервере обновили PHP. Был 5.3.x, а стал 5.4.x. Зашел в админку сайта и не вижу данных. Что важно, не вижу данных только тех полей, где была кириллица. Использую Windows-1251. Через phpMyAdmin все данные на месте.
Куда копать?
Где смотреть?
Пример из старого кода:
if (!@mysql_connect("localhost","root",""))
die("mySQL: Ошибка подключения к серверу/ Database server-connect error");
if (!@mysql_select_db("base"))
die("mySQL: Ошибка выбора базы / Database select error");
mysql_query("SET NAMES utf8");
В зависимости от библиотеки для работы с базой mysql_query возможно, нужно будет заменить на обращение к библиотеке, к примеру на $DB->query('
Посомтрите в коде, как у вас выполняются запросы.
На самом деле проверил что мог. Ничего не могу понять. :( Наверное тут дело не в кодировке.
Вот еще раз:
1. Жил не тужил. Обновил PHP и MySQL. Какие версии были прежде не помню, но теперь PHP 5.4.45 и MySQL 5.5.54;
2. В админке сайта поля с данными многие пустые. Некоторые с данными. Я заметил, что если в поле есть кириллица, то оно будет отображаться пустым. Хотя в списке всех записей, есть записи с кириллицей. Неясно как так. Я, вообще, всегда думал, что если уж проблема с кодировкой, то и отображается криво, но отображается.
3. На сайте отображаются все поля кроме одного. Оно ничем не особенное и содержит просто ссылку (тег a). То есть, скрипт все отлично получает и в нужной кодировке;
4. В phpMyAdmin все отображается хорошо. Сравнение cp1251;
5. В php.ini ничего нет, касательно кодировки, в .htaccess 1251 стоит.
Erick_Flatcher: Посмотрите на работу htmlspecialchars, с какой-то версии принцип поменялся и нужно третий аргумент указывать, сейчас не помню точно.
Вот, с Тостера:
htmlspecialchars и htmlentities
У них третий параметр - кодировка, до PHP 5.4 она была по умолчанию однобайтной, а теперь - utf-8. Кирилиллица в cp1251 такими функциями превращается в пустую строку. Вот ее вы и наблюдаете.
Нужно либо переходить на utf-8, либо прописывать в каждой функции 'cp1251' третьим аргументом.
Вот такого типа должно быть: htmlentities($str, ENT_QUOTES, 'UTF-8');
Спасибо. В общем, там мой старый скрипт не хотел работать с новым мусколом. Решил, что не потяну разбираться и вернул все обратно. Я не очень опытен в таких вещах и думал, что любые функции обратносовместимы. Откат обновления PHP и MySQL вообще все сломали. Пришлось вес сервер из бэкапа восстанавливать.
Как бы там ни было, а большое спасибо за участие и за то что вникал в мою проблему. Спасибо! :)
Проверить 3 места:
1. конфиг php (php.ini)
2. конфиг сервера (тут можно просто в .htaccess забить кодировку)
3. конфиг базы (мало вероятно, что она была и вдруг сменилась кодировка, но если первые 2 пункта не помогли идем в phpMyAdmin и смотрим что там)