質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1595閲覧

【追記】SESSIONを用いたショッピングカートのデータ保持について

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/02/07 02:13

編集2019/02/07 02:20

前提・実現したいこと

プログラミング初心者で現在練習のためにMySQLを用いてPHPでECサイトを作成している。
SESSIONを用いてお客様がカートに入れた商品の情報を保持したい。

こちらの質問の追加質問 SESSIONを用いたショッピングカートのデータ保持について

##追記(2019/02/07)

####追加した情報

  • POSTで渡す値を$row['name']から$row['id']へ変更
  • cart.phpでforeach文の追加

####問題点

//cart.phpのブラウザ表示 array(3) { [2]=> array(2) { ["cnt"]=> string(1) "1" ["size"]=> string(1) "S" } [""]=> array(2) { ["cnt"]=> NULL ["size"]=> NULL } [1]=> array(2) { ["cnt"]=> string(1) "1" ["size"]=> string(1) "L" } }
  • 1番目に追加した商品の情報が2番目の商品の情報に上書きされ、同じ商品の情報が複数表示される。
  • 配列が3つまでしか反映されない(4つ以上商品を追加してもブラウザ状には3つの同じ商品情報が表示されるだけ)。

####更新したコード

php

1//index.php 2 3<?php 4 5host = '*****'; 6$dbname = '*****'; 7$dbuser = '*****'; 8$dbpassword = '*****'; 9 10 11try{ 12 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 13 echo ""; 14}catch(PDOException $e){ 15 var_dump($e -> getMessage()); 16 die(); 17 18} 19 20try{ 21 $sql = "SELECT * FROM EC"; 22 $stmh = $pdo->prepare($sql); 23 $stmh->execute(); 24}catch(PDOException $Exception){ 25 die('接続エラー:' .$Exception->getMessage()); 26} 27 28 29 30 31?> 32<!DOCTYPE html> 33 34<html lang="ja"> 35 <head> 36 <meta charset="utf-8"> 37 <title>*****</title> 38 <link rel="stylesheet" type="text/css" href="style.css"> 39 <link href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/css/lightbox.css" rel="stylesheet"> 40 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script> 41 <script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/js/lightbox.min.js" type="text/javascript"></script> 42 </head> 43 <body> 44 <div> 45 <a href="cart.php"> 46 <img src="img/cart.png" class="cart-icon"> 47 </a> 48 </div> 49 <div> 50 <a href="index.php"> 51 <img src="img/*****.JPG" class="logo-icon"> 52 </a> 53 </div> 54 <?php 55 while($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 56 ?> 57 <div class="item-list"> 58 <a href="<?=htmlspecialchars($row['image'])?>" data-lightbox="group"> 59 <img src="<?=htmlspecialchars($row['image'])?>" class="item-image"> 60 </a> 61 <p><?=htmlspecialchars($row['id'])?></p> 62 <h4> 63 <a href="detail.php?name=<?= htmlspecialchars($row['id'])?>"> 64 <?=htmlspecialchars($row['name'])?> 65 </a> 66 </h4> 67 <p><?=htmlspecialchars($row['description'])?></p> 68 <p>¥<?=htmlspecialchars($row['price'])?>-</p> 69 </div> 70 71 72 73 <?php 74 } 75 $pdo = null; 76 ?> 77 78 79 80 81 </body> 82 83</html> 84

php

