test001.phpで、
配列$quizをforeach文を使ってcheckboxとして各要素を出力させ
さらに配列の各要素に input type="hidden" のvalueを
$i++のカウンターで、それぞれ
POST先(answer001.php)に渡します。
最初のcheckboxにチェックを入れると0、
最後の(4番目の)checkboxにチェックを入れると4
が渡されるようにしたいのですが、
うまくいきません。
配列の要素数、もしくは最後の$iを渡しているようです。
test001.phpで
”あ”にチェックを入れ「回答する」ボタンをクリックすると0、
”か”にチェックを入れ「回答する」ボタンをクリックすると1、
と
answer001.phpに表示させたいのですが、
プログラムを変更してもらえると大変助かります。
よろしくお願いします。
文字数制限の関係でプログラムは補足を参照してください。
画面でチェックを入れているのは、あくまでも type="checkbox" の要素だけで、通番の name="number" は四つともリクエストに乗っかって行きます。
通番と値をくっつけたものを type="checkbox" の value に指定しておいて、受け取った方では、それをばらして使う、という感じになるでしょう。
例えば、コロン(":")で通番と値をくっつけた場合は、こんな感じになるかと。
<?php $quiz = array('あ','か','さ','た'); ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>pg</title> </head> <body> <?php $i = 0;?> <form method="POST" action="answer001.php"> <?php foreach ($quiz as $value){ ?> // ↓コロンで通番と値をくっつける <input type="checkbox" name="atai" value="<?php echo $i . ':' . $value; ?>" /> <?php echo $value; ?> <?php $i++;?> <?php } ?> <input type="submit" value="回答"> </form> </body> </html>
<?php // コロンで atai を分割する list($number,$atai) = explode(":", $_POST['atai']); echo '回答' . $atai . '<br />'; echo '番号' . $number . '<br />'; ?>
画面でチェックを入れているのは、あくまでも type="checkbox" の要素だけで、通番の name="number" は四つともリクエストに乗っかって行きます。
通番と値をくっつけたものを type="checkbox" の value に指定しておいて、受け取った方では、それをばらして使う、という感じになるでしょう。
例えば、コロン(":")で通番と値をくっつけた場合は、こんな感じになるかと。
<?php $quiz = array('あ','か','さ','た'); ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>pg</title> </head> <body> <?php $i = 0;?> <form method="POST" action="answer001.php"> <?php foreach ($quiz as $value){ ?> // ↓コロンで通番と値をくっつける <input type="checkbox" name="atai" value="<?php echo $i . ':' . $value; ?>" /> <?php echo $value; ?> <?php $i++;?> <?php } ?> <input type="submit" value="回答"> </form> </body> </html>
<?php // コロンで atai を分割する list($number,$atai) = explode(":", $_POST['atai']); echo '回答' . $atai . '<br />'; echo '番号' . $number . '<br />'; ?>
> 配列の要素数、もしくは最後の$iを渡しているようです。
何が起きているのかは、PHPから返した HTMLソースをよく読むと分かると思います。
<input type="checkbox" name="atai" value="あ" /> あ <input type="hidden" name="number" value="0">0<br> <input type="checkbox" name="atai" value="か" /> か <input type="hidden" name="number" value="1">1<br> <input type="checkbox" name="atai" value="さ" /> さ <input type="hidden" name="number" value="2">2<br> <input type="checkbox" name="atai" value="た" /> た <input type="hidden" name="number" value="3">3<br>
(タブは空白2個に置換しました)
全てのチェックボックスは同じ名前なので、どれを選んでも同じ名前のパラメータとして action属性値のアクセス先に渡されます。
また、チェックボックスという特性上、パラメータとして渡されるのは、選択されたチェックボックスの value属性値のみです。
(つまり未選択のチェックボックスは無視される)
さらに、チェックボックスは複数選択が可能ですから、複数選択時は値が違う同じ名前のパラメータとして渡されます。
hiddenな入力フィールドは、ブラウザ上は見えていませんが通常の入力フィールドと全く同じなので、『常に全てのフィールドがパラメータとして送られる』事になります。
実際に起こっている事を視覚的に解りやすくするために、form の method属性を GET にしてみると良いでしょう。
例えば
index.php?number=0&atai=か&number=1&atai=さ&number=2&number=3
こんな感じです。
受け取る PHPの方では、同じ名前のパラメータが来るので、後から来たパラメータが前の値を上書きしてしまいます。
そして、パラメータをどの順序で送るかは定められていないので、ブラウザによってあるいはバージョンや送信のタイミングで異なる順序であるかもしれません。
(つまり、「配列要素数」とか「最後の」というのは確定では無いです)
> ”あ”にチェックを入れ「回答する」ボタンをクリックすると0、
質問者さんのやりたい事が上記の様に「数字を表示したい」だけなら、valueとして「あ」などではなく「1」の様に数字を渡すだけで解決します。
また、foreach を使っているのに、配列のキーを別変数で用意してインクリメントする必要はありません。
わざわざチェックボックスにしているという事は、複数選択を可能にしたいという事でしょうから、複数を取得できるようにしておく必要があります。
<?php foreach ($quiz as $k=>$v):?> <input type="checkbox" name="number[]" value="<?=$k?>" /><?=$v?><br> <?php endforeach;?>
という感じで十分でしょう。
$_POST['number'] は配列として取得(未選択時は存在しない)されるので、受け取り側も調整が必要です。
<?php if (isset($_POST['number'])) { // $_POST['number'] が配列である事の確認は必要な場合もあるでしょうけど省略 foreach ($_POST['number'] as $nbr) { echo '番号' . $nbr . 'br>'; } }
「”あ”にチェックを入れ「回答する」ボタンをクリックすると0、」と言いつつ回答も表示したいのでしょうか?
だったら、受け取る PHPにも $quiz を同じ値で定義すれば、受け取った番号を使って表示は可能です
上記の $nbrを使えば $quiz[$nbr]
$quiz の設定を異なるファイルに書くのは、不整合が起こる可能性もあります。
それを気にするのでしたら、その部分を外部に出してやればOKでしょう。
「外部」はデータベースだろうがファイルだろうが考え方としては同じです。
例えば
quizValue.php というファイルに
<?php $quiz = array('あ','か','さ','た');
としておいて、
それぞれのファイルで include 'quizValue.php';
のように読み込んでやれば手軽に実現できるでしょう。
ご提示のモノに近い状態をお望みなら、
<?php foreach ($quiz as $k=>$v):?> <input type="checkbox" name="atai[<?=$k?>]" value="<?=$k?>" /><?=$v?> <input type="hidden" name="number[<?=$k?>]" value="<?=$v?>" /> <br> <?php endforeach;?>
というのでも可能でしょう。
サーバ側で分かっていればいい内容をブラウザを経由で再度取得するのは無駄なデータのやり取りだと思いますが。
ご丁寧に教えていただき、ありがとうございます。できました。
2016/11/06 19:01:44