Как в PHP запретить выполнение двух одновременных запросов

goodier
На сайте с 10.03.2009
Offline
36
6240

Здравствуйте!

Как в PHP запретить выполнение двух одновременных запросов?

У меня пользователь умудряется сделать сразу два запроса в файл обработчик.

И
На сайте с 15.01.2012
Offline
19
#1

Если сервер на никсах, то - http://php.net/manual/en/function.flock.php

B
На сайте с 03.02.2005
Offline
165
#2

Блокировка файла.

Если совсем в общем случае - перед началом выполнения скрипта проверяйте, не заблокирован ли файл, если заблокирован - то ждите, пока его отпустит.

После проверки на блокировку - блокируйте файл и делайте, что надо. Как сделали - разблокируйте файл.

Интеграция сайтов с 1С (товары, контрагенты, документы, заказы). Консультации и услуги. Есть готовые решения - быстро и недорого. Приглашаю к сотрудничеству агентства и веб-студии.
Ragnarok
На сайте с 25.06.2010
Offline
226
#3

видел решение, там кнопку после клика javascript'ом делают disabled

//TODO: перестать откладывать на потом
goodier
На сайте с 10.03.2009
Offline
36
#4

Приходит один и тот же пользователь, пополняет счет и сразу делает заказ

на выплату в форме из которой все значения отправляются через AJAX.

Пользователь знает, что передается и в какой файл,

далее он делает 2 запроса каким то образом, которые в микросекундах одинаковы

и происходит следующее:

1 - Ему в два раза больше чем он внес выплачивается на WebMoney кошелек

2 - Его баланс в Базе данных становится минусовым.

Понять не могу как у него это получается если я в самом начале кода проверяю в условии его баланс, а потом отнимаю заявленную сумму с его баланса в БД.

Ведь когда поступит новый запрос, должно в условии сработать, что заявленная сумма меньше его баланса и функцией EXIT() закончить исполнение PHP кода.

$summa = $_POST['Указанная сумма в форме'];

$balance = $mysql['БАЛАНС USERA из DB'];
$wmcode = $mysql['ID-платежа из DB'];
if($balance == 0){ exit("Недостаточно средств!"); }
/* проверяю в функции баланс пользователя */
if($summa > balance($login)){ exit("Недостаточно средств!"); }
$row_order_id = mysql_fetch_assoc(mysql_query("SHOW TABLE STATUS FROM `DB_name` LIKE 'MY_table'"));
$order_id = $row_order_id['Auto_increment'];
mysql_query("INSERT INTO `PAY_table` (`id`,`login`,`state`) VALUES('$order_id','$login','0')");
mysql_query("UPDATE `USERS_table` SET balance=balance-".$summa." WHERE `login` LIKE '".$login."'");
/* подготавливаю POST ($order_id,summa,login,wmr-кошелек) данные для передачи через CURL */
$state = pay($_POST); /* и отдаю на другой сервер где подключены XML интерфейсы WEBMONEY */
if($state==0){
mysql_query("UPDATE `PAY_table` SET `state`='1' WHERE `id`=".$order_id);
exit("Счет обработан, Деньги выплачены!");
} else {
mysql_query("UPDATE `USERS_table` SET balance=balance+".$summa." WHERE `login` LIKE '".$login."'");
mysql_query("UPDATE `PAY_table` SET `state`='2' WHERE `id`=".$order_id);
}
Ragnarok
На сайте с 25.06.2010
Offline
226
#5
goodier:
Приходит один и тот же пользователь, пополняет счет и сразу делает заказ
на выплату в форме из которой все значения отправляются через AJAX.
Пользователь знает, что передается и в какой файл,
далее он делает 2 запроса каким то образом, которые в микросекундах одинаковы
и происходит следующее:
1 - Ему в два раза больше чем он внес выплачивается на WebMoney кошелек
2 - Его баланс в Базе данных становится минусовым.

mysql позволяет блокировать данные, как раз чтобы избежать такого

dkameleon
На сайте с 09.12.2005
Offline
386
#6
goodier:

на выплату в форме из которой все значения отправляются через AJAX.

такую фигню повещайте на крон.

от юзера при клике будет создаваться заявка на выплату и минусоваться баланс (не забудьте создать атомарность или локами или логикой таблиц).

Дизайн интерьера (http://balabukha.com/)
palladin_jedi
На сайте с 13.07.2010
Offline
71
#7
goodier:
*WHERE*`login`*LIKE*'".$login."'

Зачем именно так?

Сайт о web-разработке и прочем (http://seazo.net)||Продвижение статьями под Google (http://short.seazo.net/ght4zf) Бесплатные консультации рефералам Sape (http://www.sape.ru/r.SWfwWOblBo.php) PHP и JS скрипты на заказ, создание сайтов с нуля и на CMS.
goodier
На сайте с 10.03.2009
Offline
36
#8

dkameleon, Здравствуйте!

Я как раз Ваши XML интерфейсы использую!

Скажите в чем смысл делать через CRON если пользователь ввел сумму на сайте и нажал кнопку выплата и в течении 2-5 секунд ему упала денюжка.

palladin_jedi
На сайте с 13.07.2010
Offline
71
#9
goodier:
balance($login)

Функция? Покажите...

goodier
На сайте с 10.03.2009
Offline
36
#10

Ragnarok,

Да хрен с ними с данными в MySQL главное чтоб с моего WMR-кошелька не отнималось двойная сумма ))))

---------- Добавлено в 02:36 ---------- Предыдущее сообщение было в 02:35 ----------

palladin_jedi,

<?

function balance($l){
$r = mysql_fetch_row(mysql_query("SELECT `balance` FROM `USERS_table` WHERE `login` LIKE '".$l."'"));
return $r[0];
}
?>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий