CRUD操作
什么是CRUD
CRUD是数据库操作的四个基本功能:
- Create(创建):插入新数据
- Read(读取):查询数据
- Update(更新):修改现有数据
- Delete(删除):删除数据
准备工作
创建示例数据表
<?php
// 创建用户表的SQL语句
$createTableSQL = "
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
age INT NOT NULL,
status ENUM('active', 'inactive') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)";
// 执行创建表的SQL
$pdo->exec($createTableSQL);
echo "用户表创建成功!";
?>
CREATE(创建数据)
基本插入操作
<?php
// 使用预处理语句(推荐)
function insertUser($pdo, $username, $email, $age, $status = 'active') {
$sql = "INSERT INTO users (username, email, age, status) VALUES (?, ?, ?, ?)";
try {
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $email, $age, $status]);
// 返回插入的ID
return $pdo->lastInsertId();
} catch (PDOException $e) {
echo "插入失败: " . $e->getMessage();
return false;
}
}
// 使用示例
$userId = insertUser($pdo, 'zhangsan', 'zhangsan@example.com', 25);
if ($userId) {
echo "用户插入成功,ID: $userId";
}
?>
使用命名参数
<?php
function insertUserWithNamedParams($pdo, $userData) {
$sql = "INSERT INTO users (username, email, age, status)
VALUES (:username, :email, :age, :status)";
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($userData);
return $pdo->lastInsertId();
} catch (PDOException $e) {
echo "插入失败: " . $e->getMessage();
return false;
}
}
// 使用示例
$userData = [
'username' => 'lisi',
'email' => 'lisi@example.com',
'age' => 30,
'status' => 'active'
];
$userId = insertUserWithNamedParams($pdo, $userData);
echo "用户插入成功,ID: $userId";
?>
READ(读取数据)
查询单条记录
<?php
// 根据ID查询用户
function getUserById($pdo, $id) {
$sql = "SELECT * FROM users WHERE id = ?";
try {
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
return $stmt->fetch();
} catch (PDOException $e) {
echo "查询失败: " . $e->getMessage();
return false;
}
}
// 使用示例
$user = getUserById($pdo, 1);
if ($user) {
echo "用户名: " . $user['username'] . "<br>";
echo "邮箱: " . $user['email'] . "<br>";
}
?>
查询多条记录
<?php
// 查询所有用户
function getAllUsers($pdo) {
$sql = "SELECT * FROM users ORDER BY created_at DESC";
try {
$stmt = $pdo->query($sql);
return $stmt->fetchAll();
} catch (PDOException $e) {
echo "查询失败: " . $e->getMessage();
return [];
}
}
// 分页查询
function getUsersWithPagination($pdo, $page = 1, $limit = 10) {
$offset = ($page - 1) * $limit;
$sql = "SELECT * FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$limit, $offset]);
$users = $stmt->fetchAll();
$countSql = "SELECT COUNT(*) as total FROM users";
$total = $pdo->query($countSql)->fetch()['total'];
return [
'users' => $users,
'total' => $total,
'page' => $page,
'total_pages' => ceil($total / $limit)
];
}
// 使用示例
$users = getAllUsers($pdo);
foreach ($users as $user) {
echo "ID: {$user['id']}, 用户名: {$user['username']}<br>";
}
?>
UPDATE(更新数据)
<?php
// 更新用户信息
function updateUser($pdo, $id, $data) {
$setParts = [];
$params = [];
foreach (['username', 'email', 'age', 'status'] as $field) {
if (isset($data[$field])) {
$setParts[] = "$field = ?";
$params[] = $data[$field];
}
}
if (empty($setParts)) {
return false;
}
$sql = "UPDATE users SET " . implode(', ', $setParts) . " WHERE id = ?";
$params[] = $id;
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt->rowCount();
} catch (PDOException $e) {
echo "更新失败: " . $e->getMessage();
return false;
}
}
// 使用示例
$updateData = [
'email' => 'newemail@example.com',
'age' => 26
];
$affectedRows = updateUser($pdo, 1, $updateData);
echo "更新了 $affectedRows 行记录";
?>
DELETE(删除数据)
<?php
// 根据ID删除用户
function deleteUser($pdo, $id) {
$sql = "DELETE FROM users WHERE id = ?";
try {
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
return $stmt->rowCount();
} catch (PDOException $e) {
echo "删除失败: " . $e->getMessage();
return false;
}
}
// 软删除(推荐)
function softDeleteUser($pdo, $id) {
$sql = "UPDATE users SET status = 'deleted' WHERE id = ?";
try {
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
return $stmt->rowCount();
} catch (PDOException $e) {
echo "软删除失败: " . $e->getMessage();
return false;
}
}
// 使用示例
$deletedRows = deleteUser($pdo, 1);
echo "删除了 $deletedRows 行记录";
?>
综合示例
用户管理类
<?php
class UserManager {
private $pdo;
public function __construct($pdo) {
$this->pdo = $pdo;
}
// 创建用户
public function create($userData) {
$sql = "INSERT INTO users (username, email, age, status)
VALUES (:username, :email, :age, :status)";
try {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($userData);
return $this->pdo->lastInsertId();
} catch (PDOException $e) {
throw new Exception("创建用户失败: " . $e->getMessage());
}
}
// 读取用户
public function read($id) {
$sql = "SELECT * FROM users WHERE id = :id";
try {
$stmt = $this->pdo->prepare($sql);
$stmt->execute(['id' => $id]);
return $stmt->fetch();
} catch (PDOException $e) {
throw new Exception("读取用户失败: " . $e->getMessage());
}
}
// 更新用户
public function update($id, $userData) {
$setParts = [];
foreach ($userData as $field => $value) {
$setParts[] = "$field = :$field";
}
$sql = "UPDATE users SET " . implode(', ', $setParts) . " WHERE id = :id";
$userData['id'] = $id;
try {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($userData);
return $stmt->rowCount();
} catch (PDOException $e) {
throw new Exception("更新用户失败: " . $e->getMessage());
}
}
// 删除用户
public function delete($id) {
$sql = "DELETE FROM users WHERE id = :id";
try {
$stmt = $this->pdo->prepare($sql);
$stmt->execute(['id' => $id]);
return $stmt->rowCount();
} catch (PDOException $e) {
throw new Exception("删除用户失败: " . $e->getMessage());
}
}
}
// 使用示例
$userManager = new UserManager($pdo);
// 创建用户
$userId = $userManager->create([
'username' => 'testuser',
'email' => 'test@example.com',
'age' => 25,
'status' => 'active'
]);
// 读取用户
$user = $userManager->read($userId);
// 更新用户
$userManager->update($userId, ['age' => 26]);
?>
通过本节的学习,你应该掌握了使用PDO进行CRUD操作的基本技巧。下一节我们将深入学习预处理语句的高级用法。