PHP会话传递异常:点击详情始终显示最后一条数据库记录
问题描述
我是一名PHP新手,已经尝试PHP开发一段时间。目前在place.php中编写了从vmaxdbweb数据库的tblplatz表读取数据生成表格的代码,循环中将每条记录的pla_id存入$_SESSION["detail"],点击表格的详情链接跳转到placedetail.php后,无论点击哪条记录,始终只显示最后一条记录的pla_id。我发现是循环覆盖了会话值,想请教如何正确使用会话传递对应记录的ID。
原代码
place.php
<?php session_start(); // 启动会话 $con = mysqli_connect("localhost", "root", "", "vmaxdbweb"); $res = mysqli_query($con, "SELECT * FROM tblplatz"); // 表格开始 echo "<table class='tbl'>"; // 表头 echo "<th>ID</th> <th>名称</th> <th>编码</th>"; echo "<th>备注&评估</th> <th>地理数据</th> <th>详情</th>"; $lf = 1; while ($dsatz = mysqli_fetch_assoc($res)) { // 将数据存入会话,键为'pla_id' $_SESSION["detail"] = $dsatz["pla_id"]; echo "<tr>"; echo "<td>" . $dsatz["pla_id"] . "</td>"; echo "<td>" . $dsatz["pla_bezeichnung"] . "</td>"; echo "<td>" . $dsatz["pla_code"] . "</td>"; echo "<td>" . $dsatz["pla_notiz_beurteilung"] . "</td>"; echo "<td>" . $dsatz["pla_geodaten"] . "</td>"; echo "<td><a href='content/placedetail.php'>详情</a></td>"; $lf = $lf + 1; } // 表格结束 echo "</tabelle>"; mysqli_close($con); ?> <table> </table>
placedetail.php
<?php session_start(); // 从会话中获取`pla_bezeichnung`列的值 $pla_bezeichnung = $_SESSION["detail"]; // 显示对应场地的详情 echo "场地名称为 " . $pla_bezeichnung; ?>
解决方案
方法一:通过URL参数传递ID(推荐)
会话的作用是存储用户全局状态,不适合用来传递单条记录的ID——循环过程中会不断覆盖$_SESSION["detail"]的值,最终只会保留最后一条记录的ID。更合理的做法是把pla_id作为URL参数直接传递给详情页:
1. 修改place.php的详情链接
把循环内的详情链接改成带参数的形式,让每条链接都携带对应记录的pla_id:
echo "<td><a href='content/placedetail.php?pla_id=" . $dsatz["pla_id"] . "'>详情</a></td>";
2. 修改placedetail.php获取并展示数据
直接从URL参数中读取pla_id,然后查询对应记录的详情。注意:必须对参数进行过滤,防止SQL注入风险:
<?php session_start(); // 若无需其他会话功能,可移除该行 $con = mysqli_connect("localhost", "root", "", "vmaxdbweb"); // 过滤URL参数,防止SQL注入 $pla_id = mysqli_real_escape_string($con, $_GET['pla_id']); // 查询对应记录 $res = mysqli_query($con, "SELECT * FROM tblplatz WHERE pla_id = '$pla_id'"); $dsatz = mysqli_fetch_assoc($res); // 展示详情 if ($dsatz) { echo "场地名称为 " . $dsatz["pla_bezeichnung"]; // 可按需添加更多字段的展示 } else { echo "未找到对应场地"; } mysqli_close($con); ?>
方法二:用会话存储所有ID(不推荐,无必要)
如果一定要使用会话,可以先把所有记录的pla_id存入会话数组,但依然需要通过URL参数指定要查看的ID:
1. 修改place.php存储会话数组
<?php session_start(); $con = mysqli_connect("localhost", "root", "", "vmaxdbweb"); $res = mysqli_query($con, "SELECT * FROM tblplatz"); // 初始化会话数组 $_SESSION['pla_ids'] = []; echo "<table class='tbl'>"; echo "<th>ID</th> <th>名称</th> <th>编码</th>"; echo "<th>备注&评估</th> <th>地理数据</th> <th>详情</th>"; $lf = 1; while ($dsatz = mysqli_fetch_assoc($res)) { // 将ID存入会话数组 $_SESSION['pla_ids'][$dsatz["pla_id"]] = $dsatz["pla_id"]; echo "<tr>"; echo "<td>" . $dsatz["pla_id"] . "</td>"; echo "<td>" . $dsatz["pla_bezeichnung"] . "</td>"; echo "<td>" . $dsatz["pla_code"] . "</td>"; echo "<td>" . $dsatz["pla_notiz_beurteilung"] . "</td>"; echo "<td>" . $dsatz["pla_geodaten"] . "</td>"; // 依然需要URL参数指定ID echo "<td><a href='content/placedetail.php?pla_id=" . $dsatz["pla_id"] . "'>详情</a></td>"; $lf = $lf + 1; } echo "</tabelle>"; mysqli_close($con); ?>
2. 修改placedetail.php读取对应ID
<?php session_start(); $con = mysqli_connect("localhost", "root", "", "vmaxdbweb"); $pla_id = mysqli_real_escape_string($con, $_GET['pla_id']); // 检查会话数组中是否存在该ID if (isset($_SESSION['pla_ids'][$pla_id])) { $res = mysqli_query($con, "SELECT * FROM tblplatz WHERE pla_id = '$pla_id'"); $dsatz = mysqli_fetch_assoc($res); if ($dsatz) { echo "场地名称为 " . $dsatz["pla_bezeichnung"]; } else { echo "未找到对应场地"; } } else { echo "无效的场地ID"; } mysqli_close($con); ?>
显然方法一更简洁高效,是这类场景的标准实现方式,无需借助会话传递单条记录的ID。
内容的提问来源于stack exchange,提问作者Frontwichtel
相关产品推荐
相关产品推荐

