前提・実現したいこと
テキストを参考に、ショッピングサイトを作成している初学者です。
商品をいくつか選んでカートに入れ、「カートを見る」ボタンをクリックすると、遷移したページでその内容が一覧できるようになっています。テキストではデータベースの商品テーブルがひとつだけですが、アレンジして商品のカテゴリごとに複数のテーブルを作り、UNION ALLで結合してみたところ、思ったように動かず躓いています。各テーブルのカラムはすべて同じもので統一してあります。
発生している問題・エラーメッセージ
例えばソースコードのように3つのテーブル(category1, 2, 3)を作成すると、選んだ商品が表示されず、なぜか最初のテーブル(category1)の最初の商品のレコードが、選んだ商品の数だけ繰り返して表示されます。
エラーメッセージ
該当のソースコード
PHP ソースコード <?php session_start(); session_regenerate_id(true); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SHOP</title> </head> <body> <?php $cart=$_SESSION['cart']; $max=count($cart); $dsn='mysql:dbname=shop;host=localhost;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); foreach($cart as $key=>$val) { $sql='SELECT code,name,price FROM category1 UNION ALL SELECT code,name,price FROM category2 UNION ALL SELECT code,name,price FROM category3 WHERE code=?'; $stmt=$dbh->prepare($sql); $data[0]=$val; $stmt->execute($data); $rec=$stmt->fetch(PDO::FETCH_ASSOC); $pro_name[]=$rec['name']; $pro_price[]=$rec['price']; } $dbh=null; ?> カートの中身<br> <br> <?php for($i=0;$i<$max;$i++) { ?> <?php print $pro_name[$i]; ?> <?php print $pro_price[$i]; ?>円 <br> <?php } ?> </body> </html>
試したこと
SESSION関数には、選んだ商品の一意のcodeが渡されてくるので、その後の変数の値をvar_dumpで調べてみました。すると、$data[0]=$val;と$stmt->execute($data);の$dataには確かに選んだ商品のcodeが配列で入っていましたが、その下の$recには最初のテーブル(category1)の最初の商品のレコードの配列が、選んだ商品の数だけ入っていました。
$dataに選んだ商品のcodeが入っているので、UNION自体に問題があるわけではないと思います。また、$rec=$stmt->fetch(PDO::FETCH_ASSOC);もテーブルがひとつの時は正しく動いたので、これ自体にも問題があるわけではないと思います。そうするとフェッチの設定が、UNION結合にした場合、思うように動いていないということでしょうか。原因と改善方法についてアドバイスを頂けると幸いです。
補足情報(FW/ツールのバージョンなど)
XAMPP for WIndows 7.3.19 / PHP 7.3.19
回答1件
あなたの回答
tips
プレビュー