![]() |
Перезапись данных при нажатии Refresh...
При нажатии на refresh на странице оператора данные перезаписываются в БД...
Написала модуль с формой записи данных в БД. Принцип работы следующий: Код:
Всё просто замечательно работает кроме одного ньюанса: когда пользователь нажимает refresh после оповещения оного о том, что его переменная была занесена в БД запись происходит по-новой! и в новую строку таблицы. Другими словами, за пять минут зловредный пользователь может конкретно засорить базу данных. Решила я во избежание повторной записи добавить команду sleep в код функции оператора: Код:
не помогло. Вместо переадресации выдаёт Page cannot be displyed хоть в БД всё записывается. Но выход не очень.... Переадресация через n время тоже не поможет - нужно чтоб пользователь успел прочитать оповещение о том, что $var1 записан и при этом не нажал refresh - способ отпал. Пробовала прибегнуть проверке заполнения полей формы и их проверкой в операторе: Код:
Всё равно записывает, хотя поле по идее должно очистится ещё до того, как выводится оповещение об удачной записи $var1 в БД.... Как решить этот вопрос? Заранее большое спасибо за внимание и помощь! P.S. На данный момент я использую дополнительную функцию для решения проблемы: Код:
А так-же добавила в операторе автоматическую переадресацию пользователя в новую функцию строкой Код:
и соответственно вписала новый case в switch Недостаток этого метода в том, что пользователь зная прямую ссылку на функцию success может туда попасть без всяких форм (незнаю зачем правда) и получается такая себе дырка, только не в защите а в проработке сайта.... Может кто подскажет метод без дополнительных функций? |
Я эту проблему решал через header location. Но там перебраска стоит в функцию, где отображаются все записи, поэтому писать "Ваше сообщение добавлено" не было не обходимости, и так увидит.
Обновляя страницу можно, но можно и заново писать, т.е. жать не рефлешь, а назад и Ок, назад и ОК. Эффект пачти тот же. Поэтому тут лучше сделать перед записью в базу проверку на IP (естессно записывать IP каждого отправителя) или сделать запись в куки. Тут в зависимости от того что отправляет пользователь и как часто ему разрешено это делать. Комментарии сделаны так у меня: //Запрашиваем из базы IP последнего отправителя для данной статьи $result4 = $db->sql_query("SELECT sid, date, host_name FROM ".$prefix."_comments WHERE (sid='$sid') ORDER BY date DESC LIMIT 0,1"); $row4 = $db->sql_fetchrow($result4); $sidf = intval($row4['sid']); $datef = $row4['date']; $ipf = $row4['host_name']; $ip = $_SERVER["REMOTE_ADDR"];//определяем IP того кто отправляет сейчас $post = time()-3600;//Уточняем время $post2 = Date("Y-m-d H:i:s", $post); if (($sidf=$sid) AND ($ipf=$ip) AND ($datef>$post2)) { $result = 6; $look1 = "Вы уже оставили комментарий к этой статье."; } Тоесть подрят нельзя отправить 2 комментария подрят. Можно спустя время, или после того, как то другой напишит комментарий. Если нужно, чтобы всего 1 раз с этого IP отсылалось, то запросить в базу IP отправителя, и если там такое есть, то отказ. Варианты, где можно посмотреть запись по кукам - Модуль опросов (точно незнаю) или рейтинг к статьям (тут точно есть). |
Ха! Действительно голосование стоило-бы поковырять :smile:
Правда там один глюк есть - накрутить голоса можно очень просто ;) но это не столь важно. Пошла делать. |
С IP и вправду проблем никаких не возникло, а вот со временем - глюк :oooo:
Код:
Код:
В БД timestamp записывается, а вот flood контроль не работает... $var1 одинаково успешно заносится хоть по прошествию 60 -и секунд, хоть до этого периода. |
function operator ($var1, $p_time) - добавить время в функцию.
global $prefix; - тут вар не нужен, если она не глобальная Должно помоч. А вообще, лучше записывайте в БД и IP и время. Эта проверка если и поможет, так только от обновления страницы. А флудить можно и подругому. Вернул страницу назад - нажал Субмит, назад и Субмит. За минут 5-10 можно с 500 записей сделать. --- Еще как совет - включите отображение Notice'ов. Придется помучаться (ибо их полно там). Но зато все ошибки будете видеть на экране. Какая переменная не определена и т.д. |
зделала всё как ты пишешь... просто в примере ошибок наделала:) бывает...
вывожу суть проблемы: В этом варианте запись происходит вне зависимости от установленого лимита... (Обратите внимание на знак "меньше"). Код:
Здесь - не записывает вовсе (Обратите внимание на знак "больше"): Код:
Причём по отдельности оба условия работают: Код:
Код:
|
Всем спасибо! Разобралась до конца сама :wink:
|
Часовой пояс GMT +4, время: 01:38. |
Copyright © 2005 by Soniks