当前位置:首页 > 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表:存储图片信息

    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']]);
        }
    }
}

图片展示

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

// 获取相册中的图片
$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> ';
}

php 实现相册功能

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

相关文章

vue实现功能插件

vue实现功能插件

Vue 插件实现方法 Vue 插件通常用于封装全局功能(如指令、过滤器、混入等),以下是实现 Vue 插件的典型方式: 插件基本结构 const MyPlugin = { instal…

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备 准备需要筛选的数据源,通常是一个数组,可以存储在Vue组件的…

vue实现倍速播放功能

vue实现倍速播放功能

实现倍速播放功能的方法 在Vue中实现倍速播放功能通常涉及HTML5的<video>元素或第三方播放器库(如video.js)的API调用。以下是具体实现方式: 使用原生HTML5 vi…

vue实现产品使用功能

vue实现产品使用功能

Vue 实现产品功能的关键方法 组件化开发 使用Vue的单文件组件(.vue)将产品功能模块化,每个功能拆分为独立组件。例如产品列表、详情页、购物车等可分别封装为ProductList.vue、Pro…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

vue实现按钮实现点击功能

vue实现按钮实现点击功能

实现按钮点击功能 在Vue中实现按钮点击功能可以通过v-on指令或@缩写来绑定事件。以下是几种常见的实现方式: 使用v-on指令 通过v-on:click绑定点击事件,触发定义在methods中的…