【问题标题】:How to substract value from sum of values in Database如何从数据库中的值总和中减去值
【发布时间】:2019-03-27 16:43:15
【问题描述】:

我应该从数据库中的值总和中减去给定值!

例如: 用户“John”在他的帐户中填写了 2 次 100 美元和 50 美元,他帐户中的总计 150 美元 当他以 50 美元买东西时,我们应该从他帐户中的总金额中减去! 并且应该更新总金额。

这里显示他帐户中的总金额的代码:

 <?php
    session_start();
    $sql = "SELECT sum(payment_amount) as 'payment' from payments 
    WHERE username= '" . $_SESSION['username'] . "' ";
    $result = $db->query($sql);
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo "" . $row['payment'] . "";
    ?>

表格:付款

  ID      username    payment_amount    Status  
+-------+-------------+-------------+-----------+
|   1   |  John       |     100     | Complete  |
+-------+-------------+-------------+-----------+
|   2   |  John       |     50      | Complete  |
+-------+-------------+-------------+-----------+
|   3   |  Alex       |     100     | Complete  |
+-------+-------------+-------------+-----------+

【问题讨论】:

  • 我会为收入和支出制作 2 个不同的表格,然后选择收入总和减去支出总和
  • 明明是 PHP 问题,为什么这个标记为 html?
  • @LongChalk 因为,这是网站背后的逻辑!
  • 警告:尽可能使用prepared statements来避免在查询中注入任意数据并创建SQL injection bugs。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。
  • @tadman 你能用“Prepared statements”修改上面的代码吗?

标签: php html mysql


【解决方案1】:

您在使用余额时不应该这样做。

最好的方法是像这样创建一个新表。

ID |用户名 |余额

然后每次付款,您只需在用户余额中使用 +$amount 更新 DB,而且,如果他花钱,您只需在 UPDATE 中执行 -$amount。

例子:

tbl_user

ID |姓名 |电子邮件

1..alex...blabla@test.com


tbl_balance

ID |用户名 |余额

1....1.....100

【讨论】:

  • 好主意!你能用查询和代码解释一下吗?有你推荐的桌子吗?
  • 您应该将其实现为double entry ledger,并成对记录贷方和借方。
  • @tadman,您可以只使用另一个表来记录每个事务。但是,是的,获得所有花费/进入的好主意。
  • 如果没有该分类帐,您将不知道这些余额是否正确。这就是这里的重要原则。不能信任表中的数字。一系列总计为一个数字的交易可以被审计和信任。
  • 抱歉,但准备好的语句可以使其安全。这与安全无关。
【解决方案2】:

是的,我可以向您展示我将如何做到这一点,但它不是 100% 满的,而是向您展示它是如何工作的。

/////PAYMENT PAGE/////

<?php 
/////Get the ID of user using his session username and after all you query your     user table WHERE username = $_SESSION["username"] and then you take the ID 
////And you save the id of user in a variable 
$getId = $row["id"];

/////Get the total balance of user right now using his id and save in variable
$getAmountNow = $row["balance"];
?>

<form action="myscript.php" method="get"> 
How much you want to pay <input type="text" name="amountPaid"><br>
<input type="hidden" name="<?php echo $getId; ?>"><br>
<input type="hidden" name="<?php echo $getAmountNow; ?>"><br>
<input type="submit" value="Submit">
</form> 
/////PAYMENT PAGE/////



/////myscript.php/////

$idUser = htmlspecialchars($_POST["id"]);
$amountNowUser = htmlspecialchars($_POST["balance"]);
$amountPaid = htmlspecialchars($_POST["amountPaid"]);

////If this is a spent
$newAmount = $amountNowUser - $amountPaid;

////If this is a buy
$newAmount = $amountNowUser + $amountPaid;

// prepare and bind$stmt = $conn->prepare("UPDATE tbl_balance SET balance=? WHERE     idUser=?");
$stmt->bind_param("ss", $newAmount, $idUser);
$stmt->execute();


/////myscript.php/////

【讨论】:

  • A) 为什么要添加两个答案? B) htmlspecialchars 在这里做什么?这对于bind_param 的使用来说既不必要也不合适。这些数字不都是吗?与i绑定。
  • @tadman 感谢您的建议!我的问题呢?你明白我想要什么了吗?你能解释一下怎么做吗?还是这样做的逻辑?有什么想法吗?
  • 如果不先了解基本原理,就没有简单的方法来解释这一点。复式簿记账本的简单实现值得研究。
  • @tadman,对于第一个问题,回复这个问题真的是浪费时间,这是因为我无法发布答案,我是新用户,没有积分可以发布作为答案,这对 htmlspecialchars 真的很严重吗?这是为了防止 XSS 攻击,而 SQL 准备语句可以防止 SQL 注入。根本不是一回事。 编辑:是的,使用 i 绑定参数,但它应该是自动的。
  • 您使用htmlspecialchars 如果且仅当显示在 HTML 上下文中。将值保存到数据库时不合适也没有必要使用。这些值可能出现在 JSON、JavaScript、纯文本电子邮件、URI 以及许多不是 HTML 并且需要不同转义的东西中。如果您预先转义,则必须稍后正确地取消转义并重新转义,这会使您的应用程序真正混乱。保持数据库中的原始数据,必要时如果必要时转义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多