Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按降序选择MySQL行时平衡帐户-代码更新_Php_Mysql - Fatal编程技术网

Php 按降序选择MySQL行时平衡帐户-代码更新

Php 按降序选择MySQL行时平衡帐户-代码更新,php,mysql,Php,Mysql,在金融跟踪器上工作时,遇到了一个小问题,即按降序(从最新到最旧)显示交易,并显示正确的运行余额。 以下是我正在使用的SQL: 按id DESC、date DESC从交易订单中选择金额、收款人、类别、日期 我正在使用一个类来处理这个应用程序的其他方面,显示交易的功能是其中的一部分。如果按升序显示事务,则以下代码将按预期工作: //Fetch the transactions public function fetchTransactions() { global $db; $thi

在金融跟踪器上工作时,遇到了一个小问题,即按降序(从最新到最旧)显示交易,并显示正确的运行余额。 以下是我正在使用的SQL:

按id DESC、date DESC从交易订单中选择金额、收款人、类别、日期

我正在使用一个类来处理这个应用程序的其他方面,显示交易的功能是其中的一部分。如果按升序显示事务,则以下代码将按预期工作:

//Fetch the transactions
public function fetchTransactions() {
    global $db;
    $this->getStartingBalance();
    $runningTotal = $this->startingBalance;
    $fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id, date");
    while ($transactionDetails = $fetchTransactionsSQL->fetch()) {
        $payee = stripslashes($transactionDetails[payee]);
        $category = $transactionDetails['cat'];
        $amount = money_format("%n", $transactionDetails[amount]);
        $runningTotal = $runningTotal + $transactionDetails['amount'];
        $runningTotalOutput = money_format("%n", $runningTotal);
        echo "
            <tr>
                    <td class=\"payee\">$payee</td>
                    <td>$category</td>
                    <td>$amount</td>
                    <td class=\"runningTotal\">$runningTotalOutput</td>
                </tr>";
    }
}

我将从起始余额与查询中的第一笔交易匹配的点开始按升序读取值

将所有内容添加到包含收款人、金额、类别等的数组中,并在其中计算余额。然后将该数组添加到另一个数组
$transactions[]=$transaction

然后,当您准备好输出时,从$transactions中向后读取并输出它们

for ($i = sizeof($transactions) - 1; $i >= 0; ++$i) {
    $txn = $transactions[$i];
    // output data
}

将数据库访问与其他逻辑分离,并将数据库和控制器逻辑与html输出分离是一个好主意,原因有很多。请参阅维基百科。

