• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ランダム表示させたあとその結果を受け取るには?)

ランダム表示させたあとその結果を受け取るには?

このQ&Aのポイント
  • 小テストのプログラムを作っています。6問ある問題の中からランダムに5問を出題させて、合計点と正解数を表示させることができました。
  • ただこのままでは回答者はどの問題を間違えたのかがわからないので、出題された問題と解説文を表示させたいのです。
  • 解決のヒントをお願いいたします。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

ヘッダとかセッションとかクッキーとか、httpのルールで いかなる出力より先に処理しなくてはいけません。 そのあたりはマニュアルをよく読んで学習してください なので、今回の処理もわざわざ2つにわけてあるのに気がつきませんか? 流れ的には以下を参考に <?PHP 初期処理 ?> <!DOCTYPE ・・・> <html> ・・・ <?PHP 出力処理 ?> ・・・ </html> としてください。

shenzongse
質問者

お礼

おかげさまでうまくプログラムが動きました。本当にありがとうございます。 初心者なのでうまくいかないことばかりでしたが、これから少しずつ上達していこうと思います。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>どうしてもエラーが出て実行できませんでした。 >教えていただいたプログラムを、1行目から138行目までと、141行目から150行目までの >2つをPHPファイルにしてみたのですが、この方法は間違っているのでしょうか? いえ、あっていると思いますが、ちょっと状況がわかりかねます 2つに分けた場合どちらのファイルの何行目にどのようなエラーがでますか? (私の環境ではエラーになりません)

shenzongse
質問者

補足

私のパソコンはMacですので、教えていただいたソースのままでは文字化けが起きてしまいます(エラーはでませんでした)。 ですので2つのファイル(mondai.phpとsaiten.php)の最初と最後に以下のHTML分を追加しています。 _______________ <!DOCTYPE HTML PUBLIC "-//w3c//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <BODY> </BODY> </HTML> _______________ すると次のようなエラーメッセージが出てきました。このメッセージの下には文字化けしていない問題文が2問表示されています。 _______________ Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Applications/XAMPP/xamppfiles/htdocs/mondai.php:9) in /Applications/XAMPP/xamppfiles/htdocs/mondai.php on line 10 _______________ 1ページ目の2問と2ページ目の2問をそのまま解答し、送信ボタンを押すと上記のメッセージの下に下記のエラーメッセージも表示されました。 _______________ Warning: Cannot modify header information - headers already sent by (output started at /Applications/XAMPP/xamppfiles/htdocs/mondai.php:9) in /Applications/XAMPP/xamppfiles/htdocs/mondai.php on line 120 _______________ ちなみにソースの10行目にはsession_start();、120行目にはheader("Location:saiten.php");があります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

