PHP 原生 MySQLi 实现 CRUD 增删改查完整代码示例

Dylan
Dylan
发布时间:2026-10-16 | 4人浏览过
原创

掌握 Web 后端开发的基础往往从最简单的数据库交互开始。本文整理了一套基于 PHP 原生 MySQLi 扩展实现的增删改查(CRUD)核心代码,涵盖创建表单页、列表展示页、修改页和删除处理页,并附上相关的 SQL 建表语句,适合初学者理解前后端数据流转的基本逻辑。

结果与目标

本例旨在通过最基础的 PHP 语法和 MySQLi 函数,实现对数据库中 search 表的四种核心操作:

  • 创建 (Create):通过表单提交新记录。
  • 查询/读取 (Read):在列表中显示所有记录,并支持关联数据展示。
  • 更新 (Update):回显当前数据到表单,保存修改后的内容。
  • 删除 (Delete):根据 ID 移除指定记录。

准备条件

运行以下代码需要本地已部署好 Web 服务器环境(如 Apache/Nginx + PHP)以及 MySQL/MariaDB 数据库。

  1. 访问 phpMyAdmin 或命令行界面执行下方的 .sql 文件,这将自动创建名为 a 的数据库及其中的两张测试表。
  2. 确保 PHP 环境中启用了 mysqli 扩展。
  3. 修改代码中的数据库连接参数(主机、用户名、密码、库名)以匹配你的本地配置。

真实操作顺序

第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>
                        &nbsp;
                        <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 数据库操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表