您好,登录后才能下订单哦!
# 如何利用PHP+MySQL实现增删改查
## 前言
在Web开发领域,PHP和MySQL的组合堪称经典。据统计,全球约78%的网站采用PHP作为服务器端编程语言,而MySQL则是最受欢迎的开源关系型数据库之一。本文将全面讲解如何使用PHP和MySQL实现基础的CRUD(Create, Read, Update, Delete)操作,涵盖从环境搭建到安全优化的完整流程。
## 目录
1. [环境准备](#环境准备)
2. [数据库设计](#数据库设计)
3. [创建数据库连接](#创建数据库连接)
4. [实现增删改查功能](#实现增删改查功能)
   - 4.1 [创建数据(Create)](#创建数据create)
   - 4.2 [读取数据(Read)](#读取数据read)
   - 4.3 [更新数据(Update)](#更新数据update)
   - 4.4 [删除数据(Delete)](#删除数据delete)
5. [完整示例代码](#完整示例代码)
6. [安全优化建议](#安全优化建议)
7. [常见问题解答](#常见问题解答)
## 环境准备
### 开发环境要求
- PHP 7.4+(推荐8.0+)
- MySQL 5.7+(推荐8.0+)
- Web服务器(Apache/Nginx)
- phpMyAdmin(可选)
### 环境搭建步骤
#### 1. 安装XAMPP/WAMP
对于Windows用户:
```bash
# 下载XAMPP安装包
https://www.apachefriends.org/download.html
对于Mac用户:
# 使用Homebrew安装
brew install --cask xampp
创建测试文件info.php:
<?php
phpinfo();
?>
访问http://localhost/info.php应显示PHP配置信息
我们以”学生管理系统”为例:
CREATE DATABASE student_management;
USE student_management;
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    phone VARCHAR(20),
    course VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
| 字段名 | 类型 | 描述 | 
|---|---|---|
| id | INT | 自增主键 | 
| name | VARCHAR(100) | 学生姓名 | 
| VARCHAR(100) | 唯一电子邮箱 | |
| phone | VARCHAR(20) | 联系电话 | 
| course | VARCHAR(50) | 选修课程 | 
| created_at | TIMESTAMP | 记录创建时间 | 
<?php
$host = 'localhost';
$dbname = 'student_management';
$username = 'root';
$password = '';
try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    echo "数据库连接成功";
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
?>
<?php
$conn = new mysqli('localhost', 'root', '', 'student_management');
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
$conn->set_charset("utf8");
?>
<form action="create.php" method="post">
    <div>
        <label>姓名:</label>
        <input type="text" name="name" required>
    </div>
    <div>
        <label>邮箱:</label>
        <input type="email" name="email" required>
    </div>
    <div>
        <label>电话:</label>
        <input type="tel" name="phone">
    </div>
    <div>
        <label>课程:</label>
        <select name="course">
            <option value="计算机科学">计算机科学</option>
            <option value="数学">数学</option>
            <option value="物理">物理</option>
        </select>
    </div>
    <button type="submit">提交</button>
</form>
<?php
require 'db_connection.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $phone = $_POST['phone'] ?? null;
    $course = $_POST['course'];
    
    try {
        $stmt = $pdo->prepare("INSERT INTO students (name, email, phone, course) 
                               VALUES (:name, :email, :phone, :course)");
        
        $stmt->execute([
            ':name' => $name,
            ':email' => $email,
            ':phone' => $phone,
            ':course' => $course
        ]);
        
        echo "记录添加成功!ID: " . $pdo->lastInsertId();
    } catch (PDOException $e) {
        die("添加记录失败: " . $e->getMessage());
    }
}
?>
<?php
require 'db_connection.php';
try {
    $stmt = $pdo->query("SELECT * FROM students ORDER BY created_at DESC");
    $students = $stmt->fetchAll();
    
    if (count($students) > 0) {
        foreach ($students as $student) {
            echo "ID: {$student['id']}, 姓名: {$student['name']}, 邮箱: {$student['email']}<br>";
        }
    } else {
        echo "没有找到记录";
    }
} catch (PDOException $e) {
    die("查询失败: " . $e->getMessage());
}
?>
<?php
$perPage = 10;
$page = $_GET['page'] ?? 1;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT * FROM students ORDER BY id DESC LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$students = $stmt->fetchAll();
// 获取总记录数
$total = $pdo->query("SELECT COUNT(*) FROM students")->fetchColumn();
$totalPages = ceil($total / $perPage);
?>
<?php
if (isset($_GET['id'])) {
    $stmt = $pdo->prepare("SELECT * FROM students WHERE id = ?");
    $stmt->execute([$_GET['id']]);
    $student = $stmt->fetch();
    
    if ($student) {
        ?>
        <form action="update.php" method="post">
            <input type="hidden" name="id" value="<?= $student['id'] ?>">
            <div>
                <label>姓名:</label>
                <input type="text" name="name" value="<?= htmlspecialchars($student['name']) ?>" required>
            </div>
            <!-- 其他字段... -->
            <button type="submit">更新</button>
        </form>
        <?php
    }
}
?>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $id = $_POST['id'];
    $name = $_POST['name'];
    // 其他字段...
    
    try {
        $stmt = $pdo->prepare("UPDATE students SET 
                              name = :name, 
                              email = :email,
                              phone = :phone,
                              course = :course
                              WHERE id = :id");
                              
        $stmt->execute([
            ':id' => $id,
            ':name' => $name,
            ':email' => $_POST['email'],
            ':phone' => $_POST['phone'] ?? null,
            ':course' => $_POST['course']
        ]);
        
        echo "记录更新成功!";
    } catch (PDOException $e) {
        die("更新失败: " . $e->getMessage());
    }
}
?>
<?php
if (isset($_GET['id'])) {
    try {
        $stmt = $pdo->prepare("DELETE FROM students WHERE id = ?");
        $stmt->execute([$_GET['id']]);
        
        if ($stmt->rowCount() > 0) {
            echo "记录删除成功";
        } else {
            echo "没有找到该记录";
        }
    } catch (PDOException $e) {
        die("删除失败: " . $e->getMessage());
    }
}
?>
修改表结构:
ALTER TABLE students ADD COLUMN is_deleted TINYINT DEFAULT 0;
更新删除操作:
$stmt = $pdo->prepare("UPDATE students SET is_deleted = 1 WHERE id = ?");
查询时:
SELECT * FROM students WHERE is_deleted = 0
<?php
// config.php
define('DB_HOST', 'localhost');
define('DB_NAME', 'student_management');
define('DB_USER', 'root');
define('DB_PASS', '');
// db_connection.php
try {
    $pdo = new PDO(
        "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8",
        DB_USER,
        DB_PASS
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
// index.php
require 'db_connection.php';
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['delete'])) {
        // 删除操作
    } elseif (isset($_POST['id'])) {
        // 更新操作
    } else {
        // 新增操作
    }
}
// 获取所有学生
$stmt = $pdo->query("SELECT * FROM students WHERE is_deleted = 0 ORDER BY id DESC");
$students = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html>
<head>
    <title>学生管理系统</title>
    <style>
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 8px; border: 1px solid #ddd; text-align: left; }
    </style>
</head>
<body>
    <h1>学生列表</h1>
    
    <!-- 添加表单 -->
    <form method="post">
        <input type="text" name="name" placeholder="姓名" required>
        <input type="email" name="email" placeholder="邮箱" required>
        <button type="submit">添加</button>
    </form>
    
    <!-- 学生表格 -->
    <table>
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <?php foreach ($students as $student): ?>
        <tr>
            <td><?= $student['id'] ?></td>
            <td><?= htmlspecialchars($student['name']) ?></td>
            <td><?= htmlspecialchars($student['email']) ?></td>
            <td>
                <a href="edit.php?id=<?= $student['id'] ?>">编辑</a>
                <form method="post" style="display:inline;">
                    <input type="hidden" name="id" value="<?= $student['id'] ?>">
                    <button type="submit" name="delete">删除</button>
                </form>
            </td>
        </tr>
        <?php endforeach; ?>
    </table>
</body>
</html>
$email = filter_var($_POST['email'], FILTER_VALIDATE_EML);
if (!$email) {
    die("无效的邮箱格式");
}
// 存储密码
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
// 验证密码
if (password_verify($inputPassword, $hashedPassword)) {
    // 验证成功
}
// 生成令牌
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 验证令牌
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    die("CSRF验证失败");
}
// 生产环境设置
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/php-error.log');
可能原因: 1. MySQL服务未运行 2. 错误的用户名/密码 3. 防火墙阻止连接 4. PHP未安装MySQL扩展
解决方案:
# 检查MySQL服务状态
sudo systemctl status mysql
# 检查PHP扩展
php -m | grep pdo_mysql
优化建议: 1. 添加适当的索引
ALTER TABLE students ADD INDEX idx_email (email);
# 使用mysqldump
mysqldump -u username -p database_name > backup.sql
# 恢复备份
mysql -u username -p database_name < backup.sql
比较:
| 特性 | PDO | MySQLi | 
|---|---|---|
| 数据库支持 | 多种数据库 | 仅MySQL | 
| 预处理语句 | 命名参数 | 位置参数 | 
| 面向对象 | 完全支持 | 支持 | 
| 存储过程 | 有限支持 | 更好支持 | 
建议: 新项目推荐使用PDO,需要MySQL特有功能时考虑MySQLi
通过本文的学习,您应该已经掌握了使用PHP和MySQL实现基本CRUD操作的核心技术。在实际开发中,建议进一步学习: 1. 使用MVC架构组织代码 2. 掌握Composer和现代PHP框架 3. 学习数据库优化和索引原理 4. 了解RESTful API设计
PHP和MySQL的组合虽然传统但依然强大,掌握好这些基础技能将为您的Web开发之路奠定坚实基础。
本文共计约8950字,涵盖从基础到进阶的PHP+MySQL开发知识。如需更深入探讨某个主题,可以参考PHP官方文档(https://www.php.net/docs.php)和MySQL官方文档(https://dev.mysql.com/doc/)。 “`
注:实际字数可能因格式和显示方式略有差异。如需精确字数控制,建议在Markdown编辑器中检查最终输出。本文提供了完整的技术实现方案,包含了代码示例、安全建议和常见问题解答,适合初中级开发者学习参考。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。