PHP中嵌套isset或Session功能失效,CMS前台文章页不显示编辑入口问题排查
问题排查解决步骤
- 所有使用Session的页面顶部必须加
session_start()
所有涉及$_SESSION读写的页面(包括Login.php、导航栏所属的文章详情页、后台页面)都需要在代码最顶部、任何输出之前写入session_start(),否则PHP无法读取到已存储的Session值,同时注意session_start()前不能有空格、HTML代码、UTF-8 BOM头等任何输出内容。
- 所有使用Session的页面顶部必须加
- 修复Login.php的登录判断逻辑漏洞
你当前的登录判断逻辑存在明显错误:原判断的第一个条件if($username !== $db_username && $password !== $db_user_password)是只有用户名和密码同时都错误的时候才会跳转,只要其中一项正确就不会进入该分支,也不会进入后续设置Session的分支,导致Session没有正确写入。需要修改为:
- 修复Login.php的登录判断逻辑漏洞
// 把逻辑与&&改为逻辑或||,只要用户名或密码任意一项错误就跳转 if($username !== $db_username || $password !== $db_user_password) { header("Location: ../index.php"); // 跳转后必须加exit终止后续代码执行 exit; } else { // 账号密码验证通过后设置Session $_SESSION['username'] = $db_username; $_SESSION['firstname'] = $db_user_firstname; $_SESSION['lastname'] = $db_user_lastname; $_SESSION['user_role'] = $db_user_role; header("Location: ../admin"); exit; }
- 补全管理员角色判断
你当前只判断了user_role是否存在,没有校验是不是管理员身份,普通用户登录后也会显示编辑链接,建议修改导航栏判断逻辑:
- 补全管理员角色判断
// 请根据你的实际管理员角色值调整判断条件,比如你的管理员角色值是admin就写=== 'admin' if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') { if(isset($_GET['p_id'])) { $the_post_id = $_GET['p_id']; echo "<li><a href='admin/post.php?source=edit_post&p_id={$the_post_id}'>Edit Post</a></li>"; } }
- 调试验证参数是否正常传递
如果以上修改后仍不生效,可以临时在导航栏代码前加两行调试代码,确认参数是否正常读取:
- 调试验证参数是否正常传递
// 调试用,上线后删除 var_dump($_SESSION); var_dump($_GET);
如果输出中没有user_role字段说明Session没有正常写入,没有p_id字段说明文章详情页没有正确传递p_id参数。
- 检查Cookie设置
确认浏览器没有禁用Session对应的Cookie,PHP默认通过Cookie存储Session ID,禁用Cookie会导致Session无法跨页面传递。
- 检查Cookie设置
内容的提问来源于stack exchange,提问作者Yusuf Raşit Özer
相关产品推荐
相关产品推荐

