iopiop: я вам уже предложил подумать, что будет если у вас есть пользователи vasya1, vasya2, vasya3 и vas%. Что вернет проверка баланса с вашим любимым like для пользователя vas% ? для какого реально пользователя будет возвращен баланс? я вот не знаю. и скажу вам по секрету, никто не знает.
В моем примере нет текста в запросе WHERE `login` LIKE '".$login."%'" я не использую знак %
ТИП колонки с балансом=varchar
Кодировка=utf8_general_ci
iopiop:
другой вариант - что происходит если сумма передается в этот код отрицательная? я не знаю, т.к. код не полный.
третий вариант событий. предположим пришел запрос, начинает выполняться, прошел проверку if($summa > balance($login)) и в этот момент приходит второй запрос. первый запрос перестает выполняться, выполняется второй запрос, выполнился полностью и процессор вернулся к выполнению первого запроса. заметьте, проверка баланса в первом запросе уже прошла, и прошла удачно, о том что деньги сняты вторым запросом, первый запрос ничего не знает. кстати именно во время sleep и происходит переключение контекста.
Первый запрос проходит проверку if($summa > balance($login)) и это условие не срабатывает так как баланс еще тот же и сразу после проверки в условии с баланса снимается сумма.
Второй запрос уже не должен пройти так как условии должно сработать ведь в функции проверяется баланс а не где то выше условия из БД.
Пишу все в фал типа login.txt и в нем нет ничего лишнего , а только то что должно придти.
LEOnidUKG: goodier, у вас всё это на локалке или где-то на фтп уже лежит? Если так, скиньте в личку доступ, я посмотрю на эти чудеса, как там отправляется два раза данные.
у меня все это работает на сервере и доступ дать не могу, так как работаю с деньгами.
Может этот пользователь написать программу которая будет на разных машинах запускаться в одно и то же время и в программе будут передаваться ПОСТ параметры в мой файл обработчик, но тут опять же голову ломаю как тогда мой обработчик понимает его логин и другие данные которые хранятся в сессии на моем сервере.
Я все $_post обрабатываю через mysql_escape_string($_post[blablabla])
и на сервере отключен регистр глобал.
Согласен, что можно было преобразовать все текстовые данные в нижний регистр и писать where login='blablabla' но реч идет не об этом, атом, что в фал обработчик приходит сразу два обращения в одно и тоже время которые каким то образом умудряются выполнится.
И если взять совет от dkameleon, то получится опять тоже самое!
Этот умный пользователь сделает такие же 2 запроса и баланс станет минусовым и в таблицу с заявками на выплату добавится 2 запроса и когда через CRON
обратиться в файлу проверяющий таблицу в БД с заявками на выплаты, то обработает так же все и у меня с кошелька снимется двойная сумма.
У кого какие мысли, помогите найти решение этой серьезной проблемы.
iopiop Этот человек и до того как я добавил SLEEP() умудрялся снимать двойную сумму
Я отправил Вам файл в личку!
что если юзер зарегается с ником "vas%"?
При регистрации я проверяю - preg_match("/^[a-zA-Z0-9]{4,}$/",$login)
Я отредактировал все файлы в которых писал запрос с LIKE но уверен дело не в этом
$summa=$abs((int)$summa);
Я не могу использовать (INT) так как пользователь может снять сумму дробную сумму с точкой
и поэтому использую $summa = floatval($summa);
Что значит переменная $abs ???
я вам уже предложил подумать, что будет если у вас есть пользователи vasya1, vasya2, vasya3 и vas%. Что вернет проверка баланса с вашим любимым like для пользователя vas% ? для какого реально пользователя будет возвращен баланс? я вот не знаю. и скажу вам по секрету, никто не знает.
В моем примере нет текста в запросе WHERE `login` LIKE '".$login."%'" я не использую знак %
ТИП колонки с балансом=varchar
Кодировка=utf8_general_ci
другой вариант - что происходит если сумма передается в этот код отрицательная? я не знаю, т.к. код не полный.
убираю все заменой
$summa = str_replace("-","", $summa);
$summa = str_replace("+","", $summa);
$summa = str_replace("`","", $summa);
$summa = str_replace("'","", $summa);
$summa = str_replace('"','', $summa);
третий вариант событий. предположим пришел запрос, начинает выполняться, прошел проверку if($summa > balance($login)) и в этот момент приходит второй запрос. первый запрос перестает выполняться, выполняется второй запрос, выполнился полностью и процессор вернулся к выполнению первого запроса. заметьте, проверка баланса в первом запросе уже прошла, и прошла удачно, о том что деньги сняты вторым запросом, первый запрос ничего не знает.
кстати именно во время sleep и происходит переключение контекста.
Первый запрос проходит проверку if($summa > balance($login)) и это условие не срабатывает так как баланс еще тот же и сразу после проверки в условии с баланса снимается сумма.
Второй запрос уже не должен пройти так как условии должно сработать ведь в функции проверяется баланс а не где то выше условия из БД.
Пишу все в фал типа login.txt и в нем нет ничего лишнего , а только то что должно придти.
goodier, у вас всё это на локалке или где-то на фтп уже лежит? Если так, скиньте в личку доступ, я посмотрю на эти чудеса, как там отправляется два раза данные.
у меня все это работает на сервере и доступ дать не могу, так как работаю с деньгами.
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);
}
У меня такая мысля в голове есть!
Может этот пользователь написать программу которая будет на разных машинах запускаться в одно и то же время и в программе будут передаваться ПОСТ параметры в мой файл обработчик, но тут опять же голову ломаю как тогда мой обработчик понимает его логин и другие данные которые хранятся в сессии на моем сервере.
Я все $_post обрабатываю через mysql_escape_string($_post[blablabla])
и на сервере отключен регистр глобал.
Согласен, что можно было преобразовать все текстовые данные в нижний регистр и писать where login='blablabla' но реч идет не об этом, атом, что в фал обработчик приходит сразу два обращения в одно и тоже время которые каким то образом умудряются выполнится.
И если взять совет от dkameleon, то получится опять тоже самое!
Этот умный пользователь сделает такие же 2 запроса и баланс станет минусовым и в таблицу с заявками на выплату добавится 2 запроса и когда через CRON
обратиться в файлу проверяющий таблицу в БД с заявками на выплаты, то обработает так же все и у меня с кошелька снимется двойная сумма.
У кого какие мысли, помогите найти решение этой серьезной проблемы.
iopiop,
Использую конструкцию WHERE login LIKE $login потому, что пользователь один и тодже вводит свой логин маленькими и иногда большими буквами.
palladin_jedi,
Покажите дырки в моем примере пожалуйста.
Какое решение есть для запрета выполнения запросов в БД?
---------- Добавлено в 03:02 ---------- Предыдущее сообщение было в 03:01 ----------
Просто походу MySQL сервер тут не причем раз создаются два запроса в микросекундах
Ragnarok,
Да хрен с ними с данными в MySQL главное чтоб с моего WMR-кошелька не отнималось двойная сумма ))))
---------- Добавлено в 02:36 ---------- Предыдущее сообщение было в 02:35 ----------
palladin_jedi,