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
相关产品推荐
相关产品推荐

