@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>
  • Вопрос задан
  • 144 просмотра
Решения вопроса 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'";
?>


Возможно это не совсем правильно но у меня на тот момент по другому не завелось, да и искал я не долго
Ответ написан
$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), а сумма такова, что у клиента баланс уйдёт в минус - в таком случае ни одна из записей не будет изменена.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
26 апр. 2024, в 10:43
1500 руб./за проект
26 апр. 2024, в 10:21
1200 руб./в час