Перевод баланса на сайте

181
03 апреля 2019, 22:30

Появилась такая проблема, есть функция перевода на сайте, но я могу перевести баланс любому человеку кроме себя введя абслоютно любую сумму, у меня она уйдет в минус, а человеку, которому отправляю, приходит. Как сделать так, что бы баланс проверялся, и если он меньше суммы заявленной или меньше нуля, значит вылезала ошибка, что такое сделать нельзя, либо если баланс больше или равен сумме которую надо перевести, то тогда успешно бы переводилось. Вот код:

    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'];
            }
        }
    }
}
Answer 1

Не вдаваясь в подробности остальных проверок, блок перевода денег может выглядеть как-то так (код не проверялся, работоспособность "как есть" не гарантируется):

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 и подготавливаемых выражений с привязкой параметров.

Answer 2
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'];
                    }
                }
            }
        }
    }
READ ALSO
Реализация функции &#171;кто онлайн в чате&#187; приводит к зависанию сервера

Реализация функции «кто онлайн в чате» приводит к зависанию сервера

Простейшая реализация чата со списком юзеров онлайнОдин SSE (стрим) выдаёт появившиеся новые строки в txt-файле, а другой скрипт с SSE отвечает...

130
PHP RAR ARCHIVE добавление файла

PHP RAR ARCHIVE добавление файла

Нужно провести манипуляции с архивами, то есть добавить в них файлыС zip понятно - стандартная встроенная библиотека в php уже протестированна

149
Почему не работает Blockchain?

Почему не работает Blockchain?

Доброго времени суток!

176