PHP使用$_GET删除记录时$_SESSION['message']提示不生效问题咨询
底层原因说明
该现象是PHP脚本执行顺序 + header跳转后未终止脚本运行共同导致的,完整流程如下:
- 删除操作的请求是直接访问带参数的
index.php?delete=xxx,index.php第一行就引入了process.php,会先执行process.php的逻辑:- 检测到
$_GET['delete']存在,执行删除操作,给$_SESSION['message']、$_SESSION['msg_type']赋值 - 执行
header("location: index.php")告知浏览器需要跳转,但你没有在header后加exit/die终止脚本执行,后续代码会继续运行
- 检测到
- process.php执行完毕后,继续执行index.php的后续代码:
- 检测到
$_SESSION['message']存在,输出提示内容,然后立即执行unset($_SESSION['message'])清空了会话中的提示值 - 此时header跳转才生效,浏览器发起新请求访问无参数的index.php
- 检测到
- 新的index.php请求中,
$_SESSION['message']已经被上一步的unset清空,所以没有提示显示
新增、更新操作能正常显示提示的原因是:这两个操作是POST提交到独立的process.php,处理完跳转时当前脚本就是process.php,没有后续的unset SESSION的代码,所以SESSION的值会保留到跳转后的index.php请求中,提示能正常输出。
删除header后功能正常的逻辑
去掉delete块中的header跳转后,不会触发二次请求:
- 执行完删除逻辑、设置SESSION后,直接继续执行当前index.php的渲染逻辑
- 读取到SESSION中的提示值输出后再清空,页面就能正常显示删除成功提示。
若要保留跳转功能的修复方案
只需要在header("location: index.php");后面补一行exit;即可,这样脚本执行到header就会终止,不会提前清空SESSION的值,跳转后的新请求就能正常读取到提示内容。
内容的提问来源于stack exchange,提问作者user14584183
相关产品推荐
相关产品推荐

