[英]Fetch first image from foreign key table
我已經在這里的線程幫助下創建了一個發布系統: 添加一個包含詳細信息(名稱,數量,多幅圖像)的產品,並在另一個頁面中檢索它們。在下面,我想使表格的最后8個條目顯示在索引頁。 我能夠在每個表格的第一個表格中顯示產品名稱和其他功能,但是我想顯示與該帖子的product_id相關聯的第一張圖片(*圖片具有唯一的ID,但product_id是該產品的外鍵第一個表中的主鍵-來自產品的product_id)。 有人用PHP腳本幫助我嗎?
php代碼:
$sql = SELECT id, name, quantity, description FROM products ORDER BY id DESC LIMIT 8;
$result = mysqli_query($connection, $sql);
html代碼:
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["quantity"]. "<br>";
echo "<a href='getProduct.php?id=$row[id]'>See Product</a> <br>";
}
} else { echo "0 results";
}
表
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`description` varchar(150) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `products_images` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(11) unsigned DEFAULT NULL,
`filename` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`),
CONSTRAINT `products_images_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
抱歉...是我關於stackoverflow的第一篇文章...
您可以通過兩種方法來檢索圖像。 第一個是在遍歷結果的同時對每個圖像運行另一個查詢
像這樣:
<?php
$sql = "SELECT id, name, quantity, description FROM products ORDER BY id DESC LIMIT 4";
$result = mysqli_query($connection, $sql);
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["quantity"]. "<br>";
echo "<a href='getProduct.php?id=$row[id]'>See Product</a> <br>";
// load the image
$imageResult = mysqli_query($connection, "SELECT filename FROM products_images WHERE product_id = " . mysqli_real_escape_string($connection, $row["id"]) . " LIMIT 1");
if (mysqli_num_rows($imageResult) == 1) {
$imageRow = mysqli_fetch_assoc($imageResult);
echo "the image filename is: " . $imageRow["filename"];
}
}
} else { echo "0 results"; }
我希望使用的第二個選項是“加入”第二張表,它看起來可能像這樣:
<?php
$sql = "SELECT p.id, p.name, p.quantity, p.description, i.filename FROM products p LEFT JOIN product_images i on i.product_id = p.id ORDER BY p.id DESC LIMIT 4";
$result = mysqli_query($connection, $sql);
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["quantity"]. "<br>";
echo "<a href='getProduct.php?id=$row[id]'>See Product</a> <br>";
if ($row["filename"]) {
echo "the image filename is: " . $row["filename"];
}
}
} else { echo "0 results"; }
我建議您先閱讀有關SQL中的聯接的信息(有很多資源,例如: https : //www.w3schools.com/sql/sql_join.asp,https : //en.wikipedia.org/wiki/Join_( SQL)或http://www.sql-join.com/ )
接下來,我建議您針對稱為SQL Injection的事物保護數據庫查詢。 在第一個示例中,我添加了mysqli_real_escape_string($connection, $row["id"])
來執行此操作。 更好的方法(通常應該使用這種技術編寫數據庫查詢!)是使用准備好的語句。 您可以閱讀有關它們的信息。 此處: https : //websitebeaver.com/prepared-statements-in-php-mysqli-to-prevent-sql-injection
我想指出的第二件事是,您不需要用PHP編寫所有東西。
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["quantity"]; ?><br>
<a href="getProduct.php?id=<?php echo $row[id]; ?>">See Product</a><br>
<?php }
} else { echo "0 results"; }
完全有效! 無需使用echo
即可輸出所有html代碼,而只需“暫停”其間的php內容。
最后,我想向您介紹https://phptherightway.com/ ,它不僅涵蓋了“基礎知識”,還向您指出了更多資源。
如果要恢復與產品關聯的圖像,則必須使用WHERE克隆或使用JOINS來進行恢復,例如:
SELECT
id,
name,
quantity,
description
FROM products, image
WHERE products.id = image.id
ORDER BY id DESC
LIMIT 4;
或者也
SELECT
id,
name,
quantity,
description
FROM products
NATURAL JOIN image
ORDER BY id DESC
LIMIT 4;
但這意味着idImage必須作為products表中的外鍵
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.