• ベストアンサー

セッションにIDを振って値を代入

PHP初心者です。 PHP4.2.xを使っています。 ショッピングカートで購入した商品データをセッションで維持してカートに追加する機能部分を作っていますがうまくいきません。 コードは以下のとおりです。 【goods.php】 ----------------------------------------------------------- <? session_start(); ?> ■商品1 <form action="cart.php" method="POST"> <input type="hidden" name="id" value="1" /> <input name="num" type="text" /> <INPUT type=submit value="カートに追加"> </form> ■商品1 <form action="cart.php" method="POST"> <input type="hidden" name="id" value="2" /> <input name="num" type="text" /> <INPUT type=submit value="カートに追加"> </form> ----------------------------------------------------------- 【cart.php】 ----------------------------------------------------------- <? session_start(); if($_POST['id'] != ""){ $id = $_POST['id']; $num = $_POST['num']; // セッション名自体をIDで作っています。中身は個数のみです。 $_SESSION["$id"] = $num; } echo "カートに入ってる商品<br />"; for ($i = 0; $i<=100; $i++) { if (!empty($_SESSION["$i"])){ echo $_SESSION["$i"]. "<br>\n"; } } ?> ----------------------------------------------------------- goods.phpのファイルで商品1と商品2を1つずつカートに入れれば cart.phpのページで 1 1 と表示されるはずが、1しか出ません。 $_SESSION["1"] $_SESSION["2"]の中身が表示される予定でしたがそうならず、 そのときPOSTで投げられたIDしか$_SESSION["$id"]に保持されません。 どうすればどんどん商品をカートに追加できますでしょうか? アドバイスのほどどうぞよろしくお願いします!

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

カート処理ということですので、商品を削除したり、数量を変更したりする処理も時には必要になりますよね。ほかに後工程として受注メールを送信したり、DBに保存したりする処理もありえます。 それを前提とした場合であれば、"$_SESSION[$i] = array($num, $size)"ではなく、 多次元配列をもう少し明確にしておいた方がいいと思います。 例えば $_SESSION[$i]['num']=$num; $_SESSION[$i]['size']=$size; 商品削除なら unset($_SESSION[$_POST['id']]); 数量変更なら $_SESSION[$_POST['id']]['num']=$_POST['num']; カート表示なら foreach($_SESSION as $k=>$v){ echo '商品ID:'.$k.'<br />'; echo '数量:'.$v['num'].'<br />'; echo 'サイズ:'.$v['size'].'<br />'; } と処理がスムーズになります。当然上記の処理は簡単にソースを書いていますので、細かい事までいってしまうと、カートに入った順に上から並べていく場合は、ソート処理も必要になりますので$_SESSIONも持ち方も考慮しなければなりません。

その他の回答 (1)

回答No.1

根本的な部分で、商品1のsubmitをクリックすると商品1のみの情報、商品2のsubmitをクリックすると商品2の情報しか送られませんので、両方を同時にカートに入れることができません。 次のような感じですといかがでしょうか。 (検証はしていませんが、参考程度に・・・・) ■goods.php(フォーム部分のみ) <form action="cart.php" method="POST"> <?php for($i=1;$i<=2;$i++){//商品1~2のinputフォーム表示のためのループ ?> <p>商品<?php echo $i; ?><input name="num<?php echo $i; ?>" type="text" value="" /></p> <?php } ?> <p><input type="submit" value="カートに追加" /></p> </form> ■cart.php <?php session_start(); echo "<p>カートに入っている商品</p>\n"; for($i=0;$i<=100;$i++){ $str="num".$i; if(isset($_POST[$$str])){//商品iに入力があった? $num=mb_convert_kana(trim($_POST[$$str]),"n","UTF-8");//念のため半角数字に変換 if(is_numeric($num)){//入力値が数字? $_SESSION[$i]+=$num;//セッション変数に入力値を追加 } } echo "<p>商品".$i.":".$_SESSION[$i]."</p>\n"; } ?>

noguri999
質問者

お礼

ありがとうございます! できました。 $_POST[$$str] では動かなかったので $_POST["$str"] にしましたが、ばっちり動きました!! 本当にありがとうございます! 今回は$_SESSION[$i] = $num と言う形でしたが、よく考えてみると、数量とサイズを値として保持しないといけない場合が出てきそうなので、その場合配列にしないとけいないですよね・・・? そのときは $_SESSION[$i] = array($num, $size) てなかんじでしょうか? でそれを表示するときは echo $_SESSION[$i][0].$_SESSION[$i][1] とすれば数量とサイズが表示されますか? お礼ついでに更に質問していますが、どうぞよろしくお願いします!

関連するQ&A

  • PHPでセッションを使った受け渡しについて

    PHPでECサイトのカート機能を作っています。 まず商品一覧画面(index.php)にデータベースから読み取ったidとNAME、そして個数、サイズ、包装の有無のセレクトボックスを表示します。 それぞれの商品の追加ボタンを押すとカートのphp(t_cart.php)に飛んで上記の情報を全て表示できるようにしたいのですが、idとNAMEと個数の情報は受け渡せるのですが、サイズや包装の有無は別の商品を追加すると全ての商品の情報が上書きされてしまいます。 コードの一部を記載しておきます。 まだPHPを始めたばかりで初歩的な事がわからないのですが、ぜひ御知恵をお貸しいただければとおもいます。 よろしくお願いします。 ・index.php <table> <?php foreach ($Menu as $g) { ?> <tr> <td> <p class="Menu"><?php echo $g['id'] ?></p> </td> <td> <p><?php echo $g['NAME'] ?></p> </td> <form action="t_cart.php" method="post"> <td> <a>個数:</a> <select name="num"> <?php for ($i = 1; $i <= 10; $i++) { echo "<option>$i</option>"; } ?> </select> </td> <td> <a>サイズ:</a> <select name="size"> <option>S</option><option>M</option><option>L</option> </select> </td> <td> <a>包装:</a> <select name="deco"> <option>有</option><option>無</option> </select> </td> <td> <input type="text" name="id" value="<?php echo $g['id'] ?>"> <input type="submit" name="submit" value="go to cart"> </td> </form> </tr> <?php } ?> </table> ・t_cart.php <?php require 'common.php'; $rows = array(); $sum = 0; $pdo = connect(); if (!isset($_SESSION['cart'])){ $_SESSION['cart'] = array(); } if (@$_POST['submit']) { @$_SESSION['cart'][$_POST['id']] += $_POST['num']; } foreach($_SESSION['cart'] as $id => $num) { $st = $pdo->prepare("SELECT * FROM Menu WHERE id=?"); $st->execute(array($id)); $row = $st->fetch(); $st->closeCursor(); $row['num'] = strip_tags($num); $row['size'] = $_POST['size']; $row['deco'] = $_POST['dough']; $rows[] = $row; } ?>

    • 締切済み
    • PHP
  • ラジオボタンでうまくするには・・・・

    初めまして。 現在下記のプルダウン形式で、一つの価格が同じなので問題なく動くのですが <FORM action="cart/sys/cart.cgi" method="post"> <INPUT type=hidden value=005 name=num> <INPUT type=hidden value=●●● name=name> <INPUT type=hidden value=2000 name=tan> <SELECT name=sur> <OPTION value="" selected>購入数量</OPTION> <OPTION value=1>1</OPTION> <OPTION value=2>2</OPTION> <OPTION value=3>3</OPTION> <OPTION value=4>4</OPTION> <OPTION value=5>5</SELECT> <INPUT type=submit value=カートに入れる> </FORM><BR> <FORM action="・・・/cart.cgi" method="post"> <INPUT type=hidden value=005 name=num> <INPUT type=hidden value=●●● name=name> <INPUT type=hidden value=2000 name=tan> </FORM> 同じ商品で1・2・3・4・5のそれぞれに単価が変わる設定をしたいのですが、うまくいく方法が見つからないです。 ラジオボタン形式で作ってみたものの・・・・ <FORM action="・・・/cart.cgi" method="post"> <INPUT type=hidden value=005 name=num> <INPUT type=hidden value=●●● name=name> <INPUT type=submit value=カートに入れる> </FORM> <FORM> <INPUT type="radio" name="name1" value="2000">1袋<BR> <INPUT type="radio" name="name1" value="3900">2袋<BR> <INPUT type="radio" name="name1" value="5800">3袋<BR> <INPUT type="radio" name="name1" value="7500">4袋<BR> <INPUT type="radio" name="name1" value="8500">5袋</FORM> としてみましたがうまくいきません。 なにか方法ございましたら、ご教授いただければと思います。

    • ベストアンサー
    • HTML
  • php $_SESSIONで値が消える。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? どうぞよろしくお願い致します。           記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • for文でpostの値を受け取る方法

    以下のようなコードで、postで投げられた値を、for文で、添え字を組み立てて受け取って表示したいのですが、添え字の生成が間違っているのか、うまくいきません。 何を修正すればよいか教えてください。 <form action="" method="post"> <input type="hidden" value="A" name="name_0"> <input type="hidden" value="B" name="name_1"> <input type="hidden" value="C" name="name_2"> <input type="hidden" value="D" name="name_3"> <input type="submit"> </form> <?php for($i =0; $i < 4; $i++){ if (!empty($_POST['name_$i'])) { print $_POST['name_$i']; } } ?>

    • ベストアンサー
    • PHP
  • sessionの使い方について

    フレームhtmlで下記のPHPを読み込みします。 --menu.php-- <td height="73"> <form method="POST" action="main.php" target="sita"> <input type="image" src="img/jyusyo.gif" width="150" height="50"> <input type="hidden" name="step" value="1"> </form></td> <td height="73"> <form method="POST" action="main.php" target="sita"> <input type="image" src="img/kouza.gif" width="150" height="50"> <input type="hidden" name="step" value="2"> </form></td> ここまで--- --main.php <form method="POST" action="kakunin.php" target="sita"> <?php if(( $_POST["step"] == 1 ) or ( $_POST["step"] == "" )){ ?> 名前 <input type="text" name="name" size="43" value="<?php echo $name ;?>"> 住所 <input type="text" name="adress" size="43" value="<?php echo $adress ;?>"> <?php } ?> <?php if( $_POST["step"] == 2 ){ ?> <title>名前</title> 借入 <input type="text" name="kari" size="43" value="<?php echo $kari ;?>"> 返金 <input type="text" name="henkin" size="43" value="<?php echo $kenkin ;?>">   <?php } ?> <input type="submit" value="送信" name="B1"><input type="reset" value="リセット" name="B2"> </form> ここまで--- <input type="submit" value="送信" name="B1">でアクションを起こさない前でも sessionで値を保持する方法ありますか? 名前、住所などを入力し送信ボタンを押さないで、借入、返金等を入力すると 名前、住所、などは消えてしまいます。 何かいい方法ないでしょうか?

    • ベストアンサー
    • PHP
  • セッションの後に勝手に'/'が・・・

    PHPで携帯対応のプログラムを作っています。 セッションを使っているので、吐き出した内容で<form> 文のあとに セッションIDが負荷されるのはわかりますが そこに'/'までついてしまうので、'button'も'input'も全て無効になってしまいます。 (例) <form method="post" action='kakunin.php'> <input type="hidden" name="PHPSESSID" value="9999999999" />←ここでくくられるので <input type="text" name='myname'> ←機能しません まだ理解が不十分な為に基本的なことが欠落しているのかもしれませんが 対応策をご存知の方のお知恵を借りれたら幸いです。

    • ベストアンサー
    • PHP
  • 同一ページで複数のformを扱う場合

    同一のページ内にhiddenでIDを振った削除ボタンを用意しクリックされたIDを取得するにはどのようにすれば良いでしょうか? <form action="/test.php" name="1" method="post"> <input type="hidden" name="id" value="1" /> <input type="submit" name="delete" value="削除"> </form> -- 省略 <form action="/test.php" name="10" method="post"> <input type="hidden" name="id" value="10" /> <input type="submit" name="delete" value="削除"> </form> formにnameを振ってみても最後のIDがPOSTされてしまいます。

    • 締切済み
    • PHP
  • 選択された値をセッションで保存したい

    ラジオボタンで選択された値をセッションで保存し、DBまで持って行きたいのですが、どのようにすればよいでしょうか?なお、ラジオボタンからはPOSTで渡しています。どなたかわかる方ご教授お願いします。流れは【a.php => b.php => c.php => d.php => DB】c.phpにラジオボタンがあります。 [c.php]はこのような感じです。 <form name="form1" method="post" action="d.php"> <input type="radio" name="color" value="なし" >なし <input type="radio" name="color" value="赤">赤 <input type="radio" name="color" value="青">青 <input type="submit" name="Submit" value="送信">

    • ベストアンサー
    • PHP
  • ログイン時で、php+sessionについて

    普通のページは静的なhtmlなのですが、1ページだけログインページを付けています。 ログイン自体は問題ないのですが、普通のページは静的なhtmlなので、アカウントやパスは普通、データは渡せません。 できるのはphp+session(+javascipt)だけかな?と考えています。 1ページだけログインを付ける為にphpで作成しました。 問題は、html内にphp+sessionを使える方法を知りたいです。 IDやPASSの暗号化は分かっているので、その部分は今回スルーしてます。 変数名も書き方もバカなぐらい簡易化してます。 とにかくデータの渡し方を知りたいです。 ○test.html <form method="post" action="test.php"> <input type="text" name="id" id="id" value=""> <input type="text" name="pw" id="pw" value=""> <input type="submit" value="submit"> </form> ○test.php session_start(); session_name("id"); session_name("pw"); $_SESSION["id"]=$_POST["id"]; $_SESSION["pw"]=$_POST["pw"]; このIDとPASSをどうやったら、test.htmlのフォーム内に自動的に入れられるか、それがわかりません。 やっぱりjavascriptで、SESSIONを取得し、document.getElementByIdのinputか何かを使ってやるのでしょうか? 時間がないのですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • チェックボックスの値を引き渡し、戻して結果に準じて違うページに飛ばしたい

    チェックボックスで選択された結果によってそれぞれ別ページに飛ばしたい と思っております。色々とググッてみたのですがどうしてもできません。 お力をおかしいただけないでしょうか? <実現したいこと> ●チェックボックスに選択されたパターンにより、それぞれ別ページに飛ばしたい。 各商品には、商品IDがあります。 リンゴの商品番号は、001 みかんの商品番号は、002 メロンの商品番号は、003 ももの商品番号は、004 パイナップルの商品番号は、005 ●カートに入れるを押した際に飛ばすページは、http://www.example.com/cart/1234567&shouhinID=選択された商品番号 ※複数選択された場合は、そのまま選択された商品番号が足されていく。 ●チェックをせずにカートに入れるボタンを押した場合は、選択されていません。 とアラートがページに書き出されるかポップアップが上がる。 <ホームページの画面> ※四角がチェックボックスです。 □りんご □みかん □メロン □もも □パイナップル カートに入れるボタン 例えばリンゴとメロンが選択された場合、 カートに入れるボタンの遷移先URLは、 http://www.example.com/cart/1234567&shouhinID=001003 ということを実現したいと思っています。 あれこれ試行錯誤してこんな感じかなと思ったものがありますので 検討違いかもしれませんが書いておきます。 html ↓ <form name="shouhin_seisei" id="shouhin_seisei" method="post" action=""> <INPUT TYPE="checkbox" NAME="shouhin" VALUE="1"> <INPUT TYPE="hidden" NAME="shouhinID" VALUE="001">りんご <INPUT TYPE="checkbox" NAME="shouhin" VALUE="1"> <INPUT TYPE="hidden" NAME="shouhinID" VALUE="002">みかん <INPUT TYPE="checkbox" NAME="shouhin" VALUE="1"> <INPUT TYPE="hidden" NAME="shouhinID" VALUE="003">メロン <INPUT TYPE="checkbox" NAME="shouhin" VALUE="1"> <INPUT TYPE="hidden" NAME="shouhinID" VALUE="004">もも <INPUT TYPE="checkbox" NAME="shouhin" VALUE="1"> <INPUT TYPE="hidden" NAME="shouhinID" VALUE="005">パイナップル <p><a onClick="linkToshouhin('seiseiurl'); return false;" target="_blank"> <img src="カートに入れるボタン.jpg" width="511" height="78" /></a></p> </form> javascript ↓ // 決済URLの動的リンク処理 function linkToshouhin(type) { var hidden_form; var shouhinID; var link_url; hidden_form = document.getElementById("shouhin_seisei"); if(!hidden_form) { return; } ここからそれぞれの処理をしたいのですが分かりません。 最後に以下を追加しています。 ↓ link_url = 'http://www.example.com/cart/1234567&shouhinID='shouhinID; hidden_form.action = link_url; hidden_form.submit(); } 以上になります。 htmlで<p><a onClick="linkToshouhin('seiseiurl'); return false;" target="_blank"> と書いていますが、こうするとseiseiurlは文字列で渡してしまっていることになりますよね。 めちゃくちゃなことを書いているとは思いますが、どうかお力をお貸しください。

専門家に質問してみよう