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

PHP中传递movie_id到详情页,解决未定义变量错误

解决PHP电影列表到详情页的参数传递错误及实现方案

错误根源

  1. 参数名不匹配:列表页跳转链接用的是movieId,但详情页里直接用了未定义的$movie_id,变量名完全对不上
  2. 未正确获取GET参数:详情页没有从URL的请求参数里读取值,直接使用未初始化的变量

修正后的电影列表页(Page1)

确保生成的跳转链接参数名和详情页保持一致(统一用movie_id),同时做基础的XSS防护:

<?php
// 假设已从数据库拿到电影数据数组$movies
foreach ($movies as $movie) {
    // 生成带统一参数名的跳转链接,转义标题避免XSS
    echo "<a href='page2.php?movie_id=" . $movie['id'] . "'>" . htmlspecialchars($movie['title']) . "</a><br>";
}
?>

修正后的电影详情页(Page2)

先合法获取参数,再用安全的方式执行数据库查询,同时处理异常情况:

<?php
// 1. 校验并获取合法的电影ID
if (!isset($_GET['movie_id']) || !is_numeric($_GET['movie_id'])) {
    die("无效的电影ID");
}
$movie_id = intval($_GET['movie_id']); // 转为整数,确保是合法的数字ID

// 2. 连接数据库(示例用PDO,更安全)
$dsn = 'mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4';
$db_user = '你的数据库账号';
$db_pass = '你的数据库密码';

try {
    $pdo = new PDO($dsn, $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 3. 用预处理语句查询,彻底杜绝SQL注入
    $stmt = $pdo->prepare("SELECT * FROM movies WHERE id = ?");
    $stmt->execute([$movie_id]);
    $movie = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$movie) {
        die("未找到对应的电影");
    }

    // 4. 展示电影详情,所有输出内容转义防XSS
    echo "<h1>" . htmlspecialchars($movie['title']) . "</h1>";
    echo "<p>导演:" . htmlspecialchars($movie['director']) . "</p>";
    echo "<p>上映日期:" . htmlspecialchars($movie['release_date']) . "</p>";
    echo "<p>简介:" . htmlspecialchars($movie['description']) . "</p>";
} catch (PDOException $e) {
    die("数据库出错:" . $e->getMessage());
}
?>

核心注意事项

  • 参数名必须统一:列表页和详情页的参数名要完全一致,别大小写或拼写不一致
  • 必须校验参数合法性:不能直接信任用户传的任何值,先判断是否存在、是否为合法数字
  • 绝对要防SQL注入:永远用预处理语句执行查询,别直接把变量拼进SQL语句里
  • 输出要转义:从数据库取的内容输出到页面时,用htmlspecialchars转义,避免XSS攻击

内容的提问来源于stack exchange,提问作者Alan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:31:07