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

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

Я все $_post обрабатываю через mysql_escape_string($_post[blablabla])

и на сервере отключен регистр глобал.

Согласен, что можно было преобразовать все текстовые данные в нижний регистр и писать where login='blablabla' но реч идет не об этом, атом, что в фал обработчик приходит сразу два обращения в одно и тоже время которые каким то образом умудряются выполнится.

И если взять совет от dkameleon, то получится опять тоже самое!

Этот умный пользователь сделает такие же 2 запроса и баланс станет минусовым и в таблицу с заявками на выплату добавится 2 запроса и когда через CRON

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

У кого какие мысли, помогите найти решение этой серьезной проблемы.

Ragnarok
На сайте с 25.06.2010
Offline
239
#22
goodier:

И если взять совет от dkameleon, то получится опять тоже самое!
Этот умный пользователь сделает такие же 2 запроса и баланс станет минусовым и в таблицу с заявками на выплату добавится 2 запроса и когда через CRON
обратиться в файлу проверяющий таблицу в БД с заявками на выплаты, то обработает так же все и у меня с кошелька снимется двойная сумма.

2 одновременных запроса и два последовательных запроса -- это разные вещи

//TODO: перестать откладывать на потом
LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#23
if($balance == 0){ exit("Недостаточно средств!"); }

Не верно, надо

if($balance <= 0){ exit("Недостаточно средств!"); }

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

Блокировку AJAX сделайте на JS т.е. отправился запрос, какая то переменная приняла значение 1.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
goodier
На сайте с 10.03.2009
Offline
36
#24

У меня такая мысля в голове есть!

Может этот пользователь написать программу которая будет на разных машинах запускаться в одно и то же время и в программе будут передаваться ПОСТ параметры в мой файл обработчик, но тут опять же голову ломаю как тогда мой обработчик понимает его логин и другие данные которые хранятся в сессии на моем сервере.

RM
На сайте с 21.06.2011
Offline
77
#25
goodier:
У меня такая мысля в голове есть!

Может этот пользователь написать программу которая будет на разных машинах запускаться в одно и то же время и в программе будут передаваться ПОСТ параметры в мой файл обработчик, но тут опять же голову ломаю как тогда мой обработчик понимает его логин и другие данные которые хранятся в сессии на моем сервере.

У вас явно маловато знаний для работы с деньгами на php. К вашему сведению, сейчас залогиниться на любом сайте через программу - не проблема, а там уж сессии сами устанавливаются и два запроса отправляются, но это сложно... Возможно что запросы отправляются с одного компьютера, это не сложно...

Ваш код очень уязвим, и если тот человек, который накручивает себе денежки его увидит, то это обвал! Лучше заплатите профессионалам, они вам сделают эту часть кода безопаснее. Кстати, можете ко мне обратится... :)

dkameleon
На сайте с 09.12.2005
Offline
386
#26
goodier:
И если взять совет от dkameleon, то получится опять тоже самое!

нет.

логика:

1. лок таблиц.

2. селект баланса.

3. если баланс больше запрошенной суммы, то:

3.1. создание заявки.

3.2. минусование баланса.

4. Анлок таблиц.

Дизайн интерьера (http://balabukha.com/)
goodier
На сайте с 10.03.2009
Offline
36
#27

RoMaN444Ik,

Мой код который я привел в примере обрезан.

В нем нет функций sleep(2) и mysql_escape_string($_post[blablabla])

Я в этой теме прошу помочь мне с решением проблемы без оплаты за помощь.

и думаю эта тема в будущем пригодится людям.

---------- Добавлено в 17:58 ---------- Предыдущее сообщение было в 17:46 ----------

ну как так получается если баланс в первом его запросе на выплату уже равен 0

а во втором запросе проверилось в условии и закончило все функцией EXIT();

$login = // логин из сессии

$balance = // Селект баланса из таблицы юзеров

$summa = $mysql_escape_string($_post['summa']);

if($balance <= 0){ exit("Недостаточно средств!"); } // не исполнять ниже код

if($summa > balance($login)){ exit("Недостаточно средств!"); } // не исполнять ниже код

mysql_query("UPDATE `USERS_table` SET balance=balance-".$summa." WHERE `login` LIKE '".$login."'");

/* подготавливаю POST данные для передачи через CURL */

$_POST['username'] = $login;

$_POST['viplata'] = $summa; и тд..

$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);

}

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#28

goodier, у вас всё это на локалке или где-то на фтп уже лежит? Если так, скиньте в личку доступ, я посмотрю на эти чудеса, как там отправляется два раза данные.

dkameleon
На сайте с 09.12.2005
Offline
386
#29
dkameleon:
нет.
логика:
1. лок таблиц.
2. селект баланса.
3. если баланс больше запрошенной суммы, то:
3.1. создание заявки.
3.2. минусование баланса.
4. Анлок таблиц.

кстати, по идее это можно красивее даже решить с триггером, если они атомарные. на счет этого не знаю.

goodier
На сайте с 10.03.2009
Offline
36
#30
LEOnidUKG:
goodier, у вас всё это на локалке или где-то на фтп уже лежит? Если так, скиньте в личку доступ, я посмотрю на эти чудеса, как там отправляется два раза данные.

у меня все это работает на сервере и доступ дать не могу, так как работаю с деньгами.

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