簡體   English   中英

PHP mysql相冊允許一張照片包含在多個相冊中(數據庫結構)

[英]PHP mysql photo album allow one photo to be in multiple albums (database structure)

我有一個具有以下架構的mysql數據庫中的兩個表:

相冊:標題,創建日期,修改日期,相冊ID(主鍵)照片:標題,圖像網址,日期拍攝,圖像ID(主鍵)

我正在創建一個由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>

$ 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,您也可能也應該准備它,但在這里我不做介紹。

編輯:這是您代碼中的一個示例(這應該使您更接近一點,但是您遺漏了幾部分,並確保您從用戶首先選擇的那個中獲取了專輯ID,並假設您正在通過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>";

您是否嘗試過使用Doctrine或Eloquent之類的ORM? 您可以使用它們來實現many-to-many關系(這是您要在此處執行的操作的技術名稱)。

對於如何在SQL中實現簡單的多對多關系, 此答案是一個很好的總結。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM