php - 如何使用 php mysql 运行循环根据月份和总列值显示结果

标签 php mysqli while-loop sum

我正在尝试获取如下图所示的输出:

enter image description here

下面是我的表结构和条目:

enter image description here

我尝试过以下查询:

$from_date = '2018-04-01';  
$to_date = '2018-09-01';  

$cid = mysqli_query($con_db,"SELECT * FROM tbl_silver_stock WHERE stockdate between '$from_date' and '$to_date'");

我在如何检查月份是否完整并获取列的总值方面遇到问题。

请帮助我。

最佳答案

我会将样式和优化留给您。通常,我喜欢用临时值来标识“组”或“批处理”,并在循环数据时滚动记录各列的总和。然而,由于要求和的列太多,我在开发中途改变了主意,决定使用 array_column() 和 array_sum() 。在我看来,这两种技术都可以找到。

就稳定性/安全性而言:

  1. 在尝试访问值之前,最好先检查预期的提交数据是否存在。
  2. 还建议对提交的数据进行一定程度的验证。你能走多远取决于你自己。
  3. 您需要使用准备好的语句,因为允许用户提供的数据不受阻碍地进入查询并不是一个好主意。
  4. 完成代码的开发/测试后,请务必删除错误消息。您不得让公众看到错误消息,因为它们包含恶意行为者可能利用的有值(value)的详细信息。

测试代码:

$_GET['from'] = '2018-04-01';
$_GET['to'] = '2018-09-18';

$config = ['localhost', 'root', '', 'dbname'];
$sql = "SELECT DATE_FORMAT(stockdate, '%Y-%m') AS batch,
               DATE_FORMAT(stockdate, '%e-%c-%Y') AS formatteddate,
               particulars,
               vch_type,
               vch_number,
               in_quantity,
               in_price_value,
               out_quantity,
               out_price_value,
               cls_quantity,
               cls_price_value
        FROM tbl_silver_stock
        WHERE stockdate BETWEEN ? AND ?
        ORDER BY stockdate, particulars";
