PHP 原生 MySQLi 实现 CRUD 增删改查完整代码示例
掌握 Web 后端开发的基础往往从最简单的数据库交互开始。本文整理了一套基于 PHP 原生 MySQLi 扩展实现的增删改查(CRUD)核心代码,涵盖创建表单页、列表展示页、修改页和删除处理页,并附上相关的 SQL 建表语句,适合初学者理解前后端数据流转的基本逻辑。
结果与目标
本例旨在通过最基础的 PHP 语法和 MySQLi 函数,实现对数据库中 search 表的四种核心操作:
- 创建 (Create):通过表单提交新记录。
- 查询/读取 (Read):在列表中显示所有记录,并支持关联数据展示。
- 更新 (Update):回显当前数据到表单,保存修改后的内容。
- 删除 (Delete):根据 ID 移除指定记录。
准备条件
运行以下代码需要本地已部署好 Web 服务器环境(如 Apache/Nginx + PHP)以及 MySQL/MariaDB 数据库。
- 访问 phpMyAdmin 或命令行界面执行下方的
.sql文件,这将自动创建名为a的数据库及其中的两张测试表。 - 确保 PHP 环境中启用了
mysqli扩展。 - 修改代码中的数据库连接参数(主机、用户名、密码、库名)以匹配你的本地配置。
真实操作顺序
第1步:初始化数据库结构
首先需要建立数据模型。本例涉及两个表:search 用于存储主要内容,type 作为字典表用于下拉选择。执行以下 SQL 脚本:
-- Database: a
CREATE TABLE `search` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`content` text COLLATE utf8_vietnamese_ci NOT NULL,
`type` varchar(100) COLLATE utf8_vietnamese_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(12) COLLATE utf8_vietnamese_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入初始字典数据
INSERT INTO `type` VALUES (1, '安踏'), (2, '特步');
-- 插入初始测试数据
INSERT INTO `search` (`content`, `type`) VALUES ('aaa', '特步'), ('陈业贵喜欢安踏', '安踏');
执行后,即可在数据库中看到预设的数据表。
第2步:构建列表页(index.php)
列表页是数据的入口,负责读取 search 表的所有内容并以表格形式呈现,同时提供“创建”、“更新”和“删除”的操作入口。主要逻辑分为两部分:PHP 获取数据与 HTML 渲染。
<?php
// 数据库连接配置
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
// 执行查询
$sql = "SELECT * FROM search";
$result = mysqli_query($link, $sql);
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>数据列表</title>
<style>table { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #ddd; padding: 8px; text-align: center; }</style>
</head>
<body>
<table>
<thead>
<tr><th>ID</th><th>内容</th><th>分类</th><th>操作</th></tr>
</thead>
<tbody>
<?php
if ($result && mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
?>
<tr>
<td><?php echo htmlspecialchars($row['id']); ?></td>
<td><?php echo htmlspecialchars($row['content']); ?></td>
<td><?php echo htmlspecialchars($row['type']); ?></td>
<td>
<a href="update.php?id=<?php echo $row['id']; ?>">更新</a>
<a href="delete.php?id=<?php echo $row['id']; ?>" onclick="return confirm('确定删除吗?')">删除</a>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
<br>
<a href="create.php">+ 新建条目</a>
</body>
</html>
第3步:实现新增功能(create.php)
该页面包含一个表单,用户输入内容并选择类型后提交。后端接收 POST 数据并执行 INSERT 操作。为了提高安全性,对输入值进行了基本的非空判断。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$content = isset($_POST['content']) ? $_POST['content'] : '';
$type = isset($_POST['type']) ? $_POST['type'] : '';
// 简单的防错校验
if (!empty($content) && $type != '-1') {
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
// 注意:此处为简化演示直接使用字符串拼接,生产环境请使用预处理语句
$sql = "INSERT INTO search(content, type) VALUES ('$content', '$type')";
$result = mysqli_query($link, $sql);
if ($result) {
echo "<script>alert('创建成功');location.href='index.php';</script>";
} else {
die("Error: " . mysqli_error($link));
}
}
}
?>
<html>
<head><title>新建</title></head>
<body>
<form method="POST" action="create.php">
<p>内容:<input type="text" name="content"/></p>
<p>分类:
<select name="type">
<option value="-1">请选择</option>
<?php
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
$re = mysqli_query($link, "SELECT * FROM type");
while ($arr = mysqli_fetch_array($re)) {
echo "<option value='{$arr['type']}'>{$arr['type']}</option>";
}
?>
</select>
</p>
<button type="submit">创建</button>
</form>
<a href="index.php">返回列表</a>
</body>
</html>
第4步:实现更新功能(update.php)
更新页面逻辑较为复杂:首次加载时,需读取 ID 对应的原始数据填入表单;提交时,则验证数据完整性并执行 UPDATE 语句。
<?php
// 初始化变量
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$originalContent = '';
$selectedType = '';
// 如果是以 GET 方式请求且带有 id,则为回显数据模式
if ($id > 0) {
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
$sql = "SELECT * FROM search WHERE id = $id";
$res = mysqli_query($link, $sql);
if ($row = mysqli_fetch_assoc($res)) {
$originalContent = $row['content'];
$selectedType = $row['type'];
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST' || isset($_POST['id'])) {
// 处理表单提交(本例保留 URL 传参以简化,实际上建议改为表单隐藏字段 post 提交)
$content = $_GET['content'] ?? '';
$type = $_GET['type'] ?? '-1';
$id = $_GET['id'] ?? 0;
if (!empty($content) && $type != '-1' && $id > 0) {
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
$sql = "UPDATE search SET content='$content', type='$type' WHERE id=$id";
mysqli_query($link, $sql);
echo "<script>alert('更新成功');location.href='index.php';</script>";
}
}
?>
<html>
<head><title>编辑</title></head>
<body>
<form action="update.php" method="GET">
<input type="hidden" name="id" value="<?php echo $id; ?>">
<p>内容:<input type="text" name="content" value="<?php echo htmlspecialchars($originalContent); ?>" /></p>
<p>分类:
<select name="type">
<?php
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
$re = mysqli_query($link, "SELECT * FROM type");
while ($arr = mysqli_fetch_array($re)) {
$attr = ($arr['type'] == $selectedType) ? ' selected' : '';
echo "<option value='{$arr['type']}'$attr>{$arr['type']}</option>";
}
?>
</select>
</p>
<button type="submit">修改</button>
</form>
<a href="index.php">返回列表</a>
</body>
</html>
第5步:实现删除功能(delete.php)
删除是一个敏感操作,通常通过 URL 传入 ID,后端接收后立即执行 DELETE 语句并返回原列表。为了用户体验,增加了一次 JavaScript 弹窗确认。
<?php
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
if ($id > 0) {
$link = mysqli_connect('localhost', 'root', '', 'a');
mysqli_set_charset($link, 'utf8');
// 安全提示:这里使用了整型强制转换 intval 保护 id 不被注入
$sql = "DELETE FROM search WHERE id = $id";
$result = mysqli_query($link, $sql);
if ($result) {
echo "<script>alert('恭喜你,删除成功了');location.href='index.php';</script>";
} else {
echo "<script>alert('删除失败');location.href='index.php';</script>";
}
}
?>
关键注意事项
上述代码展示了最直观的数据库操作流程,但在将此类逻辑应用到生产环境前,必须进行以下安全加固:
1. 预处理语句(Prepared Statements):原文直接使用 '$_GET[id]' 拼接 SQL,极易遭受 SQL 注入攻击。务必改用 $stmt = $mysqli->prepare(); $stmt->bind_param(); 的方式。
2. XSS 过滤:输出到页面的内容必须使用 htmlspecialchars() 进行转义,防止恶意脚本注入。
3. 异常处理:应开启 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 以便捕获数据库错误信息,而不是直接中断脚本。
以上就是基于 PHP 原生 MySQLi 实现增删改查的详细内容,更多关于 PHP 数据库操作的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









