Проблемы с кодировкой при запросе данных из MySQL БД; блокировка IP
Добрый вечер, хабрагоспода!
Возникли у меня две проблемы.
Первая заключается в том, что в настройках таблицы какую я только кодировку не выставлял, а все равно знаки вопроса вместо кириллицы. Сам PHP-скрипт, выполняющий запрос обладает кодировкой Unicode UTF-8. В чем может быть проблема, как решить?
Вторая проблема заключается в необходимости запретить выполнять повторно один и тот же PHP-скрипт с таким же Post-запросом с одного IP. Как это лучше всего реализовать? Мне кажется, что заносить в БД IP абсолютно нерентабельно и вообще это лишняя нагрузка на сервер. Есть идеи?
По поводу кодировки:
mysql_query(«SET NAMES utf8»);
mysql_query(«SET COLLATION_CONNECTION=utf8_bin»);
По второй проблеме, мб механизм сессий использовать? Проверяем наличие флага — если есть, то отключаем скрипт. Если нету — создаем и работаем дальше. Правда подойдет только для реальных пользователей, браузеры которых сохраняют куки.
Защиту по куки я уже сделал :) Однако пользователи однозначно попадутся шибко умные, надо предохраниться.
Можете подсказать, как воспользоваться данными запросами? Я уже достаточно долго насилую PHP своими кривыми руками, но так ни разу и не работал с MySQL, поэтому это для меня немного ново :) Простое добавление вышеуказанных строчек ведет к HTTP 500
Должно работать, вставляйте после конекта и выбора БД.
У меня так в скрипте:
mysql_connect($conf_mysql[«host»], $conf_mysql[«login»], $conf_mysql[«pass»]) or die(«Can`t connect to DB»);
mysql_select_db($conf_mysql[«db»]) or die(«Can`t select DB»);
mysql_query(«SET NAMES utf8»);
mysql_query(«SET COLLATION_CONNECTION=utf8_bin»);
HTTP 500.
mysql_select_db($dbname, $dbcnx);
mysql_query(«SET NAMES utf8»);
mysql_query(«SET COLLATION_CONNECTION=utf8_bin»);
$ath = mysql_query(«select * from votes;»);
Вот так вот расположил. Выше коннект к БД.
Тьфу ты, блин :) Я сегодня уберневнимателен, утром три часа дебажил скрипт на jQuery, не мог понять, какого фига он не работает. В конце концов обнаружил, что забыл подключить библиотеку jQuery :)
Пойду-ка я спать, еще раз спасибо. Хотелось бы еще вариантов решения второй задачи :)
Вообще за такие советы руки на месте отрывать нужно. Потому что люди таких советов начитаются, и лепят в серьёзных проектах по 2 лишних запроса на страницу (в лучшем случае). Но идея верная, нужно выставить кодировки соединения и клиента верные, выставить их в конфигах базы, ну и желательно чтобы кодировка совпадала с кодировкой данных.
Чтобы защититься от повторных постов на тот же адрес от клиента с тем же айпи слепите из них мд5 какой-нить: md5($_POST . $_SERVER['REMOTE_ADDR'] . __FILE__);//по хорошему тут URI нужен а не __FILE__
И в базу его. При следующих постах проверяйте. Также можно штамп времени добавить и периодически старые обнулять (чтобы база не раздулась). Нерентабельности тут нет, разве что только метод решения выбран неверно (например вы таким макаром защищаетесь от нечаянного даблклика по сабмиту).
что бы не делать лишний запрос SET NAMES 'utf9' COLLATE 'utf8_unicode_ci', в файле my.cnf в секции [mysqld] можно добавить строчку init_connect='SET NAMES utf8' (насколько помню до версии мускула 4.1 было init-connect)