根本原因是未在所有会话依赖页顶部调用session_start(),导致$_SESSION不可用;必须确保每个PHP文件(login.php、index.php、logout.php等)第一行即执行session_start()且无任何前置输出。

mysqli_connect 不安全,$_POST 直接拼 SQL 会炸库——这不是“学不会”,是没绕开最危险的入门陷阱。
别用 mysqli_connect 写注册逻辑
刚照着教程抄 mysqli_connect + mysqli_query 拼字符串插入用户,就等于把数据库钥匙塞进表单里。SQL 注入不是理论风险,是 ' OR '1'='1 一提交,整个 users 表就可能被拖走。
- 必须改用
mysqli_prepare+bind_param,或者直接上PDO的prepare/execute -
password字段不能存明文:PHP 8.0+ 用password_hash($_POST['password'], PASSWORD_ARGON2ID),验证时用password_verify() - 连接失败不能只
die("连接失败"),要记录错误但不暴露数据库结构(比如关掉display_errors)
$_SESSION 登录状态容易断,但原因常被忽略
登录后刷新页面就变回未登录,90% 是因为没调用 session_start(),或调用了但前面有输出(哪怕一个空格、BOM 头、echo 都不行)。
- 所有用到
$_SESSION的 PHP 文件,第一行必须是<?php session_start();,且前面不能有任何字符(包括 UTF-8 BOM) - 检查
session.save_path是否可写(ini_get('session.save_path')查路径,is_writable()测权限) - 不要在登录成功后立刻
header("Location: ..."),得先session_write_close(),否则高并发下可能丢 session
帖子列表分页卡顿?问题不在 SQL,而在没建索引
数据一过千条,SELECT * FROM posts ORDER BY created_at DESC LIMIT 20 OFFSET 1000 就开始肉眼可见慢——MySQL 要扫完前 1020 行才取最后 20 条。
立即学习“PHP免费学习笔记(深入)”;
- 给
posts表加联合索引:ALTER TABLE posts ADD INDEX idx_user_time (user_id, created_at DESC),按用户查+时间倒序都快 - 避免用
OFFSET做深分页,改成“游标分页”:WHERE created_at -
replies表的post_id必须加索引,否则查某帖所有回复就是全表扫描
真正卡住人的从来不是“怎么写个发帖按钮”,而是上线前发现用户能删别人帖子、密码字段被批量导出、首页加载要 4 秒——这些细节藏在配置、索引、会话生命周期和预处理语句里,不是看十遍注册代码就能绕过去的。



