1//detail.php 2 3<?php 4host = '*****'; 5$dbname = '*****'; 6$dbuser = '*****'; 7$dbpassword = '*****'; 8 9 10try{ 11 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 12 echo ""; 13}catch(PDOException $e){ 14 var_dump($e -> getMessage()); 15 die(); 16 17} 18$itemId = $_GET['name']; 19 20 21 22 23 24 25 26 27try{ 28 $sql = "SELECT * FROM EC where id = '{$itemId}'"; 29 $stmh = $pdo->prepare($sql); 30 $stmh->execute(); 31}catch(PDOException $Exception){ 32 die('接続エラー:' .$Exception->getMessage()); 33} 34 35session_start(); 36 37?> 38 39<!DOCTYPE html> 40<html lang="ja"> 41 <head> 42 <meta charset="utf-8"> 43 <title>*****</title> 44 <link rel="stylesheet" type="text/css" href="style.css"> 45 <link href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/css/lightbox.css" rel="stylesheet"> 46 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script> 47 <script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/js/lightbox.min.js" type="text/javascript"></script> 48 </head> 49 50 51 <body> 52 <?php 53 $row = $stmh->fetch(PDO::FETCH_ASSOC); 54 55 ?> 56 <div> 57 <a href="cart.php"> 58 <img src="img/cart.png" class="cart-icon"> 59 </a> 60 </div> 61 <div> 62 <a href="index.php"> 63 <img src="img/*****.JPG" class="logo-icon"> 64 </a> 65 </div> 66 <div class="detail-item-list"> 67 <a href="<?=htmlspecialchars($row['image'])?>" data-lightbox="group"> 68 <img src="<?=htmlspecialchars($row['image'])?>" class="detail-image"> 69 </a> 70 71 <h4> 72 <?=htmlspecialchars($row['name'])?> 73 </h4> 74 <p><?=htmlspecialchars($row['description'])?></p> 75 <p>¥<?=htmlspecialchars($row['price'])?>-</p> 76 <form action="cart.php" method="post"> 77 <select name="item-count"> 78 <?php for ($i=1; $i<=10; $i++) : ?> 79 <option class="item-count" value="<?php echo $i ?>"><?php echo $i ?></option> 80 <?php endfor; ?> 81 </select> 82 <select name="item-size"> 83 <option>S</option> 84 <option>M</option> 85 <option>L</option> 86 <option>XL</option> 87 88 </select> 89 <input type="hidden" name="item-id" value="<?= $row['id']?>"> 90 <input type="submit" name="submit" value="Add to Cart"> 91 </form> 92 <form action="index.php" method="post"> 93 <input type="submit" name="back" value="back"> 94 </form> 95 </div> 96 </body> 97</html> 98

php

1//cart.php 2 3<?php 4host = '*****'; 5$dbname = '*****'; 6$dbuser = '*****'; 7$dbpassword = '*****'; 8 9try{ 10 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 11 echo ""; 12}catch(PDOException $e){ 13 var_dump($e -> getMessage()); 14 die(); 15 16} 17 18session_start(); 19$itemId = filter_input(INPUT_POST, 'item-id'); 20$_SESSION['cart'][$itemId] = array('cnt' => filter_input(INPUT_POST, 'item-count'), 'size' => filter_input(INPUT_POST, 'item-size')); 21var_dump($_SESSION['cart']); 22 23 24 25try{ 26 $sql = "SELECT * FROM EC where id = '{$itemId}'"; 27 $stmh = $pdo->prepare($sql); 28 $stmh->execute(); 29}catch(PDOException $Exception){ 30 die('接続エラー:' .$Exception->getMessage()); 31} 32 33 34 35$row = $stmh->fetch(PDO::FETCH_ASSOC); 36$itemCount = $_POST['item-count']; 37$itemSize = $_POST['item-size']; 38$itemSubtotal = $itemCount * htmlspecialchars($row['price']); 39$itemTotal += $itemSubtotal; 40 41 42 43?> 44 45<!DOCTYPE html> 46<html lang="ja"> 47 <head> 48 <meta charset="utf-8"> 49 <title>*****</title> 50 <link rel="stylesheet" type="text/css" href="style.css"> 51 </head> 52 <body> 53 54 <div> 55 <a href="cart.php"> 56 <img src="img/cart.png" class="cart-icon"> 57 </a> 58 </div> 59 <div> 60 <a href="index.php"> 61 <img src="img/*****.JPG" class="logo-icon"> 62 </a> 63 </div> 64 65 <div class="cart-item-list"> 66 <table class="cart-subtotal"><tbody> 67 <tr><th>Item</th><th>Price</th><th>Size</th><th>Quantity</th><th>Subtotal</th></tr> 68 <?php 69 foreach($_SESSION['cart'] as $key => $value){ 70 ?> 71 <tr> 72 <td> 73 <div class="table-image"> 74 75 <img src="<?=htmlspecialchars($row['image'])?>" class="cart-image"> 76 </div> 77 <div class="table-name" name="cart-item-image"> 78 <a href="detail.php?name=<?= htmlspecialchars($row['name'])?>"> 79 <?php 80 echo htmlspecialchars($row['name']); 81 82 ?> 83 </a> 84 </div> 85 <div class="table-description"> 86 <?=htmlspecialchars($row['description'])?> 87 </div> 88 </td> 89 <td>¥<?=htmlspecialchars($row['price'])?>-</td> 90 <td><?= $itemSize ?></td> 91 <td> 92 <div class="table-count"> 93 <?= $itemCount ?> 94 </div> 95 </td> 96 <td> 97 <div class="table-subtotal"> 98 ¥<?= $itemSubtotal ?>- 99 </div> 100 </td> 101 102 </tr> 103 <?php 104 } 105 ?> 106 </tbody></table> 107 108 <div class="cart-total"> 109 <h3>Total</h3> 110 <p> 111 ¥<?= $itemTotal ?>- 112 </p> 113 114 </div> 115 <div class="checkout"> 116 <form action="checkout.php?name=<?=htmlspecialchars($row['id'])?>" method="post"> 117 <input type="submit" name="checkout" value="Checkout"> 118 <input type="hidden" name="item-size" value="<?= $itemSize ?>"> 119 <input type="hidden" name="item-count" value="<?= $itemCount ?>"> 120 121 </form> 122 <form action="detail.php" method="post"> 123 <input type="submit" name="back" value="back"> 124 </form> 125 </div> 126 127 </div> 128 </body> 129</html> 130 131

####考えられる原因
当方が複雑なarrayやforeachの使い方を理解できていない。

「ここを直せばきれいにカート情報を保持できるよ」というアドバイスがあればご指摘よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/07 02:31

問題別ならタイトルを変えられた方が良いです。 「タイトルだけで要件が何か、問題が何かが想像つく」のが理想です。
guest

回答2

0

ベストアンサー

1.$_SESSION['cart'][商品id]となっているので、foreachやforなどで商品id部分を抜き出します。
2.抜き出した商品idから商品情報を取得して別の配列に保存
3.出力
といった感じでどうでしょう。
※ざっくりと書いてしまったのでミスがあったらごめんなさい。。

PHP

1<?php 2$host = '*****'; 3$dbname = '*****'; 4$dbuser = '*****'; 5$dbpassword = '*****'; 6 7try{ 8 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 9 echo ""; 10}catch(PDOException $e){ 11 var_dump($e -> getMessage()); 12 die(); 13 14} 15 16// 商品idをキーにしてセッションに保存 17session_start(); 18$itemId = filter_input(INPUT_POST, 'item-id'); 19$_SESSION['cart'][$itemId] = array('cnt' => filter_input(INPUT_POST, 'item-count'), 'size' => filter_input(INPUT_POST, 'item-size')); 20//var_dump($_SESSION['cart']); 21 22 23$products = []; 24$itemTotal = 0; 25 26// $_SESSION['cart'][商品id]となっているので、1件ずつ商品idを取り出し商品情報を取得し、$products配列に入れる 27$i=0; 28foreach($_SESSION['cart'] as $key => $value){ 29 $sql = "SELECT * FROM EC where id = ".$key.""; 30 $stmh = $pdo->prepare($sql); 31 32 $products[$i] = $stmh->fetch(PDO::FETCH_ASSOC); 33 $products[$i]['item-count'] = $value['cnt']; 34 $products[$i]['item-size'] = $value['size']; 35 $products[$i]['Subtotal'] = $value['cnt'] * $products[$i]['price']; 36 37 // 小計 38 $itemTotal += $products[$i]['Subtotal']; 39 $i++; 40} 41// 出力確認用 42//var_dump($products); 43 44?> 45<table class="cart-subtotal"> 46 <tbody> 47 <tr> 48 <th>Item</th> 49 <th>Price</th> 50 <th>Size</th> 51 <th>Quantity</th> 52 <th>Subtotal</th> 53 </tr> 54 55 <?php foreach($products as $key => $value) : ?> 56 <tr> 57 <td> 58 <div class="table-image"> 59 <img src="<?= htmlspecialchars($value['image']) ?>" class="cart-image"> 60 </div> 61 62 <div class="table-name" name="cart-item-image"> 63 <a href="detail.php?name=<?= htmlspecialchars($value['name']) ?>"><?= htmlspecialchars($value['name']) ?></a> 64 </div> 65 66 <div class="table-description"> 67 <?= htmlspecialchars($value['description']) ?> 68 </div> 69 </td> 70 <td>¥<?= number_format($value['price']) ?>-</td> 71 <td><?= $value['item-size'] ?></td> 72 <td><?= $value['item-count'] ?></td> 73 <td>¥<?= number_format($value['Subtotal']) ?></td> 74 </tr> 75 <?php endforeach: ?> 76 </tbody> 77</table> 78 79<div class="cart-total"> 80 <h3>Total</h3> 81 <p>¥<?= $itemTotal ?>-</p> 82</div>

