@ibrakhim20070618

Как вычесть у одного пользователя число и добавить его другому?

Создаю простой кошелек (школьный проект), накидал форму перевода денег, от пользователя требуется номер его карты, сумма перевода и карта, на которую он отправит данную сумму. Форму накидал как следует: файл действия action.php. Подключение настроено, но сам MYSQL-код не работает. Из таблицы users в столбце amount надо вычесть сумму, которую введет пользователь ($summa- переменная из формы), и ту сумму прибавить другому пользователю. Вот код:
<?php
 $client= $_POST['client'];
 $summa= $_POST['summa'];
 $shop= $_POST['shop'];
 
 $conn = mysqli_connect("localhost", "root", "89053511328It");

  $mysqli->query("SELECT * FROM `users`");
 $mysqli->query("UPDATE users SET amount = '',  amount = amount - '$summa' WHERE id = '$client'");
  $mysqli->query("UPDATE users SET amount = '',  amount = amount + '$summa' WHERE id = '$shop'");
 

?>


Вот весь код HTML-страницы (может там ошибка?)
<!DOCTYPE html>
<html lang="ru">
<head>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="js.js"></script>
    <meta charset="UTF-8">
    <title>Оплата MakBank</title>
    <meta name="theme-color" content="#eb2d6e">
</head>
<body>
<form method="POST" name="money" action="action.php">
<div class="background">
  <div class="container">
    <div class="screen">
      <div class="screen-header">
        <div class="screen-header-left">
          <div class="screen-header-button close"></div>
          <div class="screen-header-button maximize"></div>
          <div class="screen-header-button minimize"></div>
        </div>
        <div class="screen-header-right">
          <div class="screen-header-ellipsis"></div>
          <div class="screen-header-ellipsis"></div>
          <div class="screen-header-ellipsis"></div>
        </div>
      </div>
      <div class="screen-body">
        <div class="screen-body-item left">
          <div class="app-title">
            <span>ОПЛАТА</span>
            <span>MakBank</span>
          </div>
          <div class="app-contact">Возникли проблемы? : +7 963 140 35 65</div>
        </div>
        <div class="screen-body-item">
          <div class="app-form">
            <div class="app-form-group">
              <input class="app-form-control" placeholder="НОМЕР КАРТЫ ПОКУПАТЕЛЯ" value="" name="client">
            </div>
            <div class="app-form-group">
              <input class="app-form-control" placeholder="СУММА К ОПЛАТЕ" name="summa">
            </div>
            <div class="app-form-group">
              <input class="app-form-control" placeholder="НОМЕР КАРТЫ ПРОДАВЦА" name="shop">
            </div>
            <div class="app-form-group buttons">
              <button type="submit" class="app-form-button">ОПЛАТИТЬ</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
</form>
</body>
</html>
  • Вопрос задан
  • 105 просмотров
Решения вопроса 3
Последний раз подобное делал вложенным запросом. То есть текущая сумма вытаскивалась селектом грубо говоря так
<?php
 $mysqli->query("UPDATE users SET amount = (SELECT amount FROM users WHERE id = '$client') - '$summa'";
 $mysqli->query("UPDATE users SET amount = '',  amount = (SELECT amount FROM users WHERE id = '$shop') + '$summa'";
?>


Возможно это не совсем правильно но у меня на тот момент по другому не завелось, да и искал я не долго
Ответ написан
@Max_ver
$mysqli->query("UPDATE users SET amount = amount - '+$summa+' WHERE id = '$client'");
 $mysqli->query("UPDATE users SET amount = amount + '+$summa+' WHERE id = '$shop'");

Если норм подключается должно сработать
Ответ написан
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
$check_alaliable_amount = 'select * from users where id = ?';

$stmt = $mysqli->prepare($check_alaliable_amount); 
$stmt->bind_param("i", $client);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();

print_r($user);

if ($user['amount'] >= $summa) {
	/* Start transaction */
	$mysqli->begin_transaction();
	try {
    	$stmt = $mysqli->prepare("update users set amount=(amount-?) where id=?;");
		$stmt->bind_param('ii', $summa, $client);
		$stmt->execute();

		$stmt = $mysqli->prepare("update users set amount=(amount+?) where id=?;");
		$stmt->bind_param('ii', $summa, $shop);
		$stmt->execute();
		
		$mysqli->commit();
	} catch (mysqli_sql_exception $exception) {
		$mysqli->rollback();

		throw $exception;
	}
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Лучше делать всё в одном запросе:
UPDATE users u1
CROSS JOIN users u2
SET u1.amount = u1.amount - $summa,
    u2.amount = u2.amount + $summa
WHERE u1.id = $client
  AND u2.id = $shop;


Во-первых, один запрос - проще. Пусть даже сам запрос и сложнее.

Во-вторых, если, например, в структуре таблицы имеется ограничение CHECK (amount >= 0), а сумма такова, что у клиента баланс уйдёт в минус - в таком случае ни одна из записей не будет изменена.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы