質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

503閲覧

クイズのプログラム作成に苦戦しています。

nobodytolove123

総合スコア61

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/08/25 05:09

編集2017/08/25 05:50

PHPで回答した答えを表示するプログラムを作成しています。

望みとしてはshow_form部分で文字列を送信してnameを受けとると再度show_formを表示し
GETに送信した文字列をvar_dumpで表示する。
この処理を5回繰り返し、ループを抜けたら"失敗"が表示されるといったところです
それともう一点、回答を送信するたびに問{$rp}番の部分を増やして問1,2,3...と増やしていきたいです。

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHP Test</title> <link rel="stylesheet" type="text/css" href="/stylesheet.css"> </head> <body> <?php $rp = 1; $i = 0; $show_form = <<<END_OF <section class="section"> <h1 class="form-title">問{$rp}</h1> <form class="select-form" method="POST" action="test.php" autocomplete="off"> <ul class="select"> <input class="string" name='result[]' value=""> </ul> <input class="submit-btn" type="submit" value="submit"> </form> </section> END_OF; if(isset($_POST['result'])){ while($i < 5){ echo $show_form; var_dump($_GET); $i++; } } else{ echo $show_form; print "失敗"; }; ?> </body> </html>

問題としてsubmitが押されると内容が消えGETに回答が一つしか入りません。
sessionにGETに入っているnameを代入したりしましたが結果は変わりませんでした
$_SESSION['acc_counter'] = $_SESSION['acc_counter'] + 1;
を試しましたがカウンターは増えましたが他の関数に代入したりはできませんした。

僕だけでは難しいです、知恵を貸してください。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/08/25 05:14

<body>~</body> の中に$show_formをechoしてないのではなぜでしょうか?HTML文法的にアウトな場所に出力されていますよ。
nobodytolove123

2017/08/25 05:17

コメントありがとうございます!以前にheader関数を使っていたのでそのままにしてしましました、修正します
m.ts10806

2017/08/25 05:26 編集

要件が分かってないので幾つか確認したいのですが。。結局のところ何をどうしたいのでしょうか?(ざっくりですみません)初期表示時に「失敗」と出るので、おそらく冒頭の「やりたいこと」通りに出来てなさそうというのはわかるのですが・・・。変数名や関数名などを使わずに日本語で要件を箇条書きレベルで結構なので書き出してみませんか?それが基本設計となり仕様に落とし込めます。あと、 var_dump()はその場で変数の内容を出力するので、これもHTML的にアウトな場所に出力されます。
m.ts10806

2017/08/25 05:33

あと、送信するのは良いのですが送信した情報は維持されません。セッションも切れれば破棄されるので。データベースやファイルなど保存する仕組みは不要なのでしょうか?「問○」とありますが、実際の問題はどのように管理されているのでしょうか?
nobodytolove123

2017/08/25 05:34

わかりました、送信した答えを一定数解いていって(例えば35問)超えるまでは淡々とフォームが表示され回答を送信する、一定数を超えた場合に縦に送信した値をずらっと表示したいです。
m.ts10806

2017/08/25 05:37

なんとなく分かりました。(文言は「失敗」でいいのか疑問は残りますが)こちらでは埋もれてしまうので、質問本文にも追記願います。
m.ts10806

2017/08/25 05:38

「淡々と表示するフォーム」は1つだけでしょうか?これまでのフォーム全てでしょうか?
nobodytolove123

2017/08/25 05:42

はい、できたらページ内で処理を完結させてかったのですが...データベースやファイルを活用してみたいと思いました。問題管理は正直ほとんどないです、本を見て回答をパソコンに打ち込んで最終的に総回答を表示して答え合わせを行う目的でしたので管理といえば問題数の上限を条件文にするくらいです、タイトルのクイズというのは語弊がありました申し訳ありません
m.ts10806

2017/08/25 05:47

1つであれば「入力した内容」は何かに保存しておいた方が楽なのは楽ですね。フォーム送信もgetよりpostの方が良いです(超長い文字列には対応できないから)
m.ts10806

2017/08/25 05:51

たぶん結構作り直しな感じになるので少々お待ちください。
guest

回答2

0

ベストアンサー

セッションを使ってざっくり作ってみました。
セッションを使う場合だと、どこかでセッションをクリアしなきゃ再度解答できない感じになるので
完了画面でリセット機能つけてます。

あまり効率的なソースではないですし、解答かかれてないときのチェックとかはしてないですが、
おそらくこんな感じに動作させたいのかなというところは表現できたとは思います。
ただ、完全に合致しているかどうかは分からないので、あくまで参考程度にとどめ、自身の要件も踏まえて作りこんでいってください。
※ある程度何をしているかはコメントをつけています。読み込んで理解するのも質問者の成長になると考えていますので、コード詳細についての質問についてはお答えしかねますのでご了承ください。

php

1<?php 2session_start(); 3$question_max_count = 5; //問題数 4 5$show_result = null; //表示内容 6 7//現在の解答数 8if(!array_key_exists("question_count", $_SESSION)){ 9 //初回表示 10 $_SESSION["question_count"] = 1; 11} 12//解答結果を保持する配列 13if(!array_key_exists("answer_data", $_SESSION)){ 14 $_SESSION["answer_data"] = []; 15} 16//解答送信された 17if($_SERVER["REQUEST_METHOD"] == "POST"){ 18 //リセットか 19 if(array_key_exists("mode", $_POST) && $_POST["mode"] == "reset"){ 20 //セッションクリアして1から開始 21 $_SESSION = []; 22 $_SESSION["question_count"] = 1; 23 }else{ 24 //解答結果を保持 25 $_SESSION["answer_data"][$_SESSION["question_count"]] = $_POST["result"]; 26 } 27} 28 29//現在の番号が解答されていたら次へ 30if(isset($_SESSION["answer_data"][$_SESSION["question_count"]])){ 31 $_SESSION["question_count"]++; 32} 33 34//解答終了したか 35if($_SESSION["question_count"] > $question_max_count){ 36 foreach($_SESSION["answer_data"] as $question_num=>$result){ 37 $show_result .= "問{$question_num}:".htmlentities($result, ENT_QUOTES,'utf-8')."<br />"; 38 } 39 //再開用のリセットボタン 40 $show_form = <<< EOF 41 <form method="post" action="" autocomplete="off"> 42 <input class="submit-btn" type="submit" value="reset"> 43 <input type="hidden" name="mode" value="reset"> 44 </form> 45EOF; 46 47}else{ 48 $show_form = <<<END_OF 49<section class="section"> 50 <h1 class="form-title">問{$_SESSION["question_count"]}</h1> 51 <form class="select-form" method="post" action="" autocomplete="off"> 52 <ul class="select"> 53 <input class="string" name='result' value=""> 54 </ul> 55 <input class="submit-btn" type="submit" value="submit"> 56 </form> 57</section> 58END_OF; 59 60} 61 62echo <<< EOF 63<!DOCTYPE html> 64<html> 65<head> 66 <meta charset="utf-8"> 67 <title>PHP Test</title> 68</head> 69<body> 70{$show_form} 71{$show_result} 72</body> 73</html> 74EOF; 75

投稿2017/08/25 06:15

編集2017/08/25 06:31
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/08/25 06:28

質問者様へ追記 1つ何かを作ろうとしたときに「ロジックを考える」というところが大事になってきます。 そしてロジックを考える前には「仕様をきちんと整理する」ことが大事です。 いきなり作るのではなく、手書きでも良いので画面イメージを書き、動作イメージを文章で書いて、 そこからどのように組むのか(ロジック)を考えることでしっかりとしたものが出来上がります。 どのように組むか、どうすると効率的か、言語のどの関数・機能を使うか・・・などは経験やセンスが問われる部分となってはきますが、 考えて調べることによってその殆どをカバーでき、養える部分だと私は思っています。 今回提示したソースも1つのやり方です。もっと効率的でいいやり方はあると思いますし、自身に合ったやり方を見つけると成長は早まるでしょう。 ただ忘れないでいただきたいのが、私が質問して答えてもらった内容は作る前にまとめておくべき内容ということです。 私がヒアリングして質問者様に答えていただいた内容を仕様として私が作った物になります。 つまり、仕様がしっかりしていないのとプログラムはいつまでも完成しないということです。 がんばってください。
nobodytolove123

2017/08/25 06:39

とても勉強になります、確かに作ってからイメージを起こすことが多かったです。 それでこんなひどい事態に陥ってしまったのかもしれません、これから改善していきたいと思います。 本当にありがとうございました!
m.ts10806

2017/08/25 06:44

PHPは他のプログラム言語と比べて結構自由な記述が可能で、簡単に動かせることができます(悪く言えば適当に書いても大体いい感じに解釈してくれて動く) だからこそ作り始める前のイメージ作りが大事だったりします。
nobodytolove123

2017/08/25 06:52

今の僕からはイメージだけで細かい設計は難しいです、修行あるのみですね。
m.ts10806

2017/08/25 07:00

細かいところは作りながらでいいんですよ。 このボタンを押したらこうなるという操作の大きな流れ(ワイヤーフレームとい言われる部分)を書き出すのが最初です。 今回で言うと 1.画面の初期状態は問い1の解答入力フォームがある 2.解答入力フォームには解答を自由に入力できる 3.送信ボタンを押したら解答を送信、保管して、次の問いの入力に移る 4.上記を問題数分繰り返す 5.最後まで解いたら今までの入力した解答を表示して終了 みたいな感じですかね。 どう保管するか、「次の問い」をどう実現するか・・・は詳細設計からコーディングの時にすることなので、 こちらは組みながらやるので構いません。
nobodytolove123

2017/08/25 07:09

なるほど、実際に上記の流れは少しはわかってはいたもの どう繰り返す、保管するのところが不透明なままでした、、肝心のコーディング知識が欠けているのも問題みたいです。
m.ts10806

2017/08/25 07:13

その辺りは何度も作って、色々調べて考えて時には盗んで経験積むのが一番です。 teratailはある程度作ってから分からない部分をやりたいことと作ったソースを提示して質問する場所です。 どんどん使って色んな技術者の知識や技術を吸収していきましょう。 あと、teratailにあがってくる質問に回答してみるのも1つの成長の手段です。 時に間違っても訂正とか指摘をしてくれる人は必ずいるので、利用しない手はありません。
guest

0

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="utf-8"> 5 <title>PHP Test</title> 6 <link rel="stylesheet" type="text/css" href="/stylesheet.css"> 7</head> 8<body> 9<?php 10 11$show_form = <<< END_OF 12 <form class="select-form" method="POST" action="test.php" autocomplete="off"> 13END_OF; 14 15 16$_result = isset($_REQUEST['result']) ? $_REQUEST['result'] : []; 17 18$rp = 1; 19if(isset($_REQUEST['data'])) { 20 $_result[] = $_REQUEST['data']; 21} 22 23foreach($_result as $key => $value) { 24 $rp++; 25 $show_form .= <<< END_OF 26 <input type="hidden" name="result[]" value="{$value}"> 27 28END_OF; 29} 30 31 32$show_form .= <<< END_OF 33 <section class="section"> 34 <h1 class="form-title">問{$rp}</h1> 35 <ul class="select"> 36 <input type="text" class="string" name="data" value=""> 37 </ul> 38 </section> 39 <input class="submit-btn" type="submit" value="submit"> 40 </form> 41END_OF; 42 43echo $show_form; 44 45var_dump($_result); 46?> 47</body> 48</html>

こんな感じのことをしたいのかな

投稿2017/08/25 05:53

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobodytolove123

2017/08/25 06:47

まさにこのイメージです!、自分の勉強不足にただ落ち込んでいます。。。 本当にすごいです、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問