私は、PHPMyAdminの通過MySQLデータベースを設定している、とPHPでPDOを使用して、単一のテーブルを介してデータにアクセスすることができます。しかし、私は多対多の関係からデータを取得しようとして始めるためにどこか分かりません。
ここに私のテーブルの構造は次のとおりです。 構造の画像
製品 - > 1 /多くの - > productImages < - <1 /多くの - の画像
productImagesテーブルは、他の2つのテーブルからPK ID、および2つの外部キー、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
}
}
?>
しかし、私は、製品テーブルからのみのproduct_idを使用して、画像のテーブルからimage_filenameとimage_extensionを取得したいです。PRODUCT_IDがproductImagesテーブルのFOREIGN_KEYでも画像のテーブルからimage_idはにリンクされている、(私は、これはそれを行うための正しい方法だと思います)。現在、すべての画像は、画像テーブルにシングル「プレースホルダイメージ」へのすべてのリンクをproductImagesで単一のエントリを持っている、と彼ら。
私はこのmysqlの例があります:
select *
from products inner join productImages
on productImages.product_ID=product_ID
そして、私はそれがproductImagesや製品テーブルからすべてのエントリを取ると思います。このソリューションで私の主な問題は次のとおりであります:
- それは確かに2つのテーブルからすべてのエントリを取っている場合は、私は、第3のテーブルからエントリを必要とします
- 私は、各テーブルからのアクセス情報に正しい構文を知らないどのようにPDOオブジェクトを格納プリペアドステートメントを確認していません。たとえば、PRODUCT_IDは、2つの異なるテーブルに同じ名前を持っているので、使用する際に1台または他の区別するのか分かりません
$product['product_ID']
。
私はそうですが、分離(またはループ配列)への各製品に対応するイメージ名とimage_extensionデータを取得する変数を行う必要があります彼らは何ページへの個別出力することが可能。
私は正しい軌道に乗っています、ので、ここからさらに私のコードを開発することができるだろうか?それとも私が根本的に間違っていると私のアプローチを変更する必要何かをやっていますか?
更新:
私はアッシャー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
}
}
?>
しかし、両方のコードスニペットは、同じ持っている問題を:製品テーブルからのみ最初の製品が表示されます。私はこれをどのように解決するのですか?
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