Mysql Вопросительные знаки вместо русского текста

Wladim

Новичок
Здравствуйте.
При поиске на этом форуме "вопросительные знаки" перечитал касаемые моей проблемы темы и не нашел ответа. Поэтому сформулирую вопрос так:
Создал сайт, все работает прекрасно. После создания блока admin индексный файл отображается нормально, но как только пытаюсь добавить нового пользователя через сайт - обработчик ругается: недопустимые символы в ФИО и т.д.. Добавил нового пользователя непосредственно в БД и в результате при выборке на сайте вместо всех данных пользователя выводятся вопросительные знаки (как, впрочем, и в <title>).
Кодировка в БД cp1251_general_ci, во всех файлах прописано <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">.
ОС Win7, Web Servers Endels (Денвер).
Подскажите, как исправить ситуацию...
 

Фанат

oncle terrible
Команда форума
вообще странно. должно находить как минимум вот эту ссылку, http://phpfaq.ru/charset
подсказать тут сложно, но навскидку - SET NAMES cp1251 отправлять в базу сразу после коннекта.
Если перестанет нормально отображаться - читать по ссылке и разбираться, где какая кодировка.
 

Wladim

Новичок
Фанат, вот с этого-то вопроса (где какая кодировка) я и начал соображать после выключения компа, а сегодня засел за проверку кодировок как самой БД так и файлов. И обнаружил, что БД в кодировке utf8 (у меня Web_Servers_Endels - Денвер), а в файле db.php кодировки установлены cp1251_general_ci. Таблиц у меня пока немного, так что вручную поменял кодировка в БД cp1251_general_ci на utf8_general_ci.
И все стало ОК!
Спасибо за участие.
 

Фанат

oncle terrible
Команда форума
cp1251_general_ci - это не кодировка, а набор правил сравнения. кодировка здесь - cp1251
что такое db.php я не знаю
надеюсь, менял на таблицах без данных.
 

Wladim

Новичок
Фанат, спасибо за разъяснение разницы между cp1251_general_ci и cp1251 - для меня это были установки, влияющие на отображения символов. Теперь буду знать точное их назначение.
В индексном файле есть такое:
PHP:
include './blocks/db.php';
то есть в файле db.php прописано подключение к БД
PHP:
// Соединяемся с сервером mysq, который находится на localhost указав логин и пароль пользователя и заведем это в переменную $db
    $db = mysql_connect('localhost', 'wlad', '12345'); 
//  Выбираем базу данных, с которой будем работать "ser" с идентификатором соединения $db
    mysql_select_db("ser", $db);
//	кодировки
    mysql_query('SET NAMES cp1251', $db);          
    mysql_query('SET CHARACTER SET cp1251', $db);  
    mysql_query('SET COLLATION_CONNECTION="utf8_general_ci"', $db);
Менял cp1251_general_ci на utf8_general_ci в таблицах с данными (они в таблицах записаны по русски). А почему это Вас заинтересовало?
 

Фанат

oncle terrible
Команда форума
вообще-то, при попытке поменять кодировку таблицы, mysql попытается перекодировать уже лежащие в ней данные.
и - если изначально кодировка была указана неверно - испортить их.

в db.php написан бред и шаманские пляски. SET CHARACTER SET вообще не имеет смысла, а последняя строчка меняет всё, указанное до неё. надо выбрать что-то одно.

всё стало, как я понимаю, не "ок", а просто база перестала перекодировать непонятные для неё данные.
 

Wladim

Новичок
Действительно, Фанат, "mysql перекодировала уже лежащие в ней данные" и при новом введении данных через форму "перестала перекодировать непонятные для неё данные", что выразилось в сообщении: "В поле 'Фамилия' введены недопустимые символы". Все эти дни что только не предпринимал: менял кодировки, убрал из файла db.php все лишнее, оставил только
PHP:
// Соединяемся с сервером mysq, который находится на localhost указав логин и пароль пользователя и заведем это в переменную $db
    $db = mysql_connect('localhost', 'wlad', '12345'); 
//  Выбираем базу данных, с которой будем работать "ser" с идентификатором соединения $db
    mysql_select_db("ser", $db);
//    кодировки
    mysql_query('SET NAMES utf8', $db);
удалял вообще последнюю строчку в файле db.php - никакой реакции: сплошные вопросительные знаки вместо русских букв в БД... Доэкспериментировал до того, что все русские буквы в файле-обработчике превратились в квадраты, а в БД ничего не заносится...
Что делать?
 

Фанат

oncle terrible
Команда форума
по ссылке всё написано
в общем случае нужно только две вещи
1. чтобы кодировка таблиц поддерживала русские буквы.
2. чтобы в скриптах вызывалась SET NAMES с кодировкой, соответствующей кодировке HTML.
 

fixxxer

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

Wladim

Новичок
Поскольку Кодировка сервера (Web_Servers_Endels): UTF-8 Unicode (utf8) и её не изменить, то в Основных настройках phpMyAdmin Сопоставление кодировки соединения с MySQL установил cp1251_general_ci и в таблицах установил Сравнение тоже cp1251_general_ci. А в файле db.php прописал после Защита от хостинга, не поддерживающего прямую передачу переменных (GET) следующее:
PHP:
// Соединяемся с БД, указав логин и пароль
$db = mysql_connect("localhost","wla","123"); 
//кодировка
mysql_query('SET NAMES cp1251');
//Выбираем базу, с которой будем работать "serv"
mysql_select_db("serv",$db);
И только после всех этих изменений всё заработало как надо.
Спасибо, Фанат и fixxxer, за помощь.
 
Сверху