【问题标题】:PHP mysql photo album allow one photo to be in multiple albums (database structure)PHP mysql相册允许一张照片在多个相册中(数据库结构)
【发布时间】:2015-03-25 21:23:15
【问题描述】:

我有两个来自 mysql 数据库的表,其架构如下:

专辑:标题、创建日期、修改日期、专辑 ID(主键) 照片:标题、image_url、date_taken、imageID(主键)

我正在创建一个 php/mysql 驱动的在线相册,并且我希望允许一张照片在多个相册中,所以我没有将相册 ID 作为外键放在照片中。 我能做到这一点的唯一方法是创建第三个表,将 imageID 与albumID 相关联,但到目前为止我还没有做到这一点。 我应该在我的第三张表上放什么,将 imageID 与 albumID 关联起来,并允许用户将一张照片放在多个相册中。

另外,我将如何在我的 php 代码中将它查询到 mysql 数据库以显示特定相册中的所有照片? (我正在使用 mysqli 函数) 任何帮助将不胜感激! 提前致谢

到目前为止的代码:

<form enctype="multipart/form-data" method="post">
        <?php
        require_once 'config.php'; 
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if(isset($_POST['upload'])){
        $caption = $_POST['caption'];
        $albumID = $_POST['album'];
        $file = $_FILES ['file']['name'];
        $file_type = $_FILES ['file']['type'];
        $file_size = $_FILES ['file']['size'];
        $file_tmp = $_FILES ['file']['tmp_name'];
        $random_name = rand();

        if(empty($file)){
            echo "Please enter a file <br>";
        } else{
             move_uploaded_file($file_tmp, 'uploads/'.$random_name.'.jpg');
    $ret = mysqli_prepare($mysqli, "INSERT INTO photos (caption, image_url, date_taken, imageID)
    VALUES(?, ?, NOW()), null");
    $filename = "uploads/" . $random_name . ".jpg";
    mysqli_stmt_bind_param($ret, "ss", $caption, $filename);
    mysqli_stmt_execute($ret);
    echo "Photo successfully uploaded!<br>";
    $id = mysqli_prepare($mysqli, "INSERT into album_photo (albumID, imageID) values (?, $id)");
    }
    }
    ?>
    Caption: <br>
    <input type="text" name="caption">
    <br><br>
    Select Album: <br>
    <select name="album">
    <?php
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $result = $mysqli->query("SELECT * FROM albums");
    while ($row = $result->fetch_assoc()) {
        $albumID = $row['albumID'];
        $title = $row['title'];
        echo "<option value='$albumID'>$title</option>";
    }
    ?>
    </select>
    <br><br>
    Select Photo: <br>
    <input type="file" name="file">
    <br><br>
    <input type="submit" name="upload" value="Upload">
</form>

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: php mysql image phpmyadmin


【解决方案1】:

您是否尝试过使用像 Doctrine 或 Eloquent 这样的 ORM?您可以使用它们来实现many-to-many 关系(这是您在此处尝试执行的操作的技术名称)。

This answer 很好地总结了如何在 SQL 中实现简单的多对多关系。

【讨论】:

    【解决方案2】:

    $id = $mysqli->insert_id如果你想让一张照片存在于许多相册中并且相册里有任何照片,你就需要创建一个多对多的结构。通常,您需要创建一个带有双主键的链接表。

    基本上,您只需要一个名为album_photo 之类的表,并带有两个键。两者都是该相册中的主键,作为外键链接到照片和相册。它可能看起来像这样:

    albumID (PK)    imageID (PK)
    -------         -------
     1                1
     1                2
     2                1
     2                2
    

    通过将它们都指定为主键,这将与单个主键略有不同。与其让单个 id 只出现一次,不如将它们视为主要的。这意味着一个分组只能出现一次。这也将确保一个组合只能存在一次。

    您可以使用与任何其他查询相同的 SQL 来查询它(如果您想查看特定专辑):

    $query = "select a.albumID, p.imageID
              from album a, photos p, album_image ai
              where a.album_ID = ai.albumID
              and p.imageID = ai.imageID
              and a.album_id = ? ";
    

    然后在语句中包含变量以替换 ?

    对于您的插入,假设用户正在使用现有相册,代码可能如下所示:

     $insert_photo= "insert into photos (caption, image_url, date_taken, imageID)
                     values (?, ?, ?, NULL)";
    
     $id = [connection variable]->insert_id
    
    $insert_link = "insert into album_photo
                    albumID, imageID values (?, ?)
                    WHERE albumID = $albumID and imageID = $id";
    

    最后一个在哪里?是您当前的专辑。请注意,我只是在其中包含 $id 以方便解释,您也应该准备好,但我不会在这里讨论。

    编辑: 这是您的代码中的一个示例(这应该让您更接近一点,但是您缺少一些部分,并确保您从用户首先选择的那个中获取albumID,并假设您通过mysqli_fetch 获取此变量或将mysqli_fetch_array 转换为$row):

    $albumID = $row['albumID'];
    $ret = mysqli_prepare($mysqli, "INSERT INTO photos (caption, image_url, date_taken, imageID)
    VALUES(?, ?, NOW(), null");
    $filename = "uploads/" . $random_name . ".jpg";
    $ret->bind_param("ss", $caption, $filename);
    $ret->execute();
    
    $id = $mysqli->insert_id;
    $alph = $mysqli->prepare("INSERT into album_photo (albumID, imageID) values (?, ?)  ");
    
    //here you will need to do the rest of the binding parameters, execution, etc, just as in the first query, but off of $alph instead of $ref
    $alph->bind_param("ii", $albumID, $id);
    $alph->execute();
    $alph->close();
    $ret->close();
    echo "Photo successfully uploaded!<br>";
    

    【讨论】:

    • 谢谢!我将如何通过 phpmyadmin 创建此表?添加照片和相册时它会自动更新吗? @nomistic
    • 您需要先单独创建表格,然后在进行插入时,您需要确保(在您的 php 文件中)项目已输入到 album 和 @987654332 @first 在被插入到album_photo 之前。注意:确保您使用mysqli_insert_id(如果这是您采用的方法)以确保正在输入的项目的ID正确输入到album_photo
    • 我已经单独创建了表格,我的插入相册和照片的代码可以在stackoverflow.com/questions/29220266/…找到,我如何使用mysqli_insert_id将信息输入到album_photo?
    • 我刚刚添加了一些编辑。这应该让你开始。如果它回答了您的问题,请标记它。 (从您在另一个示例中所写的内容来看,我看到您对准备好的语句有清楚的了解。基本上将插入 id 放在第一个查询和执行之后,然后运行第二个。)
    • 我已经添加了代码,我根据您的建议进行了更改,但是我认为我在 $id 上做错了,也许我没有把它放在正确的地方?我应该把它放在标题之前还是之后并选择表格的专辑部分?@nomistic
    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 2011-05-10
    • 2012-02-16
    • 2018-03-20
    • 2014-09-29
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多