Появилась такая проблема, есть функция перевода на сайте, но я могу перевести баланс любому человеку кроме себя введя абслоютно любую сумму, у меня она уйдет в минус, а человеку, которому отправляю, приходит. Как сделать так, что бы баланс проверялся, и если он меньше суммы заявленной или меньше нуля, значит вылезала ошибка, что такое сделать нельзя, либо если баланс больше или равен сумме которую надо перевести, то тогда успешно бы переводилось. Вот код:
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'];
}
}
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Простейшая реализация чата со списком юзеров онлайнОдин SSE (стрим) выдаёт появившиеся новые строки в txt-файле, а другой скрипт с SSE отвечает...
Нужно провести манипуляции с архивами, то есть добавить в них файлыС zip понятно - стандартная встроенная библиотека в php уже протестированна