phpについてセッション管理の勉強中です。

セッションを利用したショッピングカートを作っています。

カートに商品を追加し、さらに商品の追加をする際に前のデータを上書きし新たに追加した商品の小差だけが表示される状態です。

どこを直したらいいのでしうか。
よろしくお願い致します。


session_start();

if(!isset($_SESSION["desgin"])){
$_SESSION['desgin']= $desgin ;
}else{
$flg = false;
if(!$flg) {
$_SESSION["desgin"] = $desgin;
}
}
echo "<p>".$_SESSION["desgin"];

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/07/10 17:25:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Bombastus No.1

回答回数409ベストアンサー獲得回数52

ポイント39pt

質問文でよく分からない部分がありますので、教えて下さい。

  1. 「さらに商品の追加をする際に前のデータを上書きし新たに追加した商品の小差だけが表示される」の「小差」とはどういう意味でしょうか?
  2. 変数 $flg はどのような目的で使っているのでしょうか? ご質問のソースですと、下記の部分は常に実行されるので if 文の意味がありません。
$flg = false;
if(!$flg) {
$_SESSION["desgin"] = $desgin;
}

以上、よろしくお願いします。

http://q.hatena.ne.jp/

id:kasai-de_eb

1.すみません。入力みすでした。

 さらに商品の追加をすると、前のデータを上書きし新たに追加した商品の(詳細)データだけが表示される が正しいです。

2.参考書にかいたあったいらない部分を削って作成をしていましたが、$flg は削っていいのかがわからずこのしたあるだけです。

2010/07/03 21:19:48

その他の回答3件)

id:Bombastus No.1

回答回数409ベストアンサー獲得回数52ここでベストアンサー

ポイント39pt

質問文でよく分からない部分がありますので、教えて下さい。

  1. 「さらに商品の追加をする際に前のデータを上書きし新たに追加した商品の小差だけが表示される」の「小差」とはどういう意味でしょうか?
  2. 変数 $flg はどのような目的で使っているのでしょうか? ご質問のソースですと、下記の部分は常に実行されるので if 文の意味がありません。
$flg = false;
if(!$flg) {
$_SESSION["desgin"] = $desgin;
}

以上、よろしくお願いします。

http://q.hatena.ne.jp/

id:kasai-de_eb

1.すみません。入力みすでした。

 さらに商品の追加をすると、前のデータを上書きし新たに追加した商品の(詳細)データだけが表示される が正しいです。

2.参考書にかいたあったいらない部分を削って作成をしていましたが、$flg は削っていいのかがわからずこのしたあるだけです。

2010/07/03 21:19:48
id:ko8820 No.2

回答回数1221ベストアンサー獲得回数69

ポイント1pt

http://joho.boo.jp/memo/writer.cgi?mode=detail&no=51

セッションに配列形式で入れてみては?

id:Bombastus No.3

回答回数409ベストアンサー獲得回数52

ポイント25pt

2.参考書にかいたあったいらない部分を削って作成をしていましたが、$flg は削っていいのかがわからずこのしたあるだけです。

申し訳ありませんが、スクリプトの全体を教えていただかないと何とも言えません。


質問文にあるスクリプトを見る限り、if文で条件分岐している意味がなく、常に

$_SESSION["desgin"] = $desgin;

が実行されます。


http://q.hatena.ne.jp/

id:kasai-de_eb

お返事ありがとうございます。

詳細の選択画面

<form method="post" action="a.php">

<select name="desgin" id="desgin">

<option value="090001">090001</option>

<option value="090002">090002</option>

</select>

<input name="" type="submit" value="送信">

</form>

上記で選んだものを買い物かごへ入れる動作をしたいのです。

買い物かご側は

$sql = "select * from item WHERE item1 = '" . mysql_real_escape_string($_POST['desgin']) . "'" ;

$result = mysql_query($sql) ;

$row = mysql_fetch_assoc($result) ;

$desgin = $_POST['desgin'] ;

session_start();

if(!isset($_SESSION["desgin"])){

$_SESSION["desgin"][]=$desgin;

}

echo "

".$_SESSION["desgin"];

この状態だと、1個目に入れた内容が上書きされ、新たに追加した商品の(詳細)データだけが表示される状態です。

2010/07/05 16:55:44
id:doropon No.4

