簡體   English   中英

從外鍵表中獲取第一張圖像

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

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