PHP求助:如何调用MySQL表中同一invoice_no下的各列数据?
问题分析与解决方案
看起来你现在的问题出在循环逻辑和输出时机上,我来帮你拆解并修复:
问题根源
- 你的
while循环里每次都用$product_name = $row['product_name'];覆盖变量,循环结束后$product_name只保留最后一条记录的产品名,再用$product_name[0]自然只会取这个字符串的第一个字符。 - 你只在循环外写了一行
<tr>,没有根据查询到的记录数量生成对应行数的输入框。
修复后的代码
我会把逻辑调整为在循环内部逐行生成表格内容,同时填充从数据库取出的对应数据,还顺便帮你优化了SQL安全(避免注入风险):
<table align="center" style="width:800px;"> <thead> <tr> <th>#</th> <th style="text-align:center;">Item Name</th> <th style="text-align:center;">Total Quantity</th> <th style="text-align:center;">Quantity</th> <th style="text-align:center;">Buy Price</th> <th>Total</th> </tr> </thead> <tbody id="invoice_item"> <?php // 用预处理语句防止SQL注入,更安全 $query1 = "SELECT * FROM purchase_details WHERE invoice_no = ?"; $stmt = mysqli_prepare($connect, $query1); mysqli_stmt_bind_param($stmt, "i", $id); // 假设$id是整数类型,字符串的话用"s" mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $counter = 1; // 用于序号计数 while($row = mysqli_fetch_array($result)){ // 从当前行取出数据,替换成你表中实际的字段名 $product_name = $row['product_name']; $total_quantity = $row['total_quantity']; $quantity = $row['quantity']; $buy_price = $row['buy_price']; $total = $row['total']; ?> <tr> <td><b id="number"><?php echo $counter++; ?></b></td> <td> <select name="pid[]" class="form-control form-control-sm" required> <!-- 如果需要默认选中对应产品,这里可以补充产品列表的查询逻辑 --> <option selected=""><?php echo $product_name; ?></option> </select> </td> <td><input name="tqty[]" readonly type="text" class="form-control form-control-sm" value="<?php echo $total_quantity; ?>"></td> <td><input name="qty[]" type="text" class="form-control form-control-sm" required value="<?php echo $quantity; ?>"></td> <td><input name="price[]" type="text" class="form-control form-control-sm" readonly value="<?php echo $buy_price; ?>"></td> <td><?php echo $total; ?></td> </tr> <?php } // 关闭预处理语句 mysqli_stmt_close($stmt); ?> </tbody> </table>
关键说明
- 循环内生成行:把
<tr>的代码放到while循环内部,这样每查询到一条记录就生成一行输入框,数量自然和记录数匹配。 - SQL安全优化:用
mysqli_prepare预处理语句绑定参数,避免直接把$id拼进SQL语句导致注入风险。 - 数据填充:把从数据库取出的每个字段值,用
<?php echo ... ?>填充到对应的输入框、下拉框或单元格中。 - 序号计数:用
$counter变量实现每行的递增序号。
如果你的表字段名和我假设的不一样,记得替换成你实际的字段名哦~
内容的提问来源于stack exchange,提问作者Sudipta Mondal
相关产品推荐
相关产品推荐

