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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

1回答

2429閲覧

phpでカートらしき物を作ってますが、ロジックというかコードと言うか、頭が悪くて困っています

yoyoyoyogi

総合スコア47

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

1クリップ

投稿2015/08/21 02:51

php初心者です。
カートっぽい物を作っているんですが、商品に追加オプションを付ける所で困っています。

商品はdbから引っ張って来るのですが、その商品を選択後、オプションを選ばせたいです。
オプションが複数あって、何個でも選択出来る仕様にしたいのですが、困っています。
オプションもdbから取ってきたいのですが、今回は諸事情でdbからは引っ張りません。

例えばHTMLはこうしまして

<div> <form method="POST"> <p>オプション1:1,000円</p> <input type="hidden" name="op_name" value="'オプション1'"> <input type="hidden" name="op_price" value="'1000"> <input type="submit" name="op_insert" value="追加" /> </form> </div> <div> <form method="POST"> <p>オプション2:2,000円</p> <input type="hidden" name="op_name" value="'オプション2'"> <input type="hidden" name="op_price" value="'2000"> <input type="submit" name="op_insert" value="追加" /> </form> </div> <div> <form method="POST"> <p>オプション3:3,000円</p> <input type="hidden" name="op_name" value="'オプション3'"> <input type="hidden" name="op_price" value="'3000"> <input type="submit" name="op_insert" value="追加" /> </form> </div>

の様な感じでPOSTしまして
受け取った後に、1つの変数に連想配列でしまって、
foeachで出力したいのですが、どうもコードが書けません。
下記に自分の考えたコードを書いてみました、本題とは違うのでpostのチェックなどは入れてませんが、
自分的には$opの[0]の部分をポストされる度にカウントを上げる仕組みを作ればいいのかな?
と思って色々やりましたがうまくいきません。

やりたいイメージ(動きません)
if (islet($_POST['op_insert'])) {

$op[$i]['op_name'] = $_POST['op_name'] ; $op[$i['op_price'] = $_POST['op_price'] ; //ここで$iのカウントを操作する方法がどうしても出来ないです。

]

$i=0;
foeach ($op as $op ) {
echo '<P>' . $op[$i]['op_name'] . '</p>';
echo '<p>' . $op[$i]['op_price'] . '</p>';
$op_total = $op_total+$op[$i]['op_price']
$i++
}
echo 'オプション合計:' . $op_total . '円' ;

結果
オプション1: 1,000円
オプション3:3,000円
オプション1:1,000円
オプション2:2,000円

オプション合計:7,000円

の様な事がしたいです。
必要な仕様は
・オプションを、重複も含めて複数追加出来る
・表示もforeachなどで表示の分量をフレキシブルにしたい
・合計金額を取得したい

根本的にダメかもしてませんし、$iのカウントアップが出来たら動くのかもしれませんし、もう頭が沸騰していまして2日間悩んでおります。。。。。

どなたか、教えて頂けるとありがいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

MVCも何もない、ごちゃまぜコードですが
こんな感じで実現できます

sessionの初期化等は、
この前にページがあれば
そちらでやった方が良いと思いますが

index.php

php

1<?php 2 3 session_start(); 4 5 if(!isset($_SESSION['cart'])) { 6 $_SESSION['cart'] = array(); 7 } 8 if(isset($_POST['op_insert'])) { 9 $tmp = array(); 10 $tmp['op_name'] = $_POST['op_name']; 11 $tmp['op_price'] = $_POST['op_price']; 12 array_push($_SESSION['cart'],$tmp); 13 }else{ 14 // cart初期化 15 unset($_SESSION['cart']); 16 } 17 18?> 19<html> 20<body> 21 <div> 22 <form method="POST"> 23 <p>オプション1:1,000円</p> 24 <input type="hidden" name="op_name" value="オプション1"> 25 <input type="hidden" name="op_price" value="1000"> 26 <input type="submit" name="op_insert" value="追加" /> 27 </form> 28 </div> 29 <div> 30 <form method="POST"> 31 <p>オプション2:2,000円</p> 32 <input type="hidden" name="op_name" value="オプション2"> 33 <input type="hidden" name="op_price" value="2000"> 34 <input type="submit" name="op_insert" value="追加" /> 35 </form> 36 </div> 37 <div> 38 <form method="POST"> 39 <p>オプション3:3,000円</p> 40 <input type="hidden" name="op_name" value="オプション3"> 41 <input type="hidden" name="op_price" value="3000"> 42 <input type="submit" name="op_insert" value="追加" /> 43 </form> 44 </div> 45 <br /> 46 <?php 47 $total = 0; 48 if(count($_SESSION['cart']) > 0) { 49 foreach($_SESSION['cart'] as $value){ 50 echo $value['op_name'] .':'. $value['op_price'] .'円<br />'; 51 $total += $value['op_price']; 52 } 53 } 54 echo '<br />オプション合計:'.$total.'円'; 55 ?> 56</body> 57</html>

投稿2015/08/21 06:51

shaha

総合スコア166

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

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

yoyoyoyogi

2015/08/21 08:40

有りがとうございます。 凄い少ないコードで出来るんですね、凄く勉強になります。 var_dumpで検証してみるとしっかり入っているようなのですが、 foreachでうまく出来ませんでした。 取り出すにはどうしたら良いのでしょうか。 $i=0; foreach ($_SESSION['cart'] as $value ) { echo '追加加工'; echo $value[$i]['op_name']; echo $value[$i]['op_price_total']; echo '<br>'; $i++; }
yoyoyoyogi

2015/08/21 08:45

ちなみに、echoしている文字列'追加加工'だけ出力されます。
yoyoyoyogi

2015/08/21 08:48

解決しました。 [$i]が余計だったんですね、やはりちょっと理解が足りないようです、精進します。 ありがとうございました。
yoyoyoyogi

2015/08/23 03:04

先日はありがとうございました。 教えて頂き、色々勉強の為に試していますがイマイチ理解出来ない箇所があります。 最初に if(!isset($_SESSION['cart'])) { $_SESSION['cart'] = array(); } $_SESSION['cart']が無ければ、配列化 としていると思いますが。 なぜ「無ければ」なのですか?ifではなく毎度上書きで配列初期化するとどういったリスクがあるのでしょうか。 また、理解を深めようと、違うパターンで下記のコードを書いてみたら <?php session_start(); if(!isset($_SESSION['cart'])){ $_SESSION['cart'] = array(); } $temp = array($_GET['name'],$_GET['price'],$_GET['qty']); array_push($_SESSION['cart'],$temp); Warning: array_push() expects parameter 1 to be array というエラーが出ました。 調べると$_SESSION['cart']が配列初期化されていない為のエラーの様なのですが、何故配列化されていなのか分かりません。 教えて頂けると大変助かります。 よろしくお願いいたします。
shaha

2015/08/23 09:41

>ifではなく毎度上書きで配列初期化するとどういったリスクがあるのでしょうか。 同じページで初期化と追加を行っているので 毎回初期化すると最後1件しか追加されないからです 現在のページよりも前に別のページがある場合 そちらで初期化する方が綺麗だし理にかなっていると思います その場合は当然現在のページで初期化は不要です 下のWarningに関してはソースを見る限りあっていると思いますが Warningとなっているならば issetは存在確認なので 何かのタイミングで$_SESSION['cart']に配列ではないものが格納され if文がスルーされていると思われます
yoyoyoyogi

2015/08/28 01:40

返信ありがとうございました。 とても良くわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問