スレッド表示 | フラット表示〕 全トピック 920 件中 603 番目 次≫ ≪前

セッションの使い方について

created: 2004-05-25 11:17 | modified: 2004-05-27 12:10 | reply: 4

[1610] セッションの使い方について

user: kuro | created: 2004-05-25 11:17
初めて投稿させていただきます。kuroです。
現在PHPをCGI版で作成中で、セッションの使い方で詰まってしまいました。

if($mode == "menu"){
menu();
}elseif($mode == "shohin"){
shohin();
}elseif($mode == "kakunin"){
kakunin();
}
今までの流れは「メニュー」→「商品選択」→「確認画面」で、
backボタンも付けていまして、backボタンを押すと一つ前のページに
戻るようにformのsubmitで飛ばしています。(history.backは利用していません。)
この場合だとセッションをしようしていてもきちんと動作してくれていました。
しかし、メーカー選択の画面でリストボックスを使用して、同じページ内に
リンクで飛ぶということを追加した為に、この動作を行うと一度ページを
再読み込みしたような形になる為に、セッションデータが消え、今まで入力していた
フォームの中身もからっぽになってしまうのです。

今のソースは以下のような感じです。

function shohin(){

$s_suryou = $_SESSION['s_suryou'];

<form>
<input type="hidden" name="mode" value="check">

<form name="maker">
<select name="maker">
<option value="./index.cgi?mode=shohin#maker1">メーカー1</option>
<option value="./index.cgi?mode=shohin#maker2">メーカー2</option>
<option value="./index.cgi?mode=shohin#maker3">メーカー3</option>


</select>
<input type="button" value="選択" onClick="location=document.maker.maker.options[document.maker.maker.selectedIndex].value">
</form>

<a name="maker1">
<table>
<tr>
<td>
メーカー1
</td>
<td>
商品名1
</td>
<td>
<input type="text" name="suryou[0]" value="$s_suryou[0]">
</td>
</tr>
<tr>
<td>
メーカー1
</td>
<td>
商品名2
</td>
<td>
<input type="text" name="suryou[1]" value="$s_suryou[1]>
</td>
</tr>
</table>

<a name="maker2">
<table>
<tr>
<td>
メーカー2
</td>
<td>
商品名1
</td>
<td>
<input type="text" name="suryou[2]" value="$s_suryou[2]>
</td>
</tr>
<tr>
<td>
メーカー2
</td>
<td>
商品名2
</td>
<td>
<input type="text" name="suryou[3]" value="$s_suryou[3]>
</td>
</tr>
</table>

<input type="submit" value=" OK ">
</form>
<form action="$i_url" method="$method">
<input type="hidden" name="mode" value="menu">
<input type="submit" value="BACK">
<form>

//ここでセッション情報を破棄
session_unregister("s_suryou");

}

function kakunin(){

//セッションに数量を記憶
for($i=0; $i<$rowcnt; $i++){
$_SESSION['s_suryou'] .= "$suryou[$i]" . "<>";
}

以下確認画面表示



}

今のままだと再読み込みされた時にセッションデータが消えることは解るのですが、
この状態でうまく消えないようにする方法が無いかと思い投稿させて頂きました。
セッションにころころと変わるデータを入れるのは好ましくないということは解るのですが、
他に良い方法がわからなかった為にセッションの力に頼ってしまいました。

長くなってしまいましたが、このような場合もっと良い方法・指摘などありましたら、
教えていただけませんでしょうか。よろしくお願い致します。
reply: 1612 返信 編集 削除

[1612] 案)確認画面以降の処理で破棄する

user: ゆうじ | created: 2004-05-25 13:45
コードを読みきれてないのかもしれませんが、
この処理の流れからすると、
セッションを破棄するタイミングを、
確認画面よりも後でも良いように思うのですが。

menu() が呼ばれた時に、
セッションがあれば破棄してしまうとか、
はじめに破棄するというのもひとつの手かも。
Parent: 1610  reply: 1613 返信 編集 削除

[1613] Re:案)確認画面以降の処理で破棄する

user: kuro | created: 2004-05-25 14:48
ゆうじさん。返答ありがとうございます。
普通の流れで商品の数量を登録する場合だと、
ゆうじさんが仰るとおり確認画面の後でセッションを破棄しているのですが、
今回の場合、新たに追加したリストボックスを使った場合にページ内リンクする為に
一度再読み込みに似た形になる為、フォームの内容(セッションで記憶したデータ)が
消えてしまうのです。

ページ内リンクをした場合でもセッションのデータがうまく残る為の方法が
ありましたら、ご教授できませんか。
Parent: 1612  reply: 1621 返信 編集 削除

[1621] maker1 だけにする

user: ゆうじ | created: 2004-05-26 22:32
遅くなりました。

よくよく考えてみたらページ内の移動なので、
option に設定するURIを maker1 だけにすればよいのでは。

<option value="./index.cgi?mode=shohin#maker1">メーカー1</option>



<option value="maker1">メーカー1</option>


Parent: 1613  reply: 1623 返信 編集 削除

[1623] 解決しました。

user: kuro | created: 2004-05-27 12:10
ゆうじさん返答ありがとうございます。

optionに設定するURLをmaker1だけにしたらきちんと動作してくれました。

POSTで動かなかったので、
一部GETに変更して、mode以外の変数をひとつfunctionを間に入れてそのfunction内で
セッションにデータを格納するといった無茶な方法でなんとか、うまく行っていたのですが、
やはりGETと言うのが自分的になるべくなら使いたくなかったものでして、、、。

maker1だけに変更したらPOSTでもきちんと動作してくれました。

本当にありがとうございました。
ひとつ勉強になりました。
Parent: 1621  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 603 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