PHP MySQL CRUD 操作

CRUD 是指 Create(新增)、Read(讀取)、Update(更新)、Delete(刪除)四種基本資料庫操作。

建立資料表

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

資料庫連接

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=myapp;charset=utf8mb4",
    "root",
    "secret",
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
);
?>

Create(新增)

<?php
function createUser(PDO $pdo, string $name, string $email): int {
    $sql = "INSERT INTO users (name, email) VALUES (?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$name, $email]);
    return (int) $pdo->lastInsertId();
}

// 使用
$id = createUser($pdo, 'Alice', 'alice@example.com');
echo "新增成功,ID: $id";
?>

Read(讀取)

<?php
// 取得所有使用者
function getAllUsers(PDO $pdo): array {
    return $pdo->query("SELECT * FROM users ORDER BY id")->fetchAll();
}

// 取得單一使用者
function getUserById(PDO $pdo, int $id): ?array {
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$id]);
    return $stmt->fetch() ?: null;
}

// 搜尋使用者
function searchUsers(PDO $pdo, string $keyword): array {
    $stmt = $pdo->prepare("SELECT * FROM users WHERE name LIKE ?");
    $stmt->execute(["%$keyword%"]);
    return $stmt->fetchAll();
}

// 分頁
function getUsersPaginated(PDO $pdo, int $page = 1, int $perPage = 10): array {
    $offset = ($page - 1) * $perPage;
    $stmt = $pdo->prepare("SELECT * FROM users LIMIT ? OFFSET ?");
    $stmt->execute([$perPage, $offset]);
    return $stmt->fetchAll();
}
?>

Update(更新)

<?php
function updateUser(PDO $pdo, int $id, string $name, string $email): bool {
    $sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$name, $email, $id]);
    return $stmt->rowCount() > 0;
}

// 使用
if (updateUser($pdo, 1, 'Alice Updated', 'alice.new@example.com')) {
    echo "更新成功";
} else {
    echo "沒有資料被更新";
}
?>

Delete(刪除)

<?php
function deleteUser(PDO $pdo, int $id): bool {
    $stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
    $stmt->execute([$id]);
    return $stmt->rowCount() > 0;
}

// 使用
if (deleteUser($pdo, 1)) {
    echo "刪除成功";
} else {
    echo "找不到資料";
}
?>

完整範例:使用者管理類別

<?php
class UserRepository {
    public function __construct(private PDO $pdo) {}
    
    public function findAll(): array {
        return $this->pdo->query("SELECT * FROM users")->fetchAll();
    }
    
    public function findById(int $id): ?array {
        $stmt = $this->pdo->prepare("SELECT * FROM users WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetch() ?: null;
    }
    
    public function create(array $data): int {
        $stmt = $this->pdo->prepare(
            "INSERT INTO users (name, email) VALUES (:name, :email)"
        );
        $stmt->execute([
            'name' => $data['name'],
            'email' => $data['email'],
        ]);
        return (int) $this->pdo->lastInsertId();
    }
    
    public function update(int $id, array $data): bool {
        $stmt = $this->pdo->prepare(
            "UPDATE users SET name = :name, email = :email WHERE id = :id"
        );
        $stmt->execute([
            'id' => $id,
            'name' => $data['name'],
            'email' => $data['email'],
        ]);
        return $stmt->rowCount() > 0;
    }
    
    public function delete(int $id): bool {
        $stmt = $this->pdo->prepare("DELETE FROM users WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->rowCount() > 0;
    }
}

// 使用
$repo = new UserRepository($pdo);

// 新增
$id = $repo->create(['name' => 'Alice', 'email' => 'alice@example.com']);

// 讀取
$user = $repo->findById($id);

// 更新
$repo->update($id, ['name' => 'Alice Updated', 'email' => 'alice@example.com']);

// 刪除
$repo->delete($id);
?>