You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:18:10