При обновлении страницы запрос повторяется

 
0
 
PHP
ava
Cript777 | 25.01.2013, 01:47
Приветствую!) Так вот имеется две страницы, на первой пользователь вводит код, далее он переходит на страницу act.php, которая при дальнейшем переходе передает в кейс страницы переменные money и code.  В кейсе идет два запроса к бд. Первый обновляет money пользователя, второй удаляет введенный ранее код из бд. Когда пользователь находится на странице с кейсом, код уже удален, но при обновлении этой страницы  первый запрос к бд можно повторить сколько угодно раз. Как это исправить?

страница с формой:


<form action="act.php" method="POST">
<input type="text" name="code"><input type="submit" class="submit" value="Далее" name="submit">
</form>


Страница act.php:


<?php

if(isset($_POST['submit']))
{
$code = $_POST['code'];
$code=mysql_real_escape_string($code);
$query = "SELECT id, code, money
FROM actcode
WHERE code ='{$code}'
LIMIT 1";
$sql = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($sql) == 1) 
{
        $row = mysql_fetch_array($sql);
        $money = isset($row['money']) ? $row['money'] : "";

echo "<div align=right>
<form method=POST action=act.php?act=action>
<input type=hidden name=code value=$code>
<input type=hidden name=money value=$money>    
<input type=submit value=Далее></form></div>";
}else {
echo '<br><center>Неверный код</font></center><br> ';
}
}

    SWITCH ($_REQUEST['act']){
CASE ("action"):
$money = $_POST['money'];
mysql_query("запрос который обновляет money пользователя'"); 
mysql_query ("DELETE FROM `actcode` WHERE `code`='".mysql_real_escape_string ($_POST['code'])."'");  \\\\\ этот запрос удаляет отправленный из формы код
echo '<br><center>успешно.</center><br>';
break;
}

?>    
Kommentare (7)
ava
Fortop | 25.01.2013, 01:09 #
Цитата (Cript777 @  25.1.2013,  00:47 findReferencedText)
Как это исправить? 

Редирект после постинга формы.

Народ решает вопрос при помощи параметра-ключа. Но редиректа достаточно.
ava
Cript777 | 25.01.2013, 01:39 #
не совсем понимаю.. smile 
Цитата (Fortop @  25.1.2013,  01:09 findReferencedText)
 Но редиректа достаточно. 

можно вернуться и обновить страницу..  
ava
Арантир | 25.01.2013, 02:07 #
Цитата (Cript777 @  24.1.2013,  23:47 findReferencedText)
Когда пользователь находится на странице с кейсом, код уже удален, но при обновлении этой страницы  первый запрос к бд можно повторить сколько угодно раз. Как это исправить? 

И что с того? Вам жалко запросов что ли?
На каждом втором сайте пользователь простым обновлением страницы инициирует кучу запросов, выводящих в итоге то, что он, собственно, видит на странице.

Если код уже удален, то первый запрос (с выбором кода) уже ничего плохого не сделает.
ava
Cript777 | 25.01.2013, 02:28 #
Цитата (Arantir @  25.1.2013,  02:07 findReferencedText)
И что с того? Вам жалко запросов что ли?

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



Если код уже удален, то первый запрос (с выбором кода) уже ничего плохого не сделает. 

Вы видимо не поняли, но первый запрос к бд обновляет пользователю счет, на число привязанное к коду, который вводит пользователь. Второй запрос этот код удаляет. Но если обновлять эту страницу то это число будет, в нашем случае прибавляться, при каждом обновлении.. 
ava
Арантир | 25.01.2013, 02:48 #
Значит у вас неправильный подход к реализации пополнения счета.
Судя из act.php пользователь и безо всякого кода может себе счет пополнить.

Даже если валюта просто виртуальная и не имеет ценности, то все равно не мешало бы позаботится об стойкой системе. Хотя бы для комфорта пользователей.

Если не вдаваться в элегантность, то последовательность операций должна быть такой:

если (присутствует код в базе)
    пополнить счет
    если (пополнение успешно)
        удалить код

Таким образом более одного раза по одному коду пополнить счет физически невозможно, как бы там пользователь не обновлял страницу.

Всего один дополнительный запрос и 2 условия и все стало куда надежнее.

später ergänzt:
Кроме того, не вижу прямой необходимости в разделении процесса на несколько переходов по страницам.
Вполне достаточно одной: Пользователь вводит код и жмет ОК и получает результат - счет пополнен либо ошибка.

По-моему, вся суть проблемы у вас и заключается в том, что вы создали неуместный переход по страницам между проверкой кода и пополнением счета. Между этими операции не должно быть ничего "лишнего".
Конечно, вы можете оставить переход по страницам, но дополнительную проверку непосредственно перед пополнением добавьте в любом случае.
ava
Cript777 | 25.01.2013, 04:14 #
Цитата (Fortop @  25.1.2013,  01:09 findReferencedText)
Редирект после постинга формы.



Народ решает вопрос при помощи параметра-ключа. Но редиректа достаточно. 


Да, помогает, спасибо большое!  smile
ava
Aliance | 25.01.2013, 10:46 #
Arantir, все-таки мне кажется любые операции с деньгами (пусть и виртуальными) лучше делать в транзакции. Хотя внутри транзакции логика именно как ты описал)
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden