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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

3回答

2239閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

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/05 06:26

編集2019/02/05 06:35

前提・実現したいこと

こんにちは。
プログラミング初心者で現在練習のためにMySQLを用いてPHPでECサイトを作成しております。

発生している問題・エラーメッセージ

SESSIONを用いてお客様がカートに入れた商品の情報を保持したいのですが、応用的なSESSIONの知識が乏しくさまざまなサイトやサンプルコードを試してもうまくいきません。

該当のソースコード

php

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

php

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

php

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

このページが完成しないと次の機能追加ができないためかなり困っています。
様々なコードを継ぎ足して作成しておりますので見苦しいかもしれませんが、アドバイスいただけますと幸いです。

###補足
cart.phpの後にお客様の個人情報入力ページ、最終確認ページ、完了ページを作成中です。

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

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

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

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

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

m.ts10806

2019/02/05 06:33

> phpMyAdminを用いて ここ勘違いする人が非常に多いのが不思議なのですが、phpMyAdminはあくまでツールです。 データベースを確認するためのツールです。もちろんデータ確認したりテーブル作ったりというのは行うかもしれませんがphpMyAdmin主軸で作っていくわけではありません。 この場合のデータベースはMySQLまたはMariaDBです。
退会済みユーザー

退会済みユーザー

2019/02/05 06:35

ご指摘ありがとうございます。
m.ts10806

2019/02/05 06:38

>様々なコードを継ぎ足して作成しておりますので 身も蓋もないことを言ってしまうと理解しないまま進もうとしても結局つまずいて進まなくなります。 自身が手に負えないコードをそのままにしておくのはマズイです。 「穴だらけでもそれがなぜ穴か分からない」状態だとそのまま全てがセキュリティホールになります。 今の状態からでもきちんと理解して手に負えるコードにしておいたほうが、結果的に早く良いものが出来上がりますよ。
退会済みユーザー

退会済みユーザー

2019/02/05 06:40

言葉足らずでした。 「継ぎ足したコードを自分なりに解釈し編集し記述しているが、不自然なまま残っている部分があるかもしれない」という意味です。 お手隙であれば質問の中身にもご回答、ご助力いただけますと幸いです。
m.ts10806

2019/02/05 06:45

承知しました。 ただ、現状「うまくいきません」としか書かれておりませんので、質問者さんが実際に直面している問題を具体的に書かれた方が良いと思います。でないと回答者も何が問題か分からないままコードを見ることになるので、「デバッグ依頼」になってしまいます。 https://teratail.com/help/question-tips#questionTips3-4 https://teratail.com/help/avoid-asking >コードをください・デバッグしてください等の丸投げの質問
m.ts10806

2019/02/05 06:54

あ、まだsession何も試されてないんですね。なるほど・・。
mayoi_maimai

2019/02/05 07:48

ざっと見た感じカートの中には1点しか商品が入らないように見えますね。 こちらは複数商品(商品A1個と商品B3個みたいな)にも対応させた方がよい感じですか??
退会済みユーザー

退会済みユーザー

2019/02/05 07:50

「1点しか商品が入らない」はとても気になります、、 おっしゃる通り複数商品に対応させたいです。
guest

回答3

0

お客様がカートに入れた商品の情報を保持

ログインしていたりログアウトしていたり買い物完了したりできちんとセッションを破棄していることは前提ですね。
セッションには配列も保持できますので、カートに入れた商品のIDと個数を配列で保持して、その配列に追記していけば良いと思います。

セッションというより配列の使い方の問題かなと。
下記のような追加のされ方をしているので、「この商品が」というのを取り出すのが困難になっています。

php

1$array = []; 2array_push($array,"a","b","c"); 3var_dump($array); 4array_push($array,"d","e","f"); 5var_dump($array); 6 7/** 8array(3) { 9 [0]=> 10 string(1) "a" 11 [1]=> 12 string(1) "b" 13 [2]=> 14 string(1) "c" 15} 16array(6) { 17 [0]=> 18 string(1) "a" 19 [1]=> 20 string(1) "b" 21 [2]=> 22 string(1) "c" 23 [3]=> 24 string(1) "d" 25 [4]=> 26 string(1) "e" 27 [5]=> 28 string(1) "f" 29} 30*/

ちなみに質問者さんのような配列で試すとこう

php

1$array = []; 2$array["cart"] = []; 3array_push($array["cart"],"a","b","c"); 4var_dump($array); 5array_push($array["cart"],"d","e","f"); 6var_dump($array); 7/** 8 9array(1) { 10 ["cart"]=> 11 array(3) { 12 [0]=> 13 string(1) "a" 14 [1]=> 15 string(1) "b" 16 [2]=> 17 string(1) "c" 18 } 19} 20array(1) { 21 ["cart"]=> 22 array(6) { 23 [0]=> 24 string(1) "a" 25 [1]=> 26 string(1) "b" 27 [2]=> 28 string(1) "c" 29 [3]=> 30 string(1) "d" 31 [4]=> 32 string(1) "e" 33 [5]=> 34 string(1) "f" 35 } 36} 37**/

どこに何を入れたかこれでは分かりませんね。
キーでは入っていません。

ということは2次元配列である必要があります。
keyをうまく使う必要があるということですね。

php

1$array = []; 2array_push($array,["id"=>1,"number"=>5]); 3var_dump($array); 4array_push($array,["id"=>2,"number"=>8]); 5var_dump($array); 6/** 7 8array(1) { 9 [0]=> 10 array(2) { 11 ["id"]=> 12 int(1) 13 ["number"]=> 14 int(5) 15 } 16} 17array(2) { 18 [0]=> 19 array(2) { 20 ["id"]=> 21 int(1) 22 ["number"]=> 23 int(5) 24 } 25 [1]=> 26 array(2) { 27 ["id"]=> 28 int(2) 29 ["number"]=> 30 int(8) 31 } 32} 33**/

でも、これだと「同じ商品が指定されたとき」に対応できないので、
そもそもarray_push()だと対応が難しくなります。

最初のkey自体を商品IDにすると楽です。
※一応keyも全角文字列対応だったと思いますが、あまり推奨されませんので。

php

1$array[1] = ["number"=>5]; 2$array[2] = ["number"=>8];

投稿2019/02/05 07:54

編集2019/02/05 08:32
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/02/05 08:08 編集

ご回答ありがとうございます。 IDをページで表示したくないため商品名でデータを保持したいのですが、以下のコードを試してもNULLが帰ってきてしまいます、、 配列の書き方がまずいのでしょうか、? ちなみに€oelacan T WhiteはDBにあり、$row['name']から取ってきた商品名です。 ``` array(4) { [0]=> string(18) "€oelacan T White" [1]=> NULL [2]=> NULL [3]=> NULL } ``` ```php //detail.php $itemName = $row['name']; try{ $sql = "SELECT * FROM EC where name = '{$itemName}'"; $stmh = $pdo->prepare($sql); $stmh->execute(); }catch(PDOException $Exception){ die('接続エラー:' .$Exception->getMessage()); } session_start(); if(empty($_SESSION['cart'])){ $_SESSION['cart'] = array(); } array_push($_SESSION['cart'], $itemName, $row['image'], $row['price'], $row['description']); ``` ```php //cart.php session_start(); var_dump($_SESSION['cart']); ```
m.ts10806

2019/02/05 08:09

いえ、保持するだけならページに表示する必要もありません。 IDさえあればDBから商品情報取得できますよね。 商品名で保持してしまうと商品名が変更されたときに対応できませんし、もし万が一全く同じ商品名があったときに正しく情報のやりとりができなくなってしまいます。 IDでの保持を強くすすめます。
退会済みユーザー

退会済みユーザー

2019/02/05 08:12

ありがとうございます。 その点は検討いたします。 ですが質問のポイントはIDか商品名かではなく、配列で商品名以外(仮にIDに変更した場合はID)以外の情報がNULLと帰ってくる点です。 よろしくお願いいたします。
m.ts10806

2019/02/05 08:36

detail.phpのどこに該当の処理を書かれたか分かりませんが、 $rowが正しくない取れてない可能性ありますね。 $_GET['name'] ←これが実はurlencode()されているとか。 となるとurldecode()する必要がありそうに思います。
m.ts10806

2019/02/05 08:46

ちなみにそのnullと返る結果をそのまま質問にコードブロックでご提示いただけますか? どこで確認したかもふくめて。
m.ts10806

2019/02/05 08:47

コメント欄ではマークダウンが使えませんのでコードを提示する場合は質問に追記してください。 (使えるようにしてって運営に要望はだしてるんですけどねー)
退会済みユーザー

退会済みユーザー

2019/02/05 09:09

ご丁寧にありがとうございます。 おっしゃる通り$rowが正しく取れていませんでした。 またIDの有用性についても理解できましたので、書き直してみます。
退会済みユーザー

退会済みユーザー

2019/02/05 09:09

またマークダウンについてのご指摘もありがとうございます。
m.ts10806

2019/02/05 09:26

進みそうで何よりです。priceもセッションよりDBから取得された方が良いですね。
guest

0

セッションがどう始まってどう伝わりどう終わるか
テストされると良いでしょう。
以下3ページの状況を見てみてください

  • x.php

PHP

1<?PHP 2session_start(); 3?> 4page x<hr> 5<?PHP 6var_dump($_SESSION); 7print "<hr>"; 8var_dump($_COOKIE); 9$_SESSION["hoge"]=1; 10?> 11<hr> 12<a href="x.php">reload</a> <a href="y.php">y</a>
  • y.php

PHP

1<?PHP 2session_start(); 3?> 4page y<hr> 5<?PHP 6var_dump($_SESSION); 7print "<hr>"; 8var_dump($_COOKIE); 9$_SESSION["hoge"]=2; 10?> 11<hr> 12<a href="y.php">reload</a> <a href="z.php">z</a>
  • z.php

PHP

1<?PHP 2session_start(); 3?> 4page z<hr> 5<?PHP 6session_regenerate_id(); 7var_dump($_SESSION); 8print "<hr>"; 9var_dump($_COOKIE); 10session_destroy(); 11?> 12<hr> 13<a href="z.php">reload</a> <a href="x.php">x</a>

投稿2019/02/05 07:51

yambejp

総合スコア114839

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

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

退会済みユーザー

退会済みユーザー

2019/02/05 08:00

ご回答ありがとうございます。 SESSIONの動き方は徐々にわかってきました。
guest

0

ベストアンサー

1.とりあえず全ページの頭でsession_start();
2.detail.phpに商品idを追加
<input type="hidden" name="id" value="<?php echo $row['id'] ?>">

3.cart.phpでidを受け取って個数、サイズをセッションに保存

PHP

1// cart.php 2$id = filter_input(INPUT_POST, 'id'); 3$_SESSION['cart'][$id] = array('cnt' => filter_input(INPUT_POST, 'item-count'), 'size' => filter_input(INPUT_POST, 'item-size')); 4var_dump($_SESSION['cart']); 5 6// カート内の商品情報を出力 7foreach($_SESSION['cart'] as $key => $value) { 8 //DBから商品情報取得など 9}

※このままだと同じ商品の個数、サイズ違いなどを入れると上書きされるので、いやな場合は別途対応が必要です。

投稿2019/02/05 08:39

mayoi_maimai

総合スコア1583

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

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

退会済みユーザー

退会済みユーザー

2019/02/05 09:10

ご回答いただきありがとうございます。 参考にさせていただきます。
退会済みユーザー

退会済みユーザー

2019/02/07 02:17

mayoi_maimai様にご指摘いただいた方法で更新しましたが、当方が幾分知識がないため思い通りに進めることができませんでした。 以下で再度更新したコード等追記いたしましたので、もしお時間ございましたらご助力いただけますと幸いです。 https://teratail.com/questions/173113?modal=q-comp なおこちらの質問で他の方からいただいたアドバイスも大変参考になりましたが、最も質問内容にそったご回答をいただけましたのでmayoi_maimai様をベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問