gpt4 book ai didi

php - 如何使用 PDO+PHP 使用第一个表中的主键从通过多对多关系连接的表中检索数据?

转载 作者:行者123 更新时间:2023-12-01 22:57:32 25 4
gpt4 key购买 nike

我已经通过PHPMyAdmin建立了一个mysql数据库,并且可以在PHP中使用PDO通过单个表访问数据。但是我不知道从哪里开始尝试从多对多关系中检索数据。

这是我的表结构: image of structure

产品 -> 一个/多个 -> 产品图像 <- 多个/一个 <- 图像

productImages 表包含一个 PK ID 和两个外键,即来自其他两个表的 PK ID。

我知道如何使用 PDO 通过简单的解决方案从产品表中检索信息。下面是一个简化的代码片段,显示了这一点:

<?php
$products = $mypdo->prepare('SELECT * FROM products');
$products->execute();
$products_ids[] = array();
$products_names[] = array();
$products_prices[] = array();

$i = 0;
$columnCount = 1;

foreach($products as $product)
{
$products_ids[$i] = $product['product_ID'];
$products_names[$i] = $product['product_Name'];
$products_prices[$i] = $product['product_Price'];
?>
//output product data in styled HTML
<div class="example"><?php echo $products_names[$i];?></div>
<?php

$i++;
$columnCount++;

if($columnCount > 3)
{
$columnCount = 1;
?>
//start new row using HTML/CSS
<?php
}
}
?>

但是,我想仅使用产品表中的产品 ID 从图像表中检索 image_filename 和 image_extension。 Product_id 是productImages 表中的foreign_key(我认为这是正确的方法),它也链接到images 表中的image_id。目前,所有图像在productImages 中都有一个条目,并且它们都链接到图像表中的单个“占位符图像”。

我有这个 mysql 示例:

select *
from products inner join productImages
on productImages.product_ID=product_ID

我认为它会获取 ProductImages 和 products 表中的所有条目。我对这个解决方案的主要问题是:

  1. 如果确实从两个表中获取所有条目,我还需要第三个表中的条目
  2. 我不确定 PDO 对象如何存储准备好的语句,因此不知道从每个表访问信息的正确语法。例如,product_ID 在 2 个不同的表中具有相同的名称,因此在使用 $product['product_ID'] 时不知道如何区分一个表或另一个表。

我需要做的是将每个产品相应的 image_name 和 image_extension 数据检索到单独(或循环数组)变量中,以便它们可以单独输出到页面上。

我走在正确的轨道上吗?因此能够从这里进一步开发我的代码吗?或者我正在做一些根本性错误的事情并且需要改变我的方法?

更新:

我已经使用 Asher Gunsay 的答案更新了我的代码。现在可以访问第三个表中的数据了!但不幸的是,循环没有,最终结果是只显示第一个产品图像、名称和价格,之后没有任何内容。我的代码(经过编辑以减小大小并保留以前的命名约定):

<?php
$products = $mypdo->prepare('
SELECT
products.product_name as product_name,
products.product_price as product_price,
images.image_fileName as image_fileName ,
images.image_fileExtension as image_fileExtension
FROM
products
JOIN
productsimages on productsimages.product_ID = products.product_ID
JOIN
images on images.image_ID = productsimages.image_ID
');
$products->execute();
$i = 0;
$columnCount = 1;

foreach($products as $product)
{
?>
//output product data in styled HTML
<div class="example"><?php echo $product['product_name'];?></div>
<div class="exampl2"><?php echo $product['image_fileName'];?></div>
<?php

$i++;
$columnCount++;

if($columnCount > 3)
{
$columnCount = 1;
?>
//start new row using HTML/CSS
<?php
}
}
?>

我还尝试了与我的原始代码更相似的变体:

<?php
$products = $mypdo->prepare('
SELECT
products.product_name as product_name,
products.product_price as product_price,
images.image_fileName as image_fileName ,
images.image_fileExtension as image_fileExtension
FROM
products
JOIN
productsimages on productsimages.product_ID = products.product_ID
JOIN
images on images.image_ID = productsimages.image_ID
');
$products->execute();

$products_names[] = array();
$products_prices[] = array();
$images_fileNames[] = array();

$i = 0;
$columnCount = 1;

foreach($products as $product)
{
$products_names[$i] = $product['product_name'];
$products_prices[$i] = $product['product_price'];
$images_fileNames[$i] = $product['image_fileName'];
?>
//output product data in styled HTML
<div class="example"><?php echo $products_names[$i];?></div>
<div class="exampl2"><?php echo $images_fileNames[$i];?></div>
<?php

$i++;
$columnCount++;

if($columnCount > 3)
{
$columnCount = 1;
?>
//start new row using HTML/CSS
<?php
}
}
?>

但是,两个代码片段都有相同的问题:仅显示产品表中的第一个产品。如何解决此问题?

更新 2:该代码运行良好。我忘记向我的productImages 表添加更多记录。我在下面发布了我自己的答案,结合 Asher Gunsay 的答案,展示了使用我的命名约定的最终工作解决方案。

最佳答案

对于mysql,只需继续添加连接即可。

SELECT 
A.attribute as attribute, B.otherAttribute as otherAttribute, C.more as more
FROM
A
JOIN
AB on AB.aId = A.id
JOIN
B on B.id = AB.bId
JOIN
BC on BC.bId = B.id
JOIN
C on C.id = BC.cId
...

这样做,您就可以像平常一样访问变量。

// Loop through rows with each as $row
$row['attribute']; // Corresponds to A.attribute
$row['otherAttribute']; // Corresponds to B.otherAttribute
$row['more']; // And so on

关于php - 如何使用 PDO+PHP 使用第一个表中的主键从通过多对多关系连接的表中检索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60572714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com