if (!$conn = new mysqli(...$config)) {
    echo "Database Connection Error: $conn->connect_error";
} elseif (!$stmt = $conn->prepare($sql)) {
    echo "Prepare Syntax Error: $conn->error";
} elseif (!$stmt->bind_param("ss", $_GET['from'], $_GET['to']) || !$stmt->execute() || !$result = $stmt->get_result()) {
    echo "Statement Error: $stmt->error";
} elseif (!$result->num_rows) {
    echo "No Rows between {$_GET['from']} and {$_GET['to']}";
} else {
    while ($row = $result->fetch_assoc()) {
        $results[] = $row;                   // for grand total
        $batch[array_shift($row)][] = $row;  // group by year-month value
    }

    ?>
    <table border=1>
        <tr>
            <td rowspan=2>Date</td>
            <td rowspan=2>Particulars</td>
            <td rowspan=2>Vch Type</td>
            <td rowspan=2>Vch No</td>
            <td colspan=2>Inwards</td>
            <td colspan=2>Outwards</td>
            <td colspan=2>Closing</td>
        </tr>
        <tr>
            <td>Quantity</td>
            <td>Value</td>
            <td>Quantity</td>
            <td>Value</td>
            <td>Quantity</td>
            <td>Value</td>
        </tr>
        <?php
        foreach ($batch as $ym => $rows) {
            foreach ($rows as $row) {
                echo "<tr>";
                    echo "<td>{$row['formatteddate']}</td>";
                    echo "<td>{$row['particulars']}</td>";
                    echo "<td>{$row['vch_type']}</td>";  // a lookup array or table join is required for these values
                    echo "<td>" , ($row['vch_number'] == 0 ? '' : $row['vch_number']) , "</td>";
                    echo "<td>" , ($row['in_quantity'] == 0 ? '' : "{$row['in_quantity']}KG") , "</td>";
                    echo "<td>" , ($row['in_price_value'] == 0 ? '' : number_format($row['in_price_value'], 2)) , "</td>";
                    echo "<td>" , ($row['out_quantity'] == 0 ? '' : "{$row['out_quantity']}KG") , "</td>";
                    echo "<td>" , ($row['out_price_value'] == 0 ? '' : number_format($row['out_price_value'], 2)) , "</td>";
                    echo "<td>" , ($row['cls_quantity'] == 0 ? '' : "{$row['cls_quantity']}KG") , "</td>";
                    echo "<td>" , ($row['cls_price_value'] == 0 ? '' : number_format($row['cls_price_value'], 2)) , "</td>";
                echo "</tr>";
            }
            $sum['in_quantity'] = array_sum(array_column($rows, 'in_quantity'));
            $sum['in_price_value'] = array_sum(array_column($rows, 'in_quantity'));
            $sum['out_quantity'] = array_sum(array_column($rows, 'out_quantity'));
            $sum['out_price_value'] = array_sum(array_column($rows, 'out_price_value'));
            $sum['cls_quantity'] = array_sum(array_column($rows, 'cls_quantity'));
            $sum['cls_price_value'] = array_sum(array_column($rows, 'cls_price_value'));                    
            echo "<tr>";
                echo "<td colspan=4>Totals as per \"Default\" valuation:</td>";
                echo "<td>" , ($sum['in_quantity'] == 0 ? '' : "{$sum['in_quantity']}KG") , "</td>";
                echo "<td>" , ($sum['in_price_value'] == 0 ? '' : number_format($sum['in_price_value'], 2)) , "</td>";
                echo "<td>" , ($sum['out_quantity'] == 0 ? '' : "{$sum['out_quantity']}KG") , "</td>";
                echo "<td>" , ($sum['out_price_value'] == 0 ? '' : number_format($sum['out_price_value'], 2)) , "</td>";
                echo "<td>" , ($sum['cls_quantity'] == 0 ? '' : "{$sum['cls_quantity']}KG") , "</td>";
                echo "<td>" , ($sum['cls_price_value'] == 0 ? '' : number_format($sum['cls_price_value'], 2)) , "</td>";
            echo "</tr>";
        }
        $grand['in_quantity'] = array_sum(array_column($results, 'in_quantity'));
        $grand['in_price_value'] = array_sum(array_column($results, 'in_price_value'));
        $grand['out_quantity'] = array_sum(array_column($results, 'out_quantity'));
        $grand['out_price_value'] = array_sum(array_column($results, 'out_price_value'));
        $grand['cls_quantity'] = array_sum(array_column($results, 'cls_quantity'));
        $grand['cls_price_value'] = array_sum(array_column($results, 'cls_price_value'));
        echo "<tr>";
            echo "<td colspan=4>Grand Totals as per \"Default\" valuation:</td>";
            echo "<td>" , ($grand['in_quantity'] == 0 ? '' : "{$grand['in_quantity']}KG") , "</td>";
            echo "<td>" , ($grand['in_price_value'] == 0 ? '' : number_format($grand['in_price_value'], 2)) , "</td>";
            echo "<td>" , ($grand['out_quantity'] == 0 ? '' : "{$grand['out_quantity']}KG") , "</td>";
            echo "<td>" , ($grand['out_price_value'] == 0 ? '' : number_format($grand['out_price_value'], 2)) , "</td>";
            echo "<td>" , ($grand['cls_quantity'] == 0 ? '' : "{$grand['cls_quantity']}KG") , "</td>";
            echo "<td>" , ($grand['cls_price_value'] == 0 ? '' : number_format($grand['cls_price_value'], 2)) , "</td>";
        echo "</tr>";
    echo "</table>";
}

输出:

enter image description here

关于php - 如何使用 php mysql 运行循环根据月份和总列值显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938152/

相关文章:

php - 垃圾邮件发送者使用相同的自动增量 ID 再次注册

javascript - 一旦值发生变化(客户端)如何直接更新值?

c# - 在输出中出现错误消息后重新启动 while 循环

swift - 从 Swift 3 中的 URL 列表下载内容的安全方法

python - python奇数或偶数函数的问题。返回 True 不起作用

php - 获取所选列的总和

php - 如何在 Javascript 中编写 PHP 以便加载文件?

php - 将 Mysql 更新为 mysqli 或 pdo 的最简单方法是什么

php - mysqli查询错误,不知道哪里出了问题

php - MySQLi:查询 VS 准备