数据库准备
CREATE DATABASE `test` CHARSET utf8mb4;
USE `test`;
CREATE TABLE `user` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
统一数据库连接 — db.php
connect_errno) {
die('DB Connect Failed: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
列表页 — list.php (Read)
query("SELECT * FROM `user`");
?>
用户列表
| 用户名 | 密码哈希 | 操作 |
fetch_assoc()): ?>
| = htmlspecialchars($row['username']) ?> |
= htmlspecialchars($row['password']) ?> |
删除 |
修改
|
添加新用户
添加 — insert.php (表单) + insertDo.php (处理)
prepare("INSERT INTO `user` (`username`, `password`) VALUES (?, ?)");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
echo $stmt->affected_rows ? "添加成功 (ID: {$mysqli->insert_id})" : "添加失败: {$stmt->error}";
$stmt->close();
删除 — delete.php
prepare("DELETE FROM `user` WHERE `id` = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
echo $stmt->affected_rows ? "删除成功" : "删除失败或不存在";
$stmt->close();
修改 — update.php (表单) + updateDo.php (处理)
prepare("SELECT * FROM `user` WHERE `id` = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();
$stmt->close();
?>
prepare("UPDATE `user` SET `username`=?, `password`=? WHERE `id`=?");
$stmt->bind_param('ssi', $username, $password, $id);
} else {
$stmt = $mysqli->prepare("UPDATE `user` SET `username`=? WHERE `id`=?");
$stmt->bind_param('si', $username, $id);
}
$stmt->execute();
echo $stmt->affected_rows ? "更新成功" : "更新失败或无变化";
$stmt->close();
安全与工程化关键点
- 预处理语句:所有 SQL 使用
prepare/bind_param,彻底防注入
- 密码哈希:
password_hash() + password_verify(),禁用明文/MD5
- 输出转义:
htmlspecialchars() 防 XSS
- 输入校验:
(int) 强制类型、required 前端校验、后端长度/格式校验
- 错误处理:
$stmt->error 记录日志,生产环境不直接输出
- 字符集:
utf8mb4 支持完整 Unicode
进阶重构方向
- 封装
UserRepository 类,隔离 SQL 细节
- 引入 PDO 替代 MySQLi,支持多数据库
- 单一入口
index.php + 简单路由
- CSRF Token 保护表单提交
- 分页查询
LIMIT ?, ?
- Composer 自动加载 + 规范目录结构