これ何て呼びますか

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"]に保持されません。

どうすればどんどん商品をカートに追加できますでしょうか?
アドバイスのほどどうぞよろしくお願いします!

A 回答 (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も持ち方も考慮しなければなりません。
    • good
    • 0

根本的な部分で、商品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";
}
?>
    • good
    • 0
この回答へのお礼

ありがとうございます!

できました。

$_POST[$$str] では動かなかったので
$_POST["$str"] にしましたが、ばっちり動きました!!

本当にありがとうございます!

今回は$_SESSION[$i] = $num
と言う形でしたが、よく考えてみると、数量とサイズを値として保持しないといけない場合が出てきそうなので、その場合配列にしないとけいないですよね・・・?

そのときは

$_SESSION[$i] = array($num, $size)
てなかんじでしょうか?

でそれを表示するときは

echo $_SESSION[$i][0].$_SESSION[$i][1]

とすれば数量とサイズが表示されますか?

お礼ついでに更に質問していますが、どうぞよろしくお願いします!

お礼日時:2009/11/12 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!