我正在尝试获取如下图所示的输出:
下面是我的表结构和条目:
我尝试过以下查询:
$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() 。在我看来,这两种技术都可以找到。
就稳定性/安全性而言:
- 在尝试访问值之前,最好先检查预期的提交数据是否存在。
- 还建议对提交的数据进行一定程度的验证。你能走多远取决于你自己。
- 您需要使用准备好的语句,因为允许用户提供的数据不受阻碍地进入查询并不是一个好主意。
- 完成代码的开发/测试后,请务必删除错误消息。您不得让公众看到错误消息,因为它们包含恶意行为者可能利用的有值(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>";
}
输出:
关于php - 如何使用 php mysql 运行循环根据月份和总列值显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938152/