投稿2019/02/07 03:01

編集2019/02/07 03:18
mayoi_maimai

総合スコア1583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/07 05:04

ありがとうございます! 教えていただいた方法でidの値は取ってこれているのにDBのデータを引っ張ってこれずに手こずっていましたが、SQL文の'key'を"key"にすることで無事表示することができました! 前回ご指摘いただいたように同じ商品が追加された時に上書きされてしまう問題ですが、一度自分で調べてトライしてみたいと思います。 本当にありがとうございました。
mayoi_maimai

2019/02/07 05:24 編集

同一商品がカートがあるか無いかは以下でチェックできると思います。 if ( $_SESSION['cart'][$itemId] ) { // カートに商品あり } else { // カートに商品なし } 既にある場合は上書き、個数のみを上書き、カートにある旨を通知など様々なパターンがあると思いますが、この辺りは仕様によりといったところでしょうか。 あとカートを空にしたり、カートから商品を削除するにはセッションの中身をクリアしなければいけませんので、そのあたりも調べてみるとよいと思います。 頑張ってください!
guest

0

ちょっと煩雑なので細かく見れていませんが

POSTで渡す値を$row['name']から$row['id']へ変更

の、意図がわかりません。
商品はidで管理するものなので最初からpostする段階でidを受け取ってくださいとしか・・・

流れ

  • nyuryoku.php

PHP

1<style> 2.suryo{text-align:right} 3</style> 4<form method="post" action="kakunin.php"> 5<table> 6<tr> 7<td><label><input type="checkbox" name="id[]" value="0" checked>hoge</label></td> 8<td><input type="text" name="suryo[0]" class="suryo" value="100"></td> 9</tr> 10<td><label><input type="checkbox" name="id[]" value="1">fuga</label></td> 11<td><input type="text" name="suryo[1]" class="suryo" value="200"></td> 12</tr> 13<td><label><input type="checkbox" name="id[]" value="2" checked>piyo</label></td> 14<td><input type="text" name="suryo[2]" class="suryo" value="0"></td> 15</tr> 16</table> 17<input type="submit" value="go"> 18</form>
  • kakunin.php

PHP

1<?PHP 2session_start(); 3$id=filter_input(INPUT_POST,"id",FILTER_VALIDATE_INT,FILTER_REQUIRE_ARRAY); 4$suryo=filter_input(INPUT_POST,"suryo",FILTER_VALIDATE_INT,FILTER_REQUIRE_ARRAY); 5 6$cart=[]; 7foreach($id as $val){ 8 $cart[]=["id"=>$val,"suryo"=>$suryo[$val]]; 9} 10$_SESSION["cart"]=$cart; 11?> 12<a href="keishou.php">継承データ確認</a>
  • keishou.php

PHP

1<?PHP 2session_start(); 3print_r($_SESSION["cart"]);

投稿2019/02/07 02:17

編集2019/02/07 02:43
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/07 02:21

前回の質問で同じようなご指摘をいただきましたので修正したという意味です。
yambejp

2019/02/07 02:44

流れを書いておきました。試してみてください
退会済みユーザー

退会済みユーザー

2019/02/07 05:06 編集

回答いただきありがとうございました! 今回は別の方をベストアンサーとさせていただきましたがまた別の機会があれば何卒よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問