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

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

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

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

Q&A

解決済

1回答

4846閲覧

配列をhiddenでpostして受け取れない。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

2クリップ

投稿2021/05/20 13:58

php

1if (isset($_POST['now'])){ 2$now += $_POST['now']; //hiddenで送られた正解を受け取る 3$tensuu = $_POST['tensuu']; //hiddenで送られた点数を受け取る 4$score = $_POST['score']; //hiddenで送られた正解を受け取る 5$count = $_POST['count']; //countを受け取る 6$question = $_POST['question']; //選んだ選択肢を受け取る 7$log1 = $_POST['log1']; //log1を受け取る 8 9//結果の判定 10if($question1 == $log1[$count][0]){ 11$score += $log1[$count][8]; 12$result = "正解!答えは".$log1[$count][0]."です。"."説明:".$log1[$count][7]."今の合計点数は".$score."点"; 13}else{ 14$result = "不正解・・・。答えは".$log1[$count][0]."です。"."説明:".$log1[$count][7]."今の合計点数は".$score."点"; 15} 16} 17 18 19$count++; 20 21$title = $log1[$count][0]; 22 23$question = array($log1[$count][1],$log1[$count][2],$log1[$count][3],$log1[$count][4],$log1[$count][5],$log1[$count][6]); //6択の選択肢を設定 24 25$answer = $question[0]; //正解の問題を設定 26 27shuffle($question); //配列の中身をシャッフル 28?> 29 30<!doctype html> 31<html> 32<head> 33<meta charset="utf-8"> 34<title>簡易クイズプログラム</title> 35</head> 36<body> 37 38<h2><?php echo $title ?></h2> 39<form method="POST" action="quiz.php"> 40 <?php foreach($question as $value){ ?> 41 <input type="radio" name="question" value="<?php echo $value; ?>" /> <?php echo $value; ?><br> 42 <?php } ?> 43 <input type="hidden" name="now" value="<?php echo $now ?>"> 44 <input type="hidden" name="score" value="<?php echo $score ?>"> 45 <input type="hidden" name="count" value="<?php echo $count ?>"> 46 <input type="hidden" name="log1[][]" value="<?php echo $log1 ?>"> 47 <input type="submit" value="回答する"> 48</form>

log1[0],[1],[2],・・・には、9つの要素が入っています
(log1[0][0],log1[0][1]・・・log1[0][8]
これらを、POSTしながら、1回postするごとに上位配列を1増やし(log1[0]→log1[1])ていきたいため、
log1をPOSTしつつ、1回ごとに増えていく$countという変数もpostして、これらを
post後くっつければ良いという考えに至りました。

しかし、なぜかこのコードでは、初回は正しく動くものの、1回POSTすると、
全配列データが失われています、つまりまともにpost、受け取りできていないのですが、
どこがおかしいのでしょう・・・。

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

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

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

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

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

m.ts10806

2021/05/20 14:11

var_dump()で$_POST['log1']を確認するところからでは。 きっと想定の情報は来てません。
退会済みユーザー

退会済みユーザー

2021/05/20 14:11 編集

ヒント:PHPコードの冒頭、<?php のすぐあとあたりに、var_dump($_POST); って行を挿入して、POST受信したデータを確認する。
m.ts10806

2021/05/20 14:12 編集

それに現状だとlog1[][]1個しかないですし。 出力できるのは文字列ですし。
退会済みユーザー

退会済みユーザー

2021/05/20 14:21 編集

array(5) { ["question"]=> string(3) "egg" ["now"]=> string(10) "1621519969" ["score"]=> string(0) "" ["count"]=> string(1) "0" ["log1"]=> array(1) { [0]=> array(1) { [0]=> string(5) "Array" } } } なんだこれ・・・・・ なんできてないんでしょうか・・・。 送信するときは、[]をつけるというのを見て、二重配列?なんで[][]にしたんですが・・・ 出力が文字列とは?? ん、、、なんかあるところを見ると、インデックス、つまり上位配列は自分で数値を入れる必要があるんですか?
m.ts10806

2021/05/20 14:21

配列は文字列ではないです。 配列をechoしても文字列にはなりません。
guest

回答1

0

ベストアンサー

nameで配列送りたいならチェックボックスと同じくその数だけinputないとダメです。
階層が深いなら上位の階層はキーを明示した方が良いでしょう。

php

1 2<input type="hidden" name="log1[<?php echo $count ?>][0]" value="0の値"> 3<input type="hidden" name="log1[<?php echo $count ?>][1]" value="1の値"> 4

それかJSONで持つ

php

1<input type="hidden" name="log1[<?php echo $count ?>]" value="<?php echo json_encode($info[$count]) ?>">

まぁ全部DB登録して都度SELECTするのが考えること少なく「ログ」としては適切な管理なんじゃないでしょうか。

投稿2021/05/20 14:20

編集2021/05/21 10:01
m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2021/05/20 15:01 編集

valueってあんまり意味ないですよね? countを明示するということですか・・・なるほど。。 え、てか、配列の数だけ、作る必要があるんですか? なら全問題分なんで不可能なんですが・・・。 1次元の配列なら、a[]とかで送れるんですかね?
m.ts10806

2021/05/20 15:30 編集

>valueってあんまり意味ないですよね? 意図が分かりません。 >え、てか、配列の数だけ、作る必要があるんですか? formリクエストの原則を思い出してください。 「name属性がキー、value属性が値」です。 value属性、というかHTMLに表示できるのは「文字列」だけです。 なので、「キーに対する値」を1つずつ入れていく必要があります。 PHPで一気に配列を深い階層まで定義することはありますが、 結局内部的には1つずつ順番にキーと値が定義されていっています。 $a = [1,2,3]; は $a = []; $a[] = 1; $a[] = 2; $a[] = 3; と同じ。HTMLでは一気に定義するような仕組みは持っておらず(というか受け取るのはPHP側の都合)inputはその値の数分だけ定義し、PHPではaというキーで全部受け取ることになります。 <input type="hidden" name="a[]" value="1"> <input type="hidden" name="a[]" value="2"> <input type="hidden" name="a[]" value="3"> $_POST["a"] これは階層が深くなっても同じ。 それに提示のコードは$a[][] = "1" としてるのと同じですから、最上位のキーは更新されないまま2つ目だけが増えていきます。 $a = []; $a[][] = 1; $a[][] = 2; $a[][] = 3; var_dump($a); まず、PHP側で「作成したい配列のイメージ」を作ってから 「HTMLにどう配分したらその形の配列がリクエストとして送信されるか」を考えると良いです。 >1次元の配列なら、a[]とかで送れるんですかね? 意図が分かりません。 回答者とは言ってもどんな熟練者であっても 質問者がやりたいことを推し量ることはほぼ不可能なので、 より具体的に「どういう情報や前提で、それらをもって何をしたくて、結果どうなってほしい」というところを記載してください。
退会済みユーザー

退会済みユーザー

2021/05/20 15:35

a[i]を送信する場合も、いちいちinputを要素分書かないといけないんですか?
m.ts10806

2021/05/20 15:41 編集

コメント更新してるのでそこも確認しておいてください。 何度も言いますがHTMLに出力されるのは文字列です。 まぁ、キーを配列で送ってるならループで正しくセットすればPHP側のコード上で書くinputは1つでしょうけど、HTML上には値の分だけ出力されます。 いずれにしても「ずっとhiddenで持ちまわる」のは悪手で、 データベースか、せめてセッションでしょうね。
退会済みユーザー

退会済みユーザー

2021/05/20 16:53 編集

for loopでinputを、毎度させるんですか? なんか重くなりそうなんですが・・・。 でも結局毎度読み込んでるのか・・・。 これ、受け取る時は、 $log3[] = $_POST['log3[]']; とかでいいんでしょうか? あと気づいたんですが、これ繰り返し、どうやって書くんでしょうか? <? for($i = 0 ; $i < count($log3); $i++){ //問題番号配列をinput <input type="hidden" name="$log3[]" value="<?php echo $log3[$i] ?>"> とかじゃだめですよね、inputってどうやってphpのforでまとめるんでしょうか・・・・・・。
m.ts10806

2021/05/20 21:37

ですから、HTMLに出すのではなくデータベースかセッションだと。
m.ts10806

2021/05/20 21:37 編集

>とかじゃだめですよね、 「ダメですよね」の意味が分かりません。 実行してみたら結果は分かります。(それでこの質問未解決のまま次の質問で丸投げされても)
退会済みユーザー

退会済みユーザー

2021/05/21 00:15 編集

.
m.ts10806

2021/05/21 01:29

こちらの説明が本当に全く理解できてないのでしたら少しでも理解できるように基本を学ぶしかないと思います。 もはや「質問と回答」でカバーできる範囲にはないと感じています。 やりたいことに対して足りてないものが多すぎます。基本をきちんとおさえてからのほうが結果的に早く確実にできます。 かけるべき学習コストを惜しんではできるものもできません。 PHPマニュアルを少しでも活用できるようになったら理解も進むようになり、きちんと解決できるようになります。
m.ts10806

2021/05/21 04:23

低評価された方は低評価理由をコメントしてください。 回答に対する明確な指摘なく低評価するのは迷惑行為として然るべく対処をするとの旨を運営から言われております。 私怨でしたら尚さら不純な動機です。
kaina

2021/05/21 04:26

低評価入れた人は低評価理由を書いて下さい。 まさか口うるさいとか1から10まで教えてくれないとかそんな理由の分けありませんよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問