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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

Q&A

解決済

3回答

1560閲覧

繰り返し文がよくわかりません

s1522001hs

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

0グッド

0クリップ

投稿2016/12/07 01:37

###前提・実現したいこと
foreachを使ってcsvの問題をループして出しています
最初のifはうまく動くのですがelseif以降がうまく動いてくれません
1問目をループしてしまいます
ラジオボタンを選択して送信したら2問目、3問目を表示したいのですがどうしたらいいのでしょうか
###該当のソースコード

echo"<form method='post' action=''>";//現在の問題番号を持ってきたい if(empty($_POST)){//ポストの中が空の時の処理(一問目) foreach ($ans_arr as $k=>$answer) { $num = $k + 1; $next = $qnum ; $qry = (isset($dat[$next+1])) ? "q=".$next : "end=1"; // 各質問の答え選択HTML echo <<<Q_BODY <div class="choices"> <input type='radio' name='quiz' value="quiz.php?{$qry}&a={$qnum}_{$num}&t={$tid}" accesskey="{$num}">{$num}. {$answer} <input type="hidden" name="quiz" value="$next"> </div> Q_BODY; }//foreach }else if(isset($_POST['quiz'])){//2問目以降(100問まで) foreach ($ans_arr as $k=>$answer) { $quiz2 = $_REQUEST['quiz'];//ラジオボタンの結果をもらう $quiz = $k + 1; $next = $qnum + 1; $qry = (isset($dat[$next+1])) ? "q=".$next : "end=1"; // 各質問の答え選択HTML echo <<<Q_BODY <div class="choices"> <input type='radio' name='quiz' value="quiz.php?{$qry}&a={$qnum}_{$quiz}&t={$tid}" accesskey="{$quiz}">{$quiz}. {$answer} <input type="hidden" name="quiz" value="$next"> </div> Q_BODY; }//foreach print "<br>前の解答"; print "<br>正解は<br>$quiz.$answer<br>"; } echo"<input type='submit' class='btn' value='送信'>"; echo"</form>";

###試したこと
ラジオボタンでnameを取得し、送信させるという作業をループで動かそうと思いソースコードを書いたのですがうまくいきませんでした
説明が下手で大変申し訳ございません
どなたかご教授お願いします

###補足情報(言語/FW/ツール等のバージョンなど)
php csv

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

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

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

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

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

guest

回答3

0

ベストアンサー

最初のifはうまく動くのですがelseif以降がうまく動いてくれません

1問目をループしてしまいます

これは一問目を送信して二問目以降を表示すべき時に一問目がループするということでしょうか?
つまり、送信したあとも同じ問題がWEBページに出力されるのでしょうか。
だとするとPOSTが飛んでいないという可能性が高いですが、こちらで検証するとPOSTは正常に飛んでいるので分岐自体に問題ないようです。

また、検証方法としてはifの中に印をつけるといいです。

if(empty($_POST)){//ポストの中が空の時の処理(一問目) echo '一問目'; }else if(isset($_POST['quiz'])){//2問目以降(100問まで) echo '二問目以降'; }

まずは上記の状況を確認してみて下さい。

投稿2016/12/07 01:59

nobinobi

総合スコア199

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

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

s1522001hs

2016/12/07 02:18

解答ありがとうございます 質問された通り一問目をループし、WEBページで同じ問題が出力されてしまいます 教えてもらったものを試させていただきました echoの部分は問題なく表示されました csvの表示の仕方がうまくいっていないことがわかりました ありがとうございます
nobinobi

2016/12/07 02:38

では次に確認すべきは「$next = $qnum + 1;」でしょうか。 この$qnumはどこで前回の値を代入しているのでしょう。
s1522001hs

2016/12/07 02:49

私が公開したif文より前のところで $qnum = (int)$_GET['q']; $tid = (int)$_GET['t']; $anum = $_GET['a']; という処理を行なっています $qnum = (int)$_GET['q'];で問題数を取得していて <span class="question">Q{$qnum}. {$question}</span><br /><br />←これで Q1.問題文 と表示できるので ここに$qnum + 1;をしています
nobinobi

2016/12/07 03:09

ありがとうございます。 では次は$_POST['quiz']を確認下さい。 記載頂いているコードではradioとhiddenにどちらも同じnameが指定されています。 コード上、取得は$_REQUESTでしていらっしゃいますが、formのmethodはpostですので実際にはpostメソッドでの取得になります。 まずは「quiz」とname指定した要素の値全てが意図通りになっているかを確認下さい。
s1522001hs

2016/12/07 03:24

ありがとうございます radioとhiddenのnameを別々にするためにhiddenの方を仮でquizsに変えさせていただきました hiddenはif文で使うので意図通りに動いています ラジオボタンのnameも一つだけの選択になっていたので今のところはできています 何度もコメントしていただきありがとうございます
nobinobi

2016/12/07 04:03

分かりました。 あとは$ans_arr回す処理だけだと思いますので、$ans_arrの中身に問題がなければ表示方法を見直せば大丈夫かと思います。 一気にいろいろな事を調べると大変ですので、まずは大きなくくりから徐々に細部へと確認していけば解決できるかと思います、頑張ってください。 $ans_arrの部分やその他、分からない事などあればコメント下さい。
s1522001hs

2016/12/07 04:11

細かいところまで詳しく教えてくださりありがとうございます $ans_arrについて見直していきたいと思います またお世話になるかもしれませんがその時は宜しくお願いいたします ご教授ありがとうございました 一応一区切りということでベストアンサーに選ばせていただきます
guest

0

name="quiz"で受け取るパラメータがどんななのか、
仕様がブレているのかうまくいかなくてデバッグ的にコードがおかしいのか、
失礼ですがこのままコードをいじるのが嫌になってきます。

受け取るべきパラメータとして考えられるのが、
・現在の設問番号
・現在の設問に対する回答番号
が最低必要そうに見えて、あと仕様がどうかわからないのですが
・直前までの設問の回答、もしくはスコア?
も受け取るのではないかと察します。

それらをどういうパラメータ名で受け取るか、
仕様を整理してみてはいかがでしょうか。

現状示されているトリッキー(?)なコードを活かそうと
敢えて難しくコードを編み上げるよりも、
仕様を簡素化してシンプルなコードで組んでみて
それでもダメならお伺いを立てるって方が健全で得るものも大きいと思います。

(トリッキーとみなしたのは、ラジオボタンのvalueにurlエンコードか何かで複雑にパラメータを持たせようとしている部分で、
おそらくhiddenパラメータを駆使して分割してシンプルに送信したほうが簡単じゃないでしょうかね。)

1問目かどうかの判定にempty()を使ってますが、
私なら逆に2問目以降に必要なパラメータが足りないケースすべてが1問目とみなします。
if (!isset(_POST['xxx']) && !isset(_POST['yyy']) && !isset(_POST['zzz']) && ~)
みたいな判定文ですかね。

設問の終了は設問データCSVの最後の項目かどうかで判定できるので、
わざわざPOSTデータで受け取らなくてもいいですね。
POSTで受け取る設問番号がラス1直前だったら、みたいな分岐を組めるはずです。

投稿2016/12/07 03:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

s1522001hs

2016/12/07 03:27

まだまだ勉強不足で申し訳ありません 教えていただいた判定文も試させていただきます
guest

0

$_POST['quiz']はどこで設定しているのでしょうか?設定していなければ

PHP

1if(isset($_POST['quiz'])

以降は通りませんよ。

投稿2016/12/07 01:50

wakame_taishi

総合スコア73

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

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

s1522001hs

2016/12/07 02:03

1問目のifの中でラジオボタンのname= 'quiz' をPOSTで受け取り送信するという作業をしていて受け取ったらif(isset($_POST['quiz']))へいこうと思っていたのですがphpの書き方を間違っていたでしょうか? 説明の仕方が下手で申し訳ございません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問