多订单时发票数据无法更新,始终显示首单内容的技术问询
解决发票始终显示第一个订单内容的问题
我仔细看了你的代码,发现发票页面总是固定显示第一个订单内容的核心问题在于没有正确利用传入的订单参数筛选数据,再加上一些逻辑混乱的小问题,导致每次都加载了表中的第一条记录。下面是具体的分析和修复方案:
问题根源
- 忽略URL参数:在
invoice.php里,你直接执行了SELECT * FROM facturic并只取第一行数据,完全没用到从URL传过来的codc、codcl、codp参数——这就导致不管点哪个订单的「Vezi factura」,都会显示第一条发票记录。 - POST/GET混用:
article.php里是通过GET链接(<a href='invoice.php?codc=...'>)跳转到发票页的,但invoice.php却先判断isset($_POST['view']),这部分逻辑完全没用,因为跳转根本没带POST参数。 - 变量拼写错误:代码里出现了
$codc = $POST['codc'];,少了下划线,应该是$_POST,不过这里其实不需要POST方式。
修复后的invoice.php代码
<?php include_once 'header.php'; // 处理从URL传入的GET参数(因为是通过链接跳转,用$_GET) if (isset($_GET['codc']) && isset($_GET['codcl']) && isset($_GET['codp'])){ $codc = mysqli_real_escape_string($conn, $_GET['codc']); $codcl = mysqli_real_escape_string($conn, $_GET['codcl']); $codp = mysqli_real_escape_string($conn, $_GET['codp']); // 使用传入的参数筛选对应的发票数据,关联查询相关表 $sql = "SELECT seriefc, nrfc, datac, numecl, prenumecl, state, cnp, adresacl, denp, pretp FROM facturic INNER JOIN comenzi ON facturic.codc = comenzi.codc INNER JOIN clienti ON facturic.codcl = clienti.codcl INNER JOIN produse ON facturic.codp = produse.codp WHERE facturic.codc='$codc' AND facturic.codcl='$codcl' AND facturic.codp='$codp' "; $res = mysqli_query($conn, $sql) or die ("Nu s-a putut completa".mysqli_error($conn)); $invoice = $res->fetch_assoc(); // 获取对应订单的详细数据 $orderRes = mysqli_query($conn, "SELECT * FROM comenzi WHERE codc = '{$invoice['codc']}' "); $order = $orderRes->fetch_assoc(); } ?> <table border="1" bgcolor="#b3ccff"> <?php if(isset($invoice)): ?> <tr> <td><b>Seria</b></td> <td><?php echo $invoice['seriefc']; ?></td> <td><b>Nr factura</b></td> <td><?php echo $invoice['nrfc']; ?></td> <td><b>Data</b></td> <td><?php echo $order['datac']; ?></td> </tr> <!-- 补充客户信息行 --> <tr> <td><b>Nume client</b></td> <td colspan="3"><?php echo $invoice['numecl'] . ' ' . $invoice['prenumecl']; ?></td> <td><b>CNP</b></td> <td><?php echo $invoice['cnp']; ?></td> </tr> <!-- 补充地址信息 --> <tr> <td><b>Adresa</b></td> <td colspan="5"><?php echo $invoice['adresacl'] . ', ' . $invoice['state']; ?></td> </tr> <!-- 补充产品信息 --> <tr> <td><b>Produs</b></td> <td colspan="3"><?php echo $invoice['denp']; ?></td> <td><b>Pret</b></td> <td><?php echo $invoice['pretp']; ?></td> </tr> <?php else: ?> <tr> <td colspan="6">Nu s-a găsit nicio factură pentru comanda selectată.</td> </tr> <?php endif; ?> </table>
额外优化建议
- 防SQL注入:虽然你用了
mysqli_real_escape_string,但预处理语句(Prepared Statements)是更安全的选择,示例代码如下:
// 替换原来的查询逻辑 $stmt = $conn->prepare("SELECT seriefc, nrfc, datac, numecl, prenumecl, state, cnp, adresacl, denp, pretp FROM facturic INNER JOIN comenzi ON facturic.codc = comenzi.codc INNER JOIN clienti ON facturic.codcl = clienti.codcl INNER JOIN produse ON facturic.codp = produse.codp WHERE facturic.codc=? AND facturic.codcl=? AND facturic.codp=?"); $stmt->bind_param("sss", $codc, $codcl, $codp); // s代表字符串类型,根据你的字段类型调整 $stmt->execute(); $res = $stmt->get_result(); $invoice = $res->fetch_assoc();
- 代码复用:把数据库连接代码放到单独的文件(比如
db-connect.php),然后在需要的页面include,避免重复代码。 - 前端样式优化:去掉
<font>标签,用CSS来控制字体大小和表格样式,让页面更易维护。
内容的提问来源于stack exchange,提问作者Cristina Flori
相关产品推荐
相关产品推荐

