Показать сообщение отдельно
Alie вне форума      Старый Перезапись данных при нажатии Refresh... #1  
Alie
Участник+
Регистрация: 20.03.2006
Сообщения: 153


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Alie Найти все сообщения от Alie Добавить Alie в список друзей  
25.10.2006, 15:15

При нажатии на refresh на странице оператора данные перезаписываются в БД...

Написала модуль с формой записи данных в БД. Принцип работы следующий:
Код:
function main(){ global $module_name; echo "<form action='modules.php?name=$module_name&op=operator' method=POST> <input type=TEXT VALUE='$var1' name=var1> <input type='submit' name='submit' VALUE='Submit'> "; } function operator ($var1){ global $prefix,$var1; $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); if ($result){ echo "Your $var1 has been saved into database"; }else{ echo "Attention! Your $var1 wasn't saved"; } switch($op) { case "default": main(); break; case "operator": operator($var1); break; }


Всё просто замечательно работает кроме одного ньюанса: когда пользователь нажимает refresh после оповещения оного о том, что его переменная была занесена в БД запись происходит по-новой! и в новую строку таблицы. Другими словами, за пять минут зловредный пользователь может конкретно засорить базу данных.
Решила я во избежание повторной записи добавить команду sleep в код функции оператора:
Код:
function operator ($var1){ global $prefix,$var1; $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); if ($result){ echo "Your $var1 has been saved into database"; sleep(30); }else{ echo "Attention! Your $var1 wasn't saved"; }

не помогло. Вместо переадресации выдаёт Page cannot be displyed хоть в БД всё записывается. Но выход не очень....

Переадресация через n время тоже не поможет - нужно чтоб пользователь успел прочитать оповещение о том, что $var1 записан и при этом не нажал refresh - способ отпал.

Пробовала прибегнуть проверке заполнения полей формы и их проверкой в операторе:
Код:
function operator ($var1){ global $prefix,$var1; if(empty($var)){ echo "Error! Empty row!"; }else{ $var1 = strip_tags($var1); $result=$db->sql_query("insert into " . $prefix . "_table values ('$var1')"); //Очищаем поле ввода $var1 unset = ($var1); } if ($result){ echo "Your $var1 has been saved into database"; }else{ echo "Attention! Your $var1 wasn't saved"; }


Всё равно записывает, хотя поле по идее должно очистится ещё до того, как выводится оповещение об удачной записи $var1 в БД....

Как решить этот вопрос?
Заранее большое спасибо за внимание и помощь!

P.S. На данный момент я использую дополнительную функцию для решения проблемы:

Код:
function success(){ global $var1, $module_name; echo "Your $var1 has been saved into database"; }

А так-же добавила в операторе автоматическую переадресацию пользователя в новую функцию строкой
Код:
header ('location: modules.php?name=$module_name&op=success');

и соответственно вписала новый case в switch

Недостаток этого метода в том, что пользователь зная прямую ссылку на функцию success может туда попасть без всяких форм (незнаю зачем правда) и получается такая себе дырка, только не в защите а в проработке сайта....

Может кто подскажет метод без дополнительных функций?