You need to enable JavaScript to run this app. PHP论坛评论编辑删除报Undefined index: id错误求助
优惠活动
大模型
产品
解决方案
定价
更多

PHP论坛评论编辑删除报Undefined index: id错误求助

问题根因汇总

你遇到的三个报错均由代码逻辑缺陷直接导致:

  • comments.php 中的编辑、删除链接未传递评论ID参数,访问edit.php时无idGET参数,直接触发Undefined index: id报错
  • edit.php 查询SQL语法错误,未正确传入ID参数,导致查询返回空结果,$row为null,触发Trying to access array offset on value of type null报错
  • 多页面存在赋值与比较运算符混用、会话启动顺序错误、输出漏写echo、SQL语法错误等问题
逐文件修复方案

1. comments.php 修复

<?php
// 文件顶部加会话启动
session_start();
// ... 原有数据库连接等代码保持不变

// 找到show_comments函数内的编辑、删除链接行,修改为带ID参数的格式
<a href="edit.php?id=<?=$comment['id']?>">edit</a>
<a href="delete.php?comments_id=<?=$comment['id']?>">delete</a>

// 原有登录状态判断的赋值符号=改为比较符号==,否则判断永远为真
if($_SESSION['is_open'] == TRUE){
    echo show_write_comment_form();
}else{
    echo "Please login to post.";
    echo "</br>";
}
if($_SESSION['is_open'] == TRUE){
    echo show_comments($comments);
}else{
    echo "Please login to see others comments.";
}
?>

2. edit.php 修复

<?php 
// 顶部先启动会话、校验登录状态
session_start();
if(!isset($_SESSION['is_open']) || $_SESSION['is_open'] != TRUE){
    header("Location: login.php");
    exit;
}
require_once('includes/mysqli_connect.php');

// 先校验ID参数是否存在
if(!isset($_GET["id"])){
    exit("评论ID不存在");
}
$id = intval($_GET["id"]);

// 修正SQL语句,正确传入ID参数
$sql = "SELECT * FROM comments WHERE id = $id";
$result = mysqli_query($dbc,$sql) or die(mysqli_error($dbc));        
$row = mysqli_fetch_array($result);

// 校验评论是否存在
if(!$row){
    exit("该评论不存在");
}
?>

<h3>编辑评论</h3>
<!-- 补全表单属性空格 -->
<form action="save_edit.php" enctype="multipart/form-data" method="post" name="myForm" >
  <table>
    <tr>
      <td><b>用户名</b></td>
      <!-- 加echo输出变量,用htmlspecialchars避免XSS风险 -->
      <td><input type="text" size="70" maxlength="100" name="name" value="<?=htmlspecialchars($row['name'])?>"></td>
    </tr>
    <tr>
      <td><b>评论内容</b></td>
      <td><textarea cols="80" rows="18" name="content"><?=htmlspecialchars($row['content'])?></textarea></td>
    </tr>
  </table>
  <input type="hidden" name="id" value="<?=$id?>" />
  <input name="enter" type="submit" value="提交修改">
</form>

3. save_edit.php 修复

<?php
session_start();
if(!isset($_SESSION['is_open']) || $_SESSION['is_open'] != TRUE){
    header("Location: login.php");
    exit;
}
require_once('includes/mysqli_connect.php');

if(!isset($_POST["id"])){
    exit("参数错误");
}
$id = intval($_POST["id"]);
// mysqli_real_escape_string需传入数据库连接参数
$name = mysqli_real_escape_string($dbc, $_POST['name']);
$content = mysqli_real_escape_string($dbc, $_POST['content']);

// 去掉content字段后多余的逗号,修正SQL语法
$sql = "UPDATE comments SET name='$name', content='$content' WHERE id=$id";
// 执行SQL语句
mysqli_query($dbc, $sql) or die(mysqli_error($dbc));

mysqli_close($dbc);
// 替换为你实际的评论页跳转地址,携带对应page_id参数
header ("location: comments.php?page_id=1");
exit;
?>

4. delete.php 修复

<?php
// 会话启动必须放在所有输出之前
session_start();
if(!isset($_SESSION['is_open']) || $_SESSION['is_open'] != TRUE){
    header("Location: login.php");
    exit;
}
require_once('includes/mysqli_connect.php');

if(!isset($_GET['comments_id'])){
    exit("评论ID不存在");
}
$id = intval($_GET['comments_id']);

$query = "DELETE FROM comments WHERE id=$id";
$result = mysqli_query($dbc, $query) or die(mysqli_error($dbc));
if($result){
    echo "<br>评论已删除";
} else{
    echo"<br>评论删除失败";
}
// 替换为实际的评论页地址
echo "<p><a href='comments.php?page_id=1'>返回主页面</a></p>";
mysqli_close($dbc);
?>
额外优化建议
  • 所有SQL操作建议改用预处理语句,彻底避免SQL注入风险
  • 增加评论归属校验逻辑,仅允许评论作者或管理员修改、删除对应评论
  • 跳转前不要输出任何内容,避免header already sent报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 13:27:03