为什么不从当前的平衡点开始,向后工作?因此,第一笔交易的运行余额将是开始余额,然后从开始余额中减去当前交易金额,即下一笔交易的运行余额

  • 从交易记录中运行总和(金额)
  • 记住结果并将其添加到您的$startingBalance中,并将其记为$endingBalance
  • 运行查询以按所需顺序选择所有事务
  • 对于每笔交易,从$endingBalance中减去$amount,而不是将$amount添加到$running balance中

  • 示例:
    按描述顺序选择的5笔交易(仅金额):
    1. -7
    2.10
    3.22
    4. -17
    5. -2
    交易总额:$tSum=-7+10+22-17-2=6
    $startingBalance=300
    $endingBalance=$startingBalance+tSum=300+6=306

    按描述顺序显示的交易记录:
    (金额|运行平衡)
    期末余额:306
    -7 | 306($endingBalance)
    10 | 313($endingBalanse-=-7)
    22 | 303($endingBalance-=10)
    -17 | 281($endingBalance-=22)
    -2 | 298($endingBalance-=-17)
    起始余额:300($endingBalance-=-2)

    您的代码已更新:

    //Fetch the transactions public 
    function fetchTransactions() 
    {     
        global $db;
        $this->getStartingBalance();
        $endingBalance = $this->startingBalance + $this->getTransactionsSum();
        $runningTotal = $endingBalance;
        $prevAmount = 0;
        $fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id DESC, date DESC");     
    
        while ($transactionDetails = $fetchTransactionsSQL->fetch()) 
        {         
            $payee = stripslashes($transactionDetails[payee]);         
            $category = $transactionDetails['cat'];         
            $amount = money_format("%n", $transactionDetails[amount]);
    
            $runningTotal -= $prevAmount;    
            $prevAmount = $amount;
    
            $runningTotalOutput = money_format("%n", $runningTotal);         
    
            echo "<tr>                     
                    <td class=\"payee\">$payee</td>                     
                    <td>$category</td>                     
                    <td>$amount</td>                     
                    <td class=\"runningTotal\">$runningTotalOutput</td>                 
                </tr>";     
        } 
    }
    
    function getTransactionsSum()
    {
        $sql = $db->query("SELECT SUM(amount) AS mySum FROM transactions");
        if( $sumFields = $sql->fetch() )
        {
            return money_format("%n", $sumFields[mySum]);
        }
        else
        {
            return 0;
        }
    }
    
    //获取公共事务
    函数fetchTransactions()
    {     
    全球$db;
    $this->getStartingBalance();
    $endingBalance=$this->startingBalance+$this->getTransactionsSum();
    $runningTotal=$endingBalance;
    $prevAmount=0;
    $FetchTransactionSql=$db->query(“按id说明、日期说明从交易订单中选择金额、收款人、类别、日期”);
    而($transactionDetails=$FetchTransactionSQL->fetch())
    {         
    $paye=stripslashes($transactionDetails[paye]);
    $category=$transactionDetails['cat'];
    $amount=money_格式(“%n”,$transactionDetails[amount]);
    $runningTotal-=$prevAmount;
    $prevAmount=$amount;
    $runningTotalOutput=money\u格式(“%n”,$runningTotal);
    回声“
    美元受款人
    $category
    美元金额
    $runningTotalOutput
    ";     
    } 
    }
    函数getTransactionsSum()
    {
    $sql=$db->query(“从事务中选择金额作为mySum”);
    如果($sumFields=$sql->fetch())
    {
    返回货币_格式(“%n”,$sumFields[mySum]);
    }
    其他的
    {
    返回0;
    }
    }
    

    我希望您已经发现了有用的…

    什么是
    $this->启动余额
    ?如果您指定一个月,它是否获得指定日期约束的起始余额?起始余额是将其添加到应用程序时帐户的初始余额。例如如果用户开始时有$359,则会将其与帐户表中的帐户名称和类型一起保存。余额是通过将交易的总和(金额的有符号整数)加到起始金额来计算的。这看起来很有希望,我们将在稍后进行尝试。我正在努力解决的另一个问题是,如何将所有这些内容放到分页索引中,而不丢弃所有内容。例如,从最近的事务开始,每页30个事务。谢谢你的帮助,我想就是这样了。我会考虑分页索引,并在明天之前解决一些问题。。。我很高兴能帮上忙。非常感谢!我的“日班工作”是24小时轮班的,只要我有能力,我就会做这件事。恭喜你赢得了赏金,真的很感激。
    
    //Fetch the transactions public 
    function fetchTransactions() 
    {     
        global $db;
        $this->getStartingBalance();
        $endingBalance = $this->startingBalance + $this->getTransactionsSum();
        $runningTotal = $endingBalance;
        $prevAmount = 0;
        $fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id DESC, date DESC");     
    
        while ($transactionDetails = $fetchTransactionsSQL->fetch()) 
        {         
            $payee = stripslashes($transactionDetails[payee]);         
            $category = $transactionDetails['cat'];         
            $amount = money_format("%n", $transactionDetails[amount]);
    
            $runningTotal -= $prevAmount;    
            $prevAmount = $amount;
    
            $runningTotalOutput = money_format("%n", $runningTotal);         
    
            echo "<tr>                     
                    <td class=\"payee\">$payee</td>                     
                    <td>$category</td>                     
                    <td>$amount</td>                     
                    <td class=\"runningTotal\">$runningTotalOutput</td>                 
                </tr>";     
        } 
    }
    
    function getTransactionsSum()
    {
        $sql = $db->query("SELECT SUM(amount) AS mySum FROM transactions");
        if( $sumFields = $sql->fetch() )
        {
            return money_format("%n", $sumFields[mySum]);
        }
        else
        {
            return 0;
        }
    }