繁体   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