PHP+MySQLi计算商品总价总和显示异常,求排查错误
问题:计算商品库存总价值时结果显示为“Rp 1”的排查与修复
我想要计算oc_product表中状态为'1','2','3'的商品总价值,规则是每个商品取oc_stock_hpp表中最新的buy_price,乘以该商品的quantity后求和。用PHP与MySQLi写了代码,但最终结果显示为“Rp 1”,请问问题出在哪里?
原代码:
$query_nominal = "SELECT SUM(quantity*(SELECT shpp.buy_price FROM oc_stock_hpp shpp WHERE shpp.product_id = p.product_id ORDER BY shpp.id DESC LIMIT 1)) as total FROM oc_product p WHERE status IN ('1','2','3')"; $result_nominal = mysqli_query($koneksi, $query_nominal); $total_nilai_transaksi = mysqli_fetch_assoc($result_nominal); ?> <body> <?php echo "Rp " . number_format((float)$total_nilai_transaksi, 0, ',', '.'); ?> </body>
问题根源
- 数组取值错误:
mysqli_fetch_assoc()返回的是关联数组,你直接把整个数组传给number_format()时,PHP会将数组强制转换为布尔值true,而(float)true等于1,这就是结果显示“Rp 1”的核心原因。必须取出数组中total键对应的实际计算值。 - SQL潜在隐患:如果某个商品在
oc_stock_hpp中没有对应记录,子查询会返回NULL,导致该商品的计算值为NULL,SUM()函数会自动跳过这类值,可能造成结果不符合预期。
修复后的代码
<?php $query_nominal = "SELECT SUM(quantity*(SELECT shpp.buy_price FROM oc_stock_hpp shpp WHERE shpp.product_id = p.product_id ORDER BY shpp.id DESC LIMIT 1)) as total FROM oc_product p WHERE status IN ('1','2','3')"; $result_nominal = mysqli_query($koneksi, $query_nominal); // 取出total字段的值,若查询结果为空则默认设为0 $total_data = mysqli_fetch_assoc($result_nominal); $total = isset($total_data['total']) ? (float)$total_data['total'] : 0; ?> <body> <?php echo "Rp " . number_format($total, 0, ',', '.'); ?> </body>
额外优化建议
- 处理无库存记录的商品:用
COALESCE函数确保子查询无结果时返回0,避免NULL影响计算:SELECT SUM(quantity*COALESCE((SELECT shpp.buy_price FROM oc_stock_hpp shpp WHERE shpp.product_id = p.product_id ORDER BY shpp.id DESC LIMIT 1), 0)) as total FROM oc_product p WHERE status IN ('1','2','3') - 增加错误判断:防止SQL查询失败导致的异常:
$result_nominal = mysqli_query($koneksi, $query_nominal); if (!$result_nominal) { die('查询失败: ' . mysqli_error($koneksi)); }
内容的提问来源于stack exchange,提问作者wenza
相关产品推荐
相关产品推荐

