PHP中传递movie_id到详情页,解决未定义变量错误
解决PHP电影列表到详情页的参数传递错误及实现方案
错误根源
- 参数名不匹配:列表页跳转链接用的是
movieId,但详情页里直接用了未定义的$movie_id,变量名完全对不上 - 未正确获取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
相关产品推荐
相关产品推荐

