项目结构
dbconn.php // 数据库连接
userList.php // 用户列表 (Read)
addUser.php // 添加用户表单 (Create)
addDo.php // 添加处理
editUser.php // 编辑用户表单 (Update)
editDo.php // 编辑处理
detailUser.php // 用户详情 (Read)
deleteUser.php // 删除用户 (Delete)
核心模块实现
1. 数据库连接 — dbconn.php
connect_errno) {
die('Connect Error: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4'); // 支持 Emoji
// 供其他文件引用:$GLOBALS['db'] = $mysqli; 或封装函数
?>
安全提示:生产环境配置文件分离、最小权限账号、启用 SSL 连接。
2. 用户列表 — userList.php
query($sql);
$users = $result->fetch_all(MYSQLI_ASSOC);
?>
会员列表
| ID | 用户名 | 密码 | 性别 | 年龄 |
出生日期 | 爱好 | 注册时间 | 最后登录 | 操作 |
| = $u['id'] ?> |
= htmlspecialchars($u['username']) ?> |
= htmlspecialchars($u['password']) ?> |
= $u['sex'] == 1 ? '男' : ($u['sex'] == 2 ? '女' : '保密') ?> |
= $u['age'] ?> |
= date('Y-m-d', $u['birthday']) ?> |
= htmlspecialchars($u['hobby']) ?> |
= date('Y-m-d', $u['add_time']) ?> |
= date('Y-m-d', $u['last_login']) ?> |
增 |
删 |
改 |
查
|
3. 编辑表单 — editUser.php (关键:预填数据 + 安全转义)
prepare("SELECT * FROM `user` WHERE `id` = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();
$stmt->close();
?>
4. 编辑处理 — editDo.php (预处理语句防注入)
prepare("UPDATE `user` SET `username`=?, `password`=?, `sex`=?, `age`=?, `birthday`=?, `hobby`=?, `profile`=? WHERE `id`=?");
$stmt->bind_param('sssiissi', $name, $pwd, $sex, $age, $birthday, $hobby, $profile, $id);
$stmt->execute();
$rows = $stmt->affected_rows;
$stmt->close();
echo "";
5. 其余模块要点
- addUser.php/addDo.php:表单结构同编辑,SQL 用
INSERT,预处理绑定参数
- detailUser.php:预处理查询单条,只读展示,无表单
- deleteUser.php:
DELETE FROM user WHERE id=?,预处理 + affected_rows 判断
关键最佳实践总结
| 维度 | 错误做法 | 最佳实践 |
| 扩展 | mysql_* 函数 | MySQLi / PDO |
| 查询 | 字符串拼接 SQL | 预处理语句 prepare/bind_param/execute |
| 编码 | set names utf8 | set_charset('utf8mb4') |
| 输出 | 直接输出变量 | htmlspecialchars() 防 XSS |
| 输入 | 直接使用 $_GET/$_POST | 类型转换 (int) + 业务校验 |
| 跳转 | JS location.href | PHP header('Location: ...') + exit |
进阶建议
- 引入单一入口
index.php + 路由分发,告别散文件
- 封装数据库操作类 (ActiveRecord/Repository 模式)
- 使用 Composer 管理依赖,引入成熟框架 (Laravel/Symfony/Slim)
- 实现 CSRF Token、密码哈希 (
password_hash)、分页查询
- 部署时关闭
display_errors,开启错误日志