iopiop Этот человек и до того как я добавил SLEEP() умудрялся снимать двойную сумму
Я отправил Вам файл в личку!
При регистрации я проверяю - preg_match("/^[a-zA-Z0-9]{4,}$/",$login)
Я отредактировал все файлы в которых писал запрос с LIKE но уверен дело не в этом
Я не могу использовать (INT) так как пользователь может снять сумму дробную сумму с точкой
и поэтому использую $summa = floatval($summa);
Что значит переменная $abs ???
В моем примере нет текста в запросе 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)) и это условие не срабатывает так как баланс еще тот же и сразу после проверки в условии с баланса снимается сумма.
Второй запрос уже не должен пройти так как условии должно сработать ведь в функции проверяется баланс а не где то выше условия из БД.
Пишу все в фал типа login.txt и в нем нет ничего лишнего , а только то что должно придти.
у меня все это работает на сервере и доступ дать не могу, так как работаю с деньгами.
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,
<? function balance($l){ $r = mysql_fetch_row(mysql_query("SELECT `balance` FROM `USERS_table` WHERE `login` LIKE '".$l."'")); return $r[0]; } ?>