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 может туда попасть без всяких форм (незнаю зачем правда) и получается такая себе дырка, только не в защите а в проработке сайта....
Может кто подскажет метод без дополнительных функций?
Написала модуль с формой записи данных в БД. Принцип работы следующий:
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 может туда попасть без всяких форм (незнаю зачем правда) и получается такая себе дырка, только не в защите а в проработке сайта....
Может кто подскажет метод без дополнительных функций?