【问题标题】:creating a photo album gallery创建相册库
【发布时间】:2023-12-23 16:46:01
【问题描述】:

我已经创建了一个照片库,用户可以在其中上传图片,但我正在努力让用户可以创建相册来存储他们的图片。

这个过程是这样工作的。

  1. 用户首先创建一个相册(相册是这样存储在相册表中的)

  1. 然后用户将图像上传到相册。 (图像被存储 在这样的画廊表中)

我想要完成的是根据它们所在的相册加载图像。像这样。

因此,在“测试相册 1”上,我只希望加载该相册中的照片,并且与“测试相册 2”相同。

我创建了一个 album.php 页面,我希望根据它们所在的专辑加载图像。 对于图中显示的两个链接,我这样称呼它们。基于专辑表。

<a href="../gallery/album.php?=<?php echo escape ($ga->album_id);?>">

现在这是我缺乏经验/知识的地方。我需要将两个表连接在一起,但我不知道如何正确编写此查询。

我要查询专辑表album_id,并与图库表连接。

这是我目前的查询,需要帮助。

  $gallery = DB::getInstance()->query("SELECT
albums.album_id,
gallery.id,
gallery.added,
gallery.album,
gallery.title,
gallery.description,
gallery.file_name
FROM
albums
LEFT JOIN gallery ON albums.album_id = gallery.id WHERE gallery.album = albums.album_id ORDER BY gallery.id DESC LIMIT $start, $limit");

然后我这样称呼我的图像。

foreach($gallery->results() as $g){
    ?>
    <li>
    <a class="fancybox" rel="<?php echo escape($g->album); ?>"
    href="../images/gallery/<?php echo escape($g->file_name); ?>">
    <img src="../images/gallery/<?php echo escape($g->file_name); ?>" class="max-img-border"></a>
    <div class="galleryh"><?php echo escape($g->title); ?></div>
    <div class="galleryp"><?php echo escape($g->description); ?></div>
</li>

    <?php
}
?>

如果我能弄清楚如何正确编写该 JOIN 查询,我会很高兴。 任何解决方案将不胜感激。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您需要将album_id 添加到图库表中。

    此字段将是链接到专辑表的外键。

    这将允许您在没有 JOIN 的情况下查询表,同时为您提供数据完整性。

    这假设您希望每张图片一张专辑。

    【讨论】:

    • 我希望用户先创建一个相册,然后他们可以根据需要向该相册添加任意数量的图像。
    • 所以先插入相册,并在用户上传之前将相册设为必填,并读取album_id值以便插入
    • 我现在的设置是需要管理员/版主才能首先创建相册。然后它将他们引导到图像上传页面,并且有一个选择菜单可以选择他们想要将图像转储到哪个相册中。这一切都是在网站某些成员的私人部分完成的。普通用户然后将进入公共画廊页面,可以看到上传的所有图像,如上图所示。我只需要存档每张专辑。因此,公众用户可以根据需要查看特定事件的图像。我想我现在明白了。只需要研究外键。
    【解决方案2】:

    一些建议:

    你需要决定

    • 所有图像是否仅存储在一个相册中。
    • 每张图片至少分配一个相册
    • 图片可能是“孤儿” - 目前没有分配相册
    • 相册可能为空

    设置类似的RDS方案

      album ---(1:n)---> image (where n = 0 - infinite)
    

      album <---(n:n) ---> image
    

      image ----(n:0) ----> album (!!)
    

    下一步:

    • 你的加入匹配... WHERE gallery.album = albums.album_id ...

    gallery.album 包含专辑标题 (varchar) 和 album.album_id 一个 id(自动索引?)。那是行不通的,也不是最佳实践:专辑和画廊图片之间的链接必须是专辑 ID,否则以后很难重命名专辑。

    我没有进一步检查,因为这些是首先要整理的基础知识。

    【讨论】:

      【解决方案3】:

      我会使用 ID 号来跨表引用。 但是这个专辑标题应该可以正常工作。只是如果您允许用户稍后更改专辑名称,您必须更新所有画廊行,而不仅仅是该专辑的专辑标题。id

      试试

      SELECT
      albums.album_title,
      gallery.id,
      gallery.added,
      gallery.album,
      gallery.title,
      gallery.description,
      gallery.file_name
      FROM
      albums
      LEFT JOIN gallery ON albums.album_title = gallery.title ORDER BY gallery.id DESC LIMIT (you want here)
      

      这将遍历所有相册,然后按照相册 id 从高​​到低的顺序输出相应的图像。

      【讨论】:

      • 那么您是否建议在 id 和专辑之间的画廊表中添加专辑 ID。我尝试了您的解决方案,但无法使其正常工作。不过我会继续努力。