PHP mysql相册允许一张照片在多个相册中(数据库结构)

时间:2015-03-24 14:23:07

标签: php mysql image phpmyadmin

我有两个来自mysql数据库的表,其中包含以下模式:

专辑:title,date_created,date_modified,albumID(主键) 照片:标题,image_url,date_taken,imageID(主键)

我正在创建一个支持php / mysql的在线相册,我想允许一张照片放在多个专辑中,所以我没有将albumID作为外键放在照片中。 我能做到这一点的唯一方法是创建一个将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>

2 个答案:

答案 0 :(得分:0)

$ id = $ mysqli-&gt; 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,并假设你通过{{1}得到这个变量}或mysqli_fetchmysqli_fetch_array):

$row

答案 1 :(得分:0)

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

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