回答回数94ベストアンサー獲得回数16

ポイント25pt

んー、ちょっと理解できていないのですが、

1つめの商品をカートに入れる。

2つ目の商品をカートに入れる。

で、カートの中身が、

1つめと2つめの両方入っているという風にするならば、

$_SESSION["desgin"][]=$desgin;

と流れを作ればできます。

session_start();

$_SESSION['desgin'][]= $desgin ;

foreach($_SESSION["design"] as $val) {
echo "<p>".$val."</p>";
}

ifが無いのは、必ず新しく追加されるからなのですが、

既に入っているものと同じものが来た場合の処理など考えると、

ハッシュの中身を検索する処理が必要です。

現状では、同じ変数

$_SESSION["design"]

に上書きしてしまっているので、一つだけになります。

もうちょっと情報があると、お伝えできることも変わるかと思います。

とりあえず、どうしたいのか。ですかね。

http://q.hatena.ne.jp/1278145397

id:kasai-de_eb

有難うございます。

session_start();

$_SESSION['desgin'][]= $desgin ;

foreach($_SESSION["design"] as $val) {

echo "

".$val."

";

}

を代入すると「$_SESSION['desgin'][]= $desgin ;」のラインにエラーができます。

下記に分を添付いたします。

お手数ですが、みて頂けるとありがたいです。


詳細の選択画面

<form method="post" action="a.php">

<select name="desgin" id="desgin">

<option value="090001">090001</option>

<option value="090002">090002</option>

</select>

<input name="" type="submit" value="送信">

</form>

上記で選んだものを買い物かごへ入れる動作をしたいのです。

買い物かご側は

$sql = "select * from item WHERE item1 = '" . mysql_real_escape_string($_POST['desgin']) . "'" ;

$result = mysql_query($sql) ;

$row = mysql_fetch_assoc($result) ;

$desgin = $_POST['desgin'] ;

session_start();

if(!isset($_SESSION["desgin"])){

$_SESSION["desgin"][]=$desgin;

}

echo "

".$_SESSION["desgin"];

この状態だと、1個目に入れた内容が上書きされ、新たに追加した商品の(詳細)データだけが表示される状態です。

2010/07/05 16:55:52
  • id:doropon
    あ、ああ、すいません、私のスペルミスが混ざってます。
    $_SESSION['desgin'][]= $desgin;
    なら
    foreach($_SESSION['desgin'] as $val){
    です。すいませんが、ハッシュの文字列の統一をお願いします。


    で、すいません、わかりにくいかとは思うのですが、日本語がイマイチで申し訳ない。

    if(!isset($_SESSION["desgin"]))
    の部分ですが、
    $_SESSIONのdesginというハッシュは存在しない。
    場合に
    $_SESSION["desgin"][]=$desgin;
    が実行されます。
    このスクリプトを同じブラウザの中でセッションが切れるまでの間、
    最初の1回目。ここは実行されますが、
    2回目からは実行されません。

    カートに入っているものは、
    $_SESSION['desgin'][0]から0の部分が順番に一つずつ増えて格納されます。

    なので、ここで、
    $_SESSION['desgin']
    を評価、issetで見ても、がわは存在することまではわかりますが、
    中に入っているものはわからないので、ハッシュの存在までしかわからず、
    で、存在だけを評価してしまっているので、
    追加されないで終わっています。
    のはずなので上書きされているというところがちょっとおかしいかなと。
    いうところと、
    echo "".$_SESSION["desgin"];
    って部分で、echoでこの変数の中身表示されます?
    されないはず、というか、Arrayって出てくるはずです。
    別のところで代入しちゃっているのかもしれないですね。

    カートは配列というかハッシュにして商品を入れる形になるので、
    中に入っているものを確認するのに、
    echo $_SESSION["desgin"];
    だと、この下は配列だと。言われてしまいますので、
    foreachでまわして表示させます。

    知りたいことと本に書いてあること、そのうえで私が言っていること、他の方が仰っていることが、
    混ざって理解しにくいかもしれませんが、

    とりあえずは、
    複数の商品を持とうとする場合は、配列にいれる。
    配列の表示はforeachで行う。(他でも出来ますがとりあえず。)
    です。

    SQLの部分で持ってきているものも、使われていないみたいなので、
    まず、シンプルにして動きを確認されることをお勧めです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません