Появилась такая проблема, есть функция перевода на сайте, но я могу перевести баланс любому человеку кроме себя введя абслоютно любую сумму, у меня она уйдет в минус, а человеку, которому отправляю, приходит. Как сделать так, что бы баланс проверялся, и если он меньше суммы заявленной или меньше нуля, значит вылезала ошибка, что такое сделать нельзя, либо если баланс больше или равен сумме которую надо перевести, то тогда успешно бы переводилось. Вот код:
if($row['login'] != $nick)
{
$fa = 'error';
$error = 'Пользователь не найден';
}else {
if($rowa['login'] == $nick){
$fa = 'error';
$error = 'Вы не можете перевести самому себе';
}else {
if(!preg_match("/^[0-9]+$/", $summa)){
$fa = 'error';
$error = 'Сумма заполнено неверно';
}else {
if($summa < 10)
{
$fa = 'error';
$error = 'Минимальная сумма перевода 10 '.$walletsite.'';
}else {
$update_sql = "Update ".$prefix."_users set balance=balance + '$summa' WHERE login='$nick'";
mysql_query($update_sql) or die("" . mysql_error());
$update_sql = "Update ".$prefix."_users set balance=balance - '$summa' WHERE hash='$sid'";
mysql_query($update_sql) or die("" . mysql_error());
$fa = 'success';
$error = 'Вы перевели '.$summa.' '.$walletsite.' пользователю '.$nick.'';
$sql_selects = "SELECT * FROM ".$prefix."_users WHERE hash='$sid'";
$results = mysql_query($sql_selects);
$rows = mysql_fetch_array($results);
$new_balance = $rows['balance'];
}
}
}
}
Не вдаваясь в подробности остальных проверок, блок перевода денег может выглядеть как-то так (код не проверялся, работоспособность "как есть" не гарантируется):
function do_update($update_sql) {
mysql_query($update_sql) or throw new Exception(mysql_error());
return mysql_affected_rows(); // Возвращаем количество реально измененных строк
}
...
$Ok=0;
try {
mysql_query("START TRANSACTION"); // Начинаем транзакцию, которая будет выполнена вся целиком или ничего из нее
$ret=do_update("Update " . $prefix . "_users set balance=balance - $summa WHERE hash='$sid' AND balance - $summa >= 0");
// Если денег не хватит, то запрос ничего не изменит и вернет 0 измененных строк
if($ret != 1) throw new Exception("Недостаточно средств");
$ret=do_update("Update " . $prefix . "_users set balance=balance + $summa WHERE login='$nick'");
if($ret != 1) throw new Exception("Получатель средств не найден");
$Ok=1;
} catch (Exception $e) {
echo 'Произошла ошибка при переводе: ', $e->getMessage();
} finally {
mysql_query($Ok ? "COMMIT" : "ROLLBACK"); // Завершаем или откатываем транзакцию в зависимости от успешного завершения запроса
}
В дополнение замечу, что подстановка текста переменных непосредственно в текст запроса связана с массой потенциальных ошибок и возможностей SQL-инъекций. Кроме того, расширение mysql_ давно устарело и уже начинает исчезать с хостингов с новыми версиями php. Настоятельно рекомендую переходить на использование PDO и подготавливаемых выражений с привязкой параметров.
if ($row['login'] != $nick) {
$fa = 'error';
$error = 'Пользователь не найден';
} else {
if ($rowa['login'] == $nick) {
$fa = 'error';
$error = 'Вы не можете перевести самому себе';
} else {
if (!preg_match("/^[0-9]+$/", $summa)) {
$fa = 'error';
$error = 'Сумма заполнено неверно';
} else {
if ($summa < 10) {
$fa = 'error';
$error = 'Минимальная сумма перевода 10 ' . $walletsite . '';
} else {
$s1 = "SELECT * FROM " . $prefix . "_users WHERE hash='$sid'";
$r1 = mysql_query($s1);
$rows = mysql_fetch_array($r1);
$my_balance = $rows['balance'];
if ($my_balance < $summa) {
$fa = 'error';
$error = 'У вас нету столько';
} else {
$update_sql = "Update " . $prefix . "_users set balance=balance + '$summa' WHERE login='$nick'";
mysql_query($update_sql) or die("" . mysql_error());
$update_sql = "Update " . $prefix . "_users set balance=balance - '$summa' WHERE hash='$sid'";
mysql_query($update_sql) or die("" . mysql_error());
$fa = 'success';
$error = 'Вы перевели ' . $summa . ' ' . $walletsite . ' пользователю ' . $nick . '';
$sql_selects = "SELECT * FROM " . $prefix . "_users WHERE hash='$sid'";
$results = mysql_query($sql_selects);
$rows = mysql_fetch_array($results);
$new_balance = $rows['balance'];
}
}
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Простейшая реализация чата со списком юзеров онлайнОдин SSE (стрим) выдаёт появившиеся новые строки в txt-файле, а другой скрипт с SSE отвечает...
Нужно провести манипуляции с архивами, то есть добавить в них файлыС zip понятно - стандартная встроенная библиотека в php уже протестированна