PHP实现增删改查(CRUD)完整指南
在Web开发中,增删改查(CRUD,Create、Read、Update、Delete)是最核心的操作,几乎所有的后台管理系统、数据交互功能都离不开它,PHP作为流行的后端语言,通过结合MySQL(或其他数据库)可以轻松实现CRUD功能,本文将从环境准备、数据库设计到具体代码实现,手把手教你用PHP完成增删改查操作。
环境准备与数据库设计
在开始编码前,需确保本地开发环境已配置好:PHP(建议7.4+) + MySQL(5.7+) + Web服务器(如Apache/Nginx),推荐使用集成环境(如XAMPP、MAMP)快速搭建。
创建数据库与数据表
以用户管理为例,我们先创建一个test_db
数据库,并添加users
表:
-- 创建数据库 CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用数据库 USE test_db; -- 创建用户表 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID', username VARCHAR(50) NOT NULL COMMENT '用户名', email VARCHAR(100) NOT NULL COMMENT '邮箱', age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', UNIQUE KEY uk_email (email) COMMENT '邮箱唯一约束' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
表结构说明:id
为主键自增,username
和email
为必填字段,age
为可选字段,created_at
和updated_at
自动记录创建和更新时间。
数据库连接配置
创建config.php
文件,统一管理数据库连接信息:
<?php // config.php - 数据库配置 define('DB_HOST', 'localhost'); // 数据库主机 define('DB_USER', 'root'); // 数据库用户名 define('DB_PASS', ''); // 数据库密码(根据环境修改) define('DB_NAME', 'test_db'); // 数据库名 // 创建数据库连接 $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); // 检查连接是否成功 if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 设置字符集为utf8mb4,支持存储emoji等特殊字符 $conn->set_charset("utf8mb4"); ?>
实现“增”(Create):添加数据
创建添加页面(add.php)
<?php require_once 'config.php'; // 引入数据库连接 // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取表单数据(使用htmlspecialchars防止XSS攻击) $username = htmlspecialchars(trim($_POST['username'])); $email = htmlspecialchars(trim($_POST['email'])); $age = intval($_POST['age']); // 转为整数,防止SQL注入 // 数据验证(简单示例,实际开发需更严格验证) if (empty($username) || empty($email)) { die("用户名和邮箱不能为空!"); } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { die("邮箱格式不正确!"); } // 准备SQL语句(使用预处理语句防止SQL注入) $sql = "INSERT INTO users (username, email, age) VALUES (?, ?, ?)"; $stmt = $conn->prepare($sql); if ($stmt === false) { die("SQL预处理失败: " . $conn->error); } // 绑定参数(ssi: string, string, integer) $stmt->bind_param("ssi", $username, $email, $age); // 执行SQL if ($stmt->execute()) { echo "数据添加成功!<a href='index.php'>查看列表</a>"; } else { echo "添加失败: " . $stmt->error; } // 关闭预处理语句 $stmt->close(); } ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">添加用户</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } .form-group { margin-bottom: 15px; } label { display: inline-block; width: 80px; } input { padding: 5px; width: 200px; } button { padding: 5px 15px; background: #007bff; color: white; border: none; cursor: pointer; } </style> </head> <body> <h2>添加用户</h2> <form method="POST" action=""> <div class="form-group"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required> </div> <div class="form-group"> <label for="email">邮箱:</label> <input type="email" id="email" name="email" required> </div> <div class="form-group"> <label for="age">年龄:</label> <input type="number" id="age" name="age" min="0" max="150"> </div> <button type="submit">提交</button> <a href="index.php"><button type="button">返回列表</button></a> </form> </body> </html>
关键点说明
- 表单提交:通过
$_SERVER['REQUEST_METHOD'] === 'POST'
判断是否为POST请求。 - 数据过滤:使用
trim()
去除空格,htmlspecialchars()
防止XSS攻击,filter_var()
验证邮箱格式。 - 预处理语句:
prepare()
+bind_param()
+execute()
组合,避免SQL注入(核心安全措施)。 - 参数绑定:
"ssi"
表示参数类型(string, string, integer),需与变量类型一致。
实现“查”(Read):查询数据
查询列表页(index.php)
<?php require_once 'config.php'; // 获取分页参数(默认第1页,每页10条) $page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; $pageSize = 10; $offset = ($page - 1) * $pageSize; // 查询总记录数(用于分页) $totalSql = "SELECT COUNT(*) AS total FROM users"; $totalResult = $conn->query($totalSql); $totalRow = $totalResult->fetch_assoc()['total']; $totalPages = ceil($totalRow / $pageSize); // 查询当前页数据(按id降序) $sql = "SELECT id, username, email, age, created_at FROM users ORDER BY id DESC LIMIT ?, ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("ii", $offset, $pageSize); $stmt->execute(); $result = $stmt->get_result(); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">用户列表</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } table { width: 100%; border-collapse: collapse; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .actions a { margin-right: 10px; text-decoration: none; } .edit { color: #007bff; } .delete { color: #dc3545; } .pagination { margin-top: 20px; } .pagination a, .pagination span { padding: 5px 10px; margin: 0 2px; text-decoration: none; border: 1px solid #ddd; } .pagination a:hover { background: #f2f2f2; } .pagination .current { background: #007bff; color: white; border-color: #007bff; } </style> </head> <body> <h2>用户列表</h2> <a href="add.php">添加用户</a> <table> <thead> <tr> <th>ID</th> <th>用户名</th> <th>邮箱</th> <th>年龄</th> <th>创建时间</th> <th>操作</th> </tr> </thead> <tbody> <?php if ($result->num_rows > 0): ?> <?php while ($row = $result->fetch_assoc()): ?> <tr> <td><?= $row
还没有评论,来说两句吧...