Эта тема на forum.dklab.ru


Алексей Мирошниченко: Защита от повторной отправки данных
Товарищи разработчики, подскажите как защититься от рефреша! Пишу корзину! Из файла index.php, при нажатии добавить в корзину передаю в базу значения поля(id) - товара, затем в корзине ловлю его по идентификатору сессии, и вывожу все подряд товары, которые заказаны в этом сеансе. Внимание проблемма: когда вывожу на экран все товары, делаю это в цикле при выборке из базы, и в этом же цикле накапливаю сумму $all = $all + $cena, у меня работает отлично, но после заливки на сервер, при каждом обновлении страницы, добавляется цена последнего заказанного товара! Подскажите выход из ситуации умоляю!!! :)
dimagolov:
все просто - любая обработка POST должна заканчиваться переадресацией на страницу результатов, переадресованный запрос уже будет GET и рефреш ничего никуда не отправит уже
al1:
Вот теперь точномогу сказать, что у менякакая-то проблемма в самом алгоритме подсчёта суммы. Сума у меня считается приблизительно так:

<form action = '' method = 'post'>
include("addons/dbparam.php");
$TableName = "tovar_zakaz";
$query = "select * from $TableName where sid = '".$sid."'";
$result = mysql_db_query ($DbName, $query, $link);
while ($row = mysql_fetch_array ($result))
{
$all = $all+row['price'];
}
echo $all;
<input type = 'submit' name = 'send' value = 'отправить' />
</form>
Вот при таком алгоритме, не отправляя форму а просто обновляя страницу, всегда плюсуется последний из добавленных товаров, но такой баг происходит только на сервере :(, дома всё работает отлично.
dimagolov:
al1, Вы книжку "основы SQL" просматривать не пробовали? говорят помогает, если расчитывать составлять запросы.
SELECT SUM(`price`) FROM {$TableName} WHERE `sid` = {$sid} GROUP BY `sid`[/SQL:1:fccea56427]

про обновление страницы ну была же тема на этой неделе, redirect после POST ОБЯЗАТЕЛЕН ВСЕГДА по миллиону причин
al1:
dimagolov. Ок, книжку по SQl, просматривать пробовал, насчёт вашего запроса скажу так, я привёл только часть кода, поэтому ваше уточнение мне не очень подходит, далее, насчёт post'а. редирект делаю, когда перехожу в корзину. Но снова объясню: корзина у меня подключается после перехода по ссылке, товар добавленный в корзину, сразу попадает в базу, на странице "Корзина" у меня происходит вызов заранее готовых данных из базы, при этом же происходит подсчёт суммы, форму которуя я вписал, я никуда не отправляю, на этом этапе. Но при обновлении страницы происходит прибавление последнего товара. Но такое случаетя только на сервере, если я НЕ ПОНИМАЮ, чего-то, скажите, где и на каком этапе мне ещё впихнуть редирект?
dimagolov:
Но при обновлении страницы происходит прибавление последнего товара
страница, которая обновляется что-то отправляет? по получению этого запроса что-то в базу/сессию пишется?

п.с. вся работа web приложения это обмен запросами и ответами на них. между ними существует состояние сервера. больше ничего нету - на клиенте может произойти все что угодно, ожидать от клиента определенного порядка в отправке запросов нельзя.
разберитесь по какому запросу у вас меняется состояние на сервере для начала, и исходя из чего отображаеются страницы с товаром.
al1:
dimagolov, крайне извиняюсь, что так долго мучал вас. Вся проблемма была в собственной глупости и невнимательности. В самом начале работы алгоритма, я не инициализировал переменную. На домашнем компьютере, денвер обрабатывал всё и при каждом обновлении страницы сбрасывал переменную $all в ноль автоматически. На сервере, такого не происходило и каждый раз накапливалась переменная. Добавление строки $all = 0; всё решило. Ещё раз извиняюсь и спасибо за потраченное время.
Александр Михалицын:
Вопрос решен, тему можно закрыть.

Эта тема на forum.dklab.ru