乗りかかった舟・・・ <?PHP session_start(); function get_a_text($arr,$key){ foreach($arr as $arr2){ if($arr2["key"]==$key) return $arr2["text"]; } return false; } $mondai_at_page=2; //1ページ当たりの問題数 $max_kaitousuu=4; // 回答できる最大数 $tokuten_at_mondai=5; // 1問あたりの得点 $QA[]=array( "Q"=>array("id"=>1,"text"=>"質問A") ,"A"=>array( array("key"=>1,"text"=>"回答A-1") ,array("key"=>2,"text"=>"回答A-2") ,array("key"=>3,"text"=>"回答A-3") ,array("key"=>4,"text"=>"回答A-4") ) ,"R"=>1 ,"K"=>"○○だから、A-1です" ); $QA[]=array( "Q"=>array("id"=>2,"text"=>"質問B") ,"A"=>array( array("key"=>1,"text"=>"回答B-1") ,array("key"=>2,"text"=>"回答B-2") ,array("key"=>3,"text"=>"回答B-3") ,array("key"=>4,"text"=>"回答B-4") ) ,"R"=>2 ,"K"=>"○○だから、B-2です" ); $QA[]=array( "Q"=>array("id"=>3,"text"=>"質問C") ,"A"=>array( array("key"=>1,"text"=>"回答C-1") ,array("key"=>2,"text"=>"回答C-2") ,array("key"=>3,"text"=>"回答C-3") ,array("key"=>4,"text"=>"回答C-4") ) ,"R"=>3 ,"K"=>"○○だから、C-3です" ); $QA[]=array( "Q"=>array("id"=>4,"text"=>"質問D") ,"A"=>array( array("key"=>1,"text"=>"回答D-1") ,array("key"=>2,"text"=>"回答D-2") ,array("key"=>3,"text"=>"回答D-3") ,array("key"=>4,"text"=>"回答D-4") ) ,"R"=>4 ,"K"=>"○○だから、D-4です" ); $QA[]=array( "Q"=>array("id"=>5,"text"=>"質問E") ,"A"=>array( array("key"=>1,"text"=>"回答E-1") ,array("key"=>2,"text"=>"回答E-2") ,array("key"=>3,"text"=>"回答E-3") ,array("key"=>4,"text"=>"回答E-4") ) ,"R"=>1 ,"K"=>"○○だから、E-1です" ); $QA[]=array( "Q"=>array("id"=>6,"text"=>"質問F") ,"A"=>array( array("key"=>1,"text"=>"回答F-1") ,array("key"=>2,"text"=>"回答F-2") ,array("key"=>3,"text"=>"回答F-3") ,array("key"=>4,"text"=>"回答F-4") ) ,"R"=>2 ,"K"=>"○○だから、F-2です" ); $q=isset($_REQUEST["q"])?$_REQUEST["q"]:null; if(count($q)>=$max_kaitousuu){ $tokuten = 0; $kaitousuu = 0; $seikaisuu = 0; $kaisetu=""; foreach($q as $key=>$val){ if($kaitousuu>=$max_kaitousuu) break; foreach($QA as $arr1){ if($arr1["Q"]["id"]==$key){ if($arr1["R"]==$val){ $seikaisuu++; $tokuten += $tokuten_at_mondai; }else{ $kaisetu.="【解説】".$arr1["Q"]["text"]."<br>\n"; $kaisetu.="あなたの回答:".get_a_text($arr1["A"],$val)."<br>\n"; $kaisetu.=$arr1["K"]."<br>\n"; $kaisetu.="<hr>\n"; } break; } } $kaitousuu++; } $_SESSION["kaitousuu"]=$kaitousuu; $_SESSION["seikaisuu"]=$seikaisuu; $_SESSION["tokuten"]=$tokuten; $_SESSION["kaisetu"]=$kaisetu; header("Location:saiten.php"); exit; } ?> <form method="post"> <?PHP shuffle($QA); $q_no=1; $q_keys=array_keys((array) $q); foreach($QA as $arr1){ if(in_array($arr1["Q"]["id"],$q_keys)) continue; shuffle($arr1["A"]); print "問".($q_no+count($q))." ".$arr1["Q"]["text"]."<br>\n"; foreach($arr1["A"] as $arr2){ $id="q".$arr1["Q"]["id"]."_".$arr2["key"]; print "<INPUT type=\"radio\" id=\"".$id."\" name=\"q[".$arr1["Q"]["id"]."]\" value=\"".$arr2["key"]."\"><label for=\"".$id."\">".$arr2["text"]."</label><br>\n"; } if($q_no >= $mondai_at_page) break; $q_no++; } foreach((array) $q as $key=>$val){ print "<input type=\"hidden\" name=\"q[".htmlspecialchars($key)."]\" value=\"".htmlspecialchars($val)."\">\n"; } ?> <input type="submit" value="go"> </form> //saiten.php <?PHP session_start(); print "回答:".$_SESSION["kaitousuu"]."<br>\n"; print "正解:".$_SESSION["seikaisuu"]."<br>\n"; print "得点:".$_SESSION["tokuten"]."<br>\n"; print "<hr>\n"; print $_SESSION["kaisetu"]; ?>

shenzongse
質問者

補足

わざわざプログラムまで書いてお答えいただいて、ありがとうございます。 ただ、実際に試してみたところ、どうしてもエラーが出て実行できませんでした。 教えていただいたプログラムを、1行目から138行目までと、141行目から150行目までの2つをPHPファイルにしてみたのですが、この方法は間違っているのでしょうか? すみません。何とか自分で解決しようと思ったのですが、初心者で手に負えませんでした。 恐れ入りますが、もう一度アドバイスをいただけたらと思います。 どうぞよろしくお願いいたします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

セッション変数を用意しておき、各設問ごとに記録する。 結果表示時にセッション変数から読み出し講評する。 でどうでしょう?

関連するQ&A