SESSION配列の使い方は?

WBOY
WBOYオリジナル
2016-06-23 14:11:571209ブラウズ

コードは次のとおりです
...データベース接続部分

while($row=mysql_fetch_array($myquery)){
$arrayid[]=$row[id]; $array[]= $row[question];
...対応する列を対応する配列に代入します
$cnt=count($arrayid)

$answer[]=$_POST['style1'];
$_SESSION[]= $answer;//何か問題がありますか?>


echo
" ".
"A." . $arrayA[$i]."".
````` ``````` ``オプション B、C、D は省略します
?>

オンライン質問応答システムを作成しており、$answer[] 配列を通じて各ユーザーのオプションを受け取ります。 $_SESSION[] 配列を使用してユーザーのオプションをバッチで保存したい (つまり、ユーザーの回答結果を一度に保存する)
[送信] をクリックすると、ページはグループではなく、一度に 1 つの多肢選択の質問を読み取ります。 「同じページ」になります 次の質問を更新します。つまり、クリックして送信するたびに、ページが更新されるのと同じことになります。$_SESSION[] のメカニズムでは、送信されたデータは 1 回しか記録できず、2 回目に送信されたデータが最初のデータを上書きする可能性があります。
合計 2 つの方法を試しましたが、読み取りは成功しませんでした。
方法 1:
$answer[]=$_POST['style1'];

for($i=0;$i<$cnt; $i++) { 0] には、ユーザーが送信した回答が含まれます。 $_SESSION[] に値を割り当てた後、$_SESSION[1] のみが回答を含み、他のキー値には回答がありません。
出力結果
配列 ( [1] => A [2] => [3] => [4] => [5] => )

方法 2:
$answer=$ _POST[ 'style1']; ここでの $answer は配列ではなく変数であることに注意してください
$i = $i+1;
$_SESSION[$i]=array("id"=>$i,"answer"=>) ;$answer);
print_r($_SESSION);
目的は、$_SESSION を使用して 2 次元配列を作成することであり、id は質問番号を記録するために使用され、answer はオプションを記録するために使用されます。
各質問の出力結果は
Array ( [0] => Array ( [id] => 0 [answer] => ) ) 送信ボタンがクリックされていない
Array ( [1] => Array ( [ id] => 1 [answer] => A)) 送信ボタンを 1 回クリックすると、質問番号 1 とユーザー オプション A が記録されます...

しかし、すべての多肢選択式の質問に答え終わると
print_r ($_SESSION[5 ]);
($_SESSION[4]); を出力する場合、$_SESSION[5] のみが値を持ちます。これは、$_SESSION[$i には最後の質問しかないことを意味します。 ]。
$_SESSION[1]??$_SESSION[4] の値はどこに行くのですか? なぜ記録されないのですか?



何か良い方法を考えたり、変更を提案したりするのを手伝ってください




























返信 ディスカッション (解決策) )

送信を受け取るたびに、
$_SESSION[] = $_POST;

識別しやすいように、質問番号を付けてフォームを送信することをお勧めします


$_SESSION の値を
$_SESSION=array("id"=>$_POST['i'],"answer"=>$_POST['style1']); に変更します
配列を再度作成します。
$array=array("id"=>"","answer"=>"");
$_SESSION と $array を $result に再帰的にマージします
$result=array_merge_recursive($_SESSION,$array);最初の質問を読むとき、両方の配列には値がないため、出力結果は次のようになります。
Array ( [id] => [answer] => ) //SESSION
Array ( [id] => [answer] => ) //ARRAY
Array ( [id] => Array ( [0] => ) [answer] => Array ( [0] => ) )//RESULT
最初の質問を送信し、質問を読み上げます2 番目の質問
Array ( [id] => 1 [answer] => A )
Array ( [id] => [answer] => )
Array ( [id] => Array ( [0] => 1 [1] => ) [答え] => Array ( [0] => A [1] => ) )

2 番目の質問の答えを質問と組み合わせたい場合3 番目の質問に回答と質問番号を追加したい場合は、
$result2=array_merge_recursive($_SESSION,$result1) が必要です。
ここでの問題は、
$result1 をどこにでも置くのが適切かどうかです。そうするのは、N 個の質問がある場合、N-1 個の $result が必要だからです




実際の調査プロジェクト (オフラインおよびオンライン) をまったく行っていないですよね?

アンケートと回答用紙をマージする必要はありません。マージの機能は、最終出力レポートでデータベース (アンケート部分) を一度読み込む手間を省くだけです。

たとえ中間の統計処理がアンケートを無視したとしても、回答用紙もデータベースに保存されていればさらに不要です

また、アンケートの質問数が多ければ人間ではなく機械が回答することになります。
一般的には、それを一度読み出してセッションに入力し、その後、調査のニーズに応じて、端末が質問を 1 つずつまたは一度に出力するだけで十分です。特殊な場合は、後続の質問が不確実で (質問バンク)、前の回答に関連している (ジャンプと分岐が大きく、論理関係が複雑である) ため、各質問をバンクから読み取る必要があります

に基づいています一般的に上記の 2 点 --> 質問を一度読んでセッションに記録し、回答を 1 つずつセッションに記録します
特殊な場合は、質問を読むたびに ID をセッションに記録します
基本原則は、質問は読まれたときにセッションに記録され、クライアントが質問に答えた後にセッションに記録するのではなく、クライアントに送信するだけです

とても簡単です。 1. セッション内の回答を格納する配列を取り出し、それを一時配列 $answer に割り当てます
2. 前のページで送信された回答を取り出し、$answer とマージして $new_answer に追加します
; 3. $ を上書きします。 new_answer を回答を保存するセッション配列に追加します

4. 次の質問を表示します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。