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

PHP单篇文章多评论展示问题:SQL查询提示id未定义如何解决?

解决你的PHP评论系统SQL报错与安全问题

嘿,我来帮你搞定这个问题!你现在遇到两个核心问题:一个是SQL语句的语法错误,另一个是未检查$_GET['id']是否存在导致的"undefined id"报错,还有个隐藏的严重安全隐患——SQL注入,我一步步给你拆解修复:

1. 先修复SQL语法错误

你的SQL语句漏掉了关键的WHERE关键字,数据库根本不知道你要按什么条件筛选评论,原语句应该改成:

$sql = "SELECT `id`, `name`, `comment`, `time` FROM `comments` WHERE id='".$_GET['id']."'";

不过这只是语法修复,别急,还有更重要的问题要解决。

2. 解决"undefined id"报错

这个报错是因为你直接使用$_GET['id'],但当访问页面时URL里没有传递id参数(比如地址栏是yourpage.php而不是yourpage.php?id=123),这个变量就不存在了。你需要先检查参数是否存在且有效:

// 先判断id参数是否存在,且是有效的数字(评论表的id通常是整数)
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
    echo "缺少或无效的文章ID参数";
    exit; // 终止脚本执行,避免后续错误
}
$articleId = $_GET['id'];

3. 修复致命的SQL注入风险

直接把用户输入的$_GET['id']拼到SQL语句里,会被黑客利用进行SQL注入攻击,可能导致你的数据库被篡改甚至泄露。必须使用**预处理语句(参数绑定)**来解决,下面给你两种常见数据库扩展的示例:

如果你用的是mysqli(假设config.php里是mysqli连接)

require 'head.php';
require 'navbar.php';
require 'config.php';

// 先检查id参数
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
    echo "无效的文章ID";
    exit;
}
$articleId = $_GET['id'];

// 准备预处理语句
$stmt = $conn->prepare("SELECT `id`, `name`, `comment`, `time` FROM `comments` WHERE id = ?");
$stmt->bind_param("i", $articleId); // "i"表示参数是整数类型
$stmt->execute();
$result = $stmt->get_result();

// 遍历并输出评论
while ($row = $result->fetch_assoc()) {
    // 用htmlspecialchars转义内容,防止XSS攻击
    echo "<div class='comment-item'>";
    echo "<h5>" . htmlspecialchars($row['name']) . "</h5>";
    echo "<p>" . htmlspecialchars($row['comment']) . "</p>";
    echo "<small class='text-muted'>" . $row['time'] . "</small>";
    echo "</div>";
}

// 关闭资源
$stmt->close();
$conn->close();

如果你用的是PDO(假设config.php里是PDO连接)

require 'head.php';
require 'navbar.php';
require 'config.php';

if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
    echo "无效的文章ID";
    exit;
}
$articleId = $_GET['id'];

$stmt = $pdo->prepare("SELECT `id`, `name`, `comment`, `time` FROM `comments` WHERE id = ?");
$stmt->execute([$articleId]);

// 遍历输出评论
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "<div class='comment-item'>";
    echo "<h5>" . htmlspecialchars($row['name']) . "</h5>";
    echo "<p>" . htmlspecialchars($row['comment']) . "</p>";
    echo "<small class='text-muted'>" . $row['time'] . "</small>";
    echo "</div>";
}

额外提醒:防止XSS攻击

输出用户提交的评论内容时,一定要用htmlspecialchars()转义,避免用户输入的恶意HTML/JS代码在页面上执行,保护其他用户的安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:51