[英]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.