当前位置:首页 > PHP

php 实现相册功能

2026-02-16 22:52:46PHP

数据库设计

创建相册系统需要设计数据库表来存储用户、相册和图片信息。常见的表结构包括:

  • users表:存储用户信息

    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(50) NOT NULL,
      password VARCHAR(255) NOT NULL,
      email VARCHAR(100) NOT NULL
    );
  • albums表:存储相册信息

    CREATE TABLE albums (
      id INT AUTO_INCREMENT PRIMARY KEY,
      user_id INT NOT NULL,
      title VARCHAR(100) NOT NULL,
      description TEXT,
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      FOREIGN KEY (user_id) REFERENCES users(id)
    );
  • photos表:存储图片信息

    php 实现相册功能

    CREATE TABLE photos (
      id INT AUTO_INCREMENT PRIMARY KEY,
      album_id INT NOT NULL,
      filename VARCHAR(255) NOT NULL,
      title VARCHAR(100),
      description TEXT,
      uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      FOREIGN KEY (album_id) REFERENCES albums(id)
    );

文件上传处理

实现图片上传功能需要处理文件上传表单:

// 检查是否有文件上传
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['photo'])) {
    $uploadDir = 'uploads/';
    $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
    $maxSize = 2 * 1024 * 1024; // 2MB

    $file = $_FILES['photo'];

    // 验证文件类型和大小
    if (in_array($file['type'], $allowedTypes) && $file['size'] <= $maxSize) {
        $filename = uniqid() . '_' . basename($file['name']);
        $targetPath = $uploadDir . $filename;

        if (move_uploaded_file($file['tmp_name'], $targetPath)) {
            // 保存到数据库
            $stmt = $pdo->prepare("INSERT INTO photos (album_id, filename, title) VALUES (?, ?, ?)");
            $stmt->execute([$_POST['album_id'], $filename, $_POST['title']]);
        }
    }
}

图片展示

创建相册浏览页面显示图片:

php 实现相册功能

// 获取相册中的图片
$stmt = $pdo->prepare("SELECT * FROM photos WHERE album_id = ?");
$stmt->execute([$albumId]);
$photos = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 显示图片
foreach ($photos as $photo) {
    echo '<div class="photo">';
    echo '<img src="uploads/' . htmlspecialchars($photo['filename']) . '" alt="' . htmlspecialchars($photo['title']) . '">';
    echo '<h3>' . htmlspecialchars($photo['title']) . '</h3>';
    echo '</div>';
}

缩略图生成

使用GD库生成缩略图:

function createThumbnail($sourcePath, $destPath, $thumbWidth = 200) {
    list($width, $height, $type) = getimagesize($sourcePath);

    switch ($type) {
        case IMAGETYPE_JPEG:
            $source = imagecreatefromjpeg($sourcePath);
            break;
        case IMAGETYPE_PNG:
            $source = imagecreatefrompng($sourcePath);
            break;
        case IMAGETYPE_GIF:
            $source = imagecreatefromgif($sourcePath);
            break;
        default:
            return false;
    }

    $thumbHeight = floor($height * ($thumbWidth / $width));
    $thumb = imagecreatetruecolor($thumbWidth, $thumbHeight);

    imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $width, $height);

    switch ($type) {
        case IMAGETYPE_JPEG:
            imagejpeg($thumb, $destPath);
            break;
        case IMAGETYPE_PNG:
            imagepng($thumb, $destPath);
            break;
        case IMAGETYPE_GIF:
            imagegif($thumb, $destPath);
            break;
    }

    imagedestroy($source);
    imagedestroy($thumb);

    return true;
}

安全性考虑

确保相册系统的安全性需要采取以下措施:

  • 对用户上传的文件进行严格的类型检查
  • 重命名上传的文件避免目录遍历攻击
  • 使用预处理语句防止SQL注入
  • 对输出内容进行HTML转义防止XSS攻击
  • 设置适当的文件权限
  • 实现用户认证和授权机制

分页功能

当图片数量较多时,实现分页显示:

$perPage = 12;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;

$stmt = $pdo->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM photos WHERE album_id = ? LIMIT ? OFFSET ?");
$stmt->execute([$albumId, $perPage, $offset]);
$photos = $stmt->fetchAll(PDO::FETCH_ASSOC);

$total = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();
$totalPages = ceil($total / $perPage);

// 显示分页导航
for ($i = 1; $i <= $totalPages; $i++) {
    echo '<a href="?page=' . $i . '">' . $i . '</a> ';
}

标签: 功能相册
分享给朋友:

相关文章

vue实现ping功能

vue实现ping功能

实现Ping功能的思路 在Vue中实现Ping功能通常需要借助浏览器API或后端服务。由于浏览器环境限制,无法直接发送ICMP请求(传统Ping协议),但可通过以下两种方式模拟: HTTP请求模拟P…

vue实现审核功能

vue实现审核功能

实现审核功能的基本思路 审核功能通常涉及状态管理、权限控制和操作记录。Vue中可以通过组件化设计、状态管理库(如Vuex或Pinia)和后端API配合实现。 审核状态管理 使用Vuex或Pinia存…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用。以下是 Vue 功能实现的关键方法和技术。 数据绑定与响应式 Vue 的核心特性是数据绑定和响应式系统。通过 d…

h5实现点击复制功能

h5实现点击复制功能

使用document.execCommand方法(兼容旧浏览器) 通过document.execCommand('copy')实现复制功能,需先选中文本内容。创建一个隐藏的textarea或input…

vue实现付费功能

vue实现付费功能

Vue 实现付费功能的方法 集成第三方支付平台 选择适合的第三方支付平台(如支付宝、微信支付、Stripe、PayPal等),并按照其文档进行集成。在 Vue 项目中,可以通过引入支付平台的 SDK…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…