PHPの勉強を始めて1週間の初心者です。
phpで簡単なメールフォームを作る練習をしています。
ネットで検索していろんなサイトを見ると
<?php
$sel = isset($_POST['select']) ? $_POST['select'] : '';
?>
<html>
<form method="post" action="<?=$_SERVER['SCRIPT_NAME'];?>">
<select name="select">
<option value="a"<?= $sel === 'a' ? ' selected' : ''; ?>>a</option>
<option value="b"<?= $sel === 'b' ? ' selected' : ''; ?>>b</option>
<option value="c"<?= $sel === 'c' ? ' selected' : ''; ?>>c</option>
<option value="d"<?= $sel === 'd' ? ' selected' : ''; ?>>d</option>
</select>
<input type="submit" name="submit" value="送る">
</form>
</html>
(ネットの記事から引用)
のような解決法が多くありました。
しかし、今私が作ろうとしているプルダウンメニューが
都道府県を選択するメニューなので、
これはあまりにも手間がかかる上にテキスト量が多くなり読みにくくなってしまいます。
for文やforech文などを使って
<?php
if(isset($_POST["send"])){
$japan = $_POST["japan"];$japan = array("", "北海道", "青森県", ..(※省略).... "沖縄県",);
}
?>
<select class="form3" name="japan">
<?phpfor($i=0; $i<count($japan); $i++){
echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
}
?>
</select>
と自分で書いてはみたのですが、2点ほどうまくいかない事があります。
その1、初期値が空になって▼マークのみの表示になってしまう。
(一度送信するとなぜかプルダウンし選択できるようになる)
その2、選択した項目を送信した後も保持したままにしたい。
そこでお願いしたいのはこの2点の解決方法です。
できればfor文など使用したスッキリした形で完成させたいです。
まだ知らないこともたくさんありますので
もし別の方法があれば教えていただきたいです。
宜しくお願いします。
追記:ネットから引用した前述の方法以外の解決策はないんでしょうか?
追記2:回答を受け以下の記述に直しました。
<?php
$japan = array("", "北海道", "青森県", ..(※省略).... "沖縄県",);if(isset($_POST["send"])){
$japans = $_POST["japans"];
}
?>
<select class="form3" name="japan">
<?phpfor($i=0; $i<count($japan); $i++){
if($_POST["japans"]==$japan[$i]){
echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
}
else{
echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
}
}
?>
</select>
この記述の結果、その1の問題は解決しました。
しかし送信後のプルダウンメニューが強制的に沖縄県(項目の最後)に移動してしまいました。
その後else部分の$japan[$i]を$_POST["japan"]に変えてみたところ、
送信後のプルダウンメニューの全47項目が選択した都道府県に変わってしまいました、、、
(例… 送信前:「東京都」を選択→
→送信後:47項目全てが「東京都」に)
もうどうすればいいか分かりません、、、
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
$japan = $_POST["japan"];
のすぐ後で$japan = array("", "北海道",
としているのでどちらかの変数名を変える必要があると思います。
その1に関して
for
文や都道府県の配列の部分がif(isset($_POST["send"])){
の中にあるので$_POST["send"]
がない場合は動作していないのだと思います。
その2に関して
<option>
で初期選択されているものを指定する場合は<option selected="selected">
とする必要がありまが、for
内ではselected
の指定をしていないので一番上のものが選択された状態になっているのだと思います。
echo('option...
の前でif($_POST["japan"]==$japan[$i])
を使ってselected
の出し分けをしてみてくださ。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
やりかたはいろいろありますが、
2ですが、forで回してる中を
if($japan[$i] == $_POST["japan"]){
echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
}else{
echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
}
などとしてみてはいかがでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/25 16:54
おかげさまで初期値でちゃんとプルダウンメニューが選択できるようになりました!
for文の位置を変えるだけでよかったんですね・・・!
ですが申し訳ないです、まだわからないことが、、、
その2の部分ですが「selectedの出し分け」とはどうやればいいのでしょうか・・・?
ifとelseを使って条件分岐をするんだろうなと思うのですが、
selectedを使った具体的な記述方法がわかりません。
すいません、ものすごく初歩的なことを聞いているのかもしれません、、、
お願いします、、、
2016/05/25 17:00
これが選択されてない場合の出力で
echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
こっちが選択されている場合の出力になります。
ここはphpではなく出力されたhtmlの話しになるので
http://www.htmq.com/html5/option.shtml
この辺りのリファレンスを確認されるのがいいと思います。
すみません最初の回答xhtmlのクセで書いてました<option selected>ですね(動作には支障ないと思いますが一応)
2016/05/25 17:49
私の解釈の仕方が悪いのでしょうか、どれを選んでも
送信すると強制的に沖縄県に初期化されてしまいます。
現在、記述は以下のとおりです。
<?php
for($i=0; $i<count($japan); $i++){
if($_POST["japans"]==$japan[$i]){
echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
}
else{
echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
}
}
?>
ちなみに最初の回答を受けて$_POSTの方は$japanから$japansへと
変更してあります。
それと私なりに考えてelseの2箇所ある$japan[$i]を$_POST["japan"]に
すれば良いのではないかと試してみたのですが、うまくいきませんでした。
例えば初期値状態から「東京都」を選択すると
送信後のプルダウンメニューの47項目が全て東京都に!!(汗)
確かに選択された項目を再表示に出来てはいるのですが、
これでは送信後の修正ができませんね、、、
教えていただいたURLからリファレンスの確認もしたのですが
まだいまひとつ理解できていないようです、、、
申し訳ありませんが、あともう少しだけ教えて頂けませんでしょうか?
お願い致します。
2016/05/25 17:54