忍者ブログ

からすまる日誌

2020012102 チェックボックスと配列

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2020012102 チェックボックスと配列

チェックボックスと配列の関係
 
formであったチェックボックスです
 
 <form action="result.php" method="get">
  <input type="text" name="u_name">
  <input type="chechbox" name="media" value="tv">テレビで知った
  <input type="chechbox" name="media" value="web">webで知った
  
  
  
  <input type="submit" value="送信">
 </form>
 
nameは中身を統一(name属性の中身は一緒)
valueはそれぞれの中身を入れる 
 

じゃあ「チェックボックスで選択されたものを受け取りたい」というときですよ
 
echo $_GET["media"];
 
こうすると複数選択されていたとき1こだけが出力されてしまう
 
しかしget送信の中身を見てみましょう
ちょっとphpを変えましたよ。送るのはfavorite。
 
http://localhost/php/20200121/result2.php?u_name=&favorite=tv&favorite=web 
 
2つ(tv,web)がちゃんと送られているのが分かる
 
同じ配列名に2度代入したら、前のを後のが上書きしてしまうのですよ
 
favorite=tvです
favorite=webです
webだけがfavoriteに入っている状態になってる
 

どう解決したらいいか
 
①formの側で修正してやる
同じname属性で送るからよくないな
→でもhtmlのルールとしてここはそろっているのがお約束だ。name1,name2とかにはできない
→同じ名前で、かつ違うもの...
→配列というものがありますね
 
$a=1;
$a=2;//上書きが起こる
 
$a[0]=1;
$a[1]=100;//上書きが起こらない
 
つまりチェックボックスを使うときは、name属性のところに大かっこ大かっこを付けるということです
 
 <form action="result2.php" method="get">
  <h1>おきにいりは?</h1>
  <p><input type="text" name="u_name"></p>
  <p><input type="checkbox" name="favorite[]" value="tv">テレビ</p>
  <p><input type="checkbox" name="favorite[]" value="web">web</p>
  <input type="submit">
 </form>
  
受け取り側の記述はこう
 
 echo $_GET["favorite"][0];
 echo $_GET["favorite"][1];
 echo $_GET["favorite"][2];
 
favoriteの何番目をエコーしてくださいよという
 

まだ問題がありますね
じゃあチェックが1つとか2つだけだったら?
エラーが出るよ
 
tv
Notice: Undefined offset: 1 in C:\xampp\htdocs\php\20200121\result2.php on line 4
Notice: Undefined offset: 2 in C:\xampp\htdocs\php\20200121\result2.php on line 5
 
配列の0番目しかないのに1や2こめは出力できないからさ
 

②そこでさっきのforeachの出番になる
 
受け取り側も修正する
 
配列の中に入っている要素の数だけ自動的に繰り返す、という特徴を持つ
 
 foreach($_GET["favorite"] as $val){
  echo $val;
 }
 
こう記述しますよ
 
--->favorite.php 
 
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="UTF-8">
  <title>JavaScript</title>
  <link rel="stylesheet" href="test1.css">
 </head>
 <body>
 
 <form action="result2.php" method="get">
  <h1>おきにいりは?</h1>
  <p><input type="text" name="u_name"></p>
  <p><input type="checkbox" name="favorite[]" value="tv">テレビ</p>
  <p><input type="checkbox" name="favorite[]" value="web">web</p>
  <p><input type="checkbox" name="favorite[]" value="jump">jump</p>
  <input type="submit">
 </form>
 
 </body>
</html>
 
--->result2.php
 
<?php
 echo $_GET["u_name"];
 /*
 echo $_GET["favorite"][0];
 echo $_GET["favorite"][1];
 echo $_GET["favorite"][2];
 */
 
 foreach($_GET["favorite"] as $val){
  echo $val;
 }
?>
 

これがinputタイプチェックボックスと配列とforeachの関係なのです
 
①送り側のinputのname属性のとこに大かっこ大かっこをつける
②受け側はforeachで回す
 
③この大かっこ大かっこをつけるというのはプロのコーダーさんでも知らないことがあるらしい
なので、自分が受け側の記述をすることになったら、ちゃんと送り側が大かっこをつけてくれているか確認しましょう。
ついでにじぶんが送り側のコーダーになっても、後の人のためにちゃんとつけましょう
 

さて、じゃもしユーザーがチェックボックスを一つも入れなかったら?
Notice: Undefined index: favorite in C:\xampp\htdocs\php\20200121\result2.php on line 9
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\php\20200121\result2.php on line 9
 
ノーティスアンディファインド favoriteなんてのはありませんよ
foreachのなかでもおかしいですよという
エラーがでます
 

関東ではわりとデザインとコーディングが別の人がやるらしい
関西ではわりとデザインとコーディングができるのがふつらしい
 

話を戻して何も送られてこなかったときのお話
 
まず、「ユーザーがちゃんと入力画面から飛んできてくれていたら」
inputにrequired属性をつけるという方法があるね
リクワイアード
 
<p><input type="text" name="u_name" required></p>
 
こう記す。記述するのはどこでもいいらしい。
 
 
しかしチェックボックスが複数あるときはちょっとよろしくないですよ。(1こだけならありうる)
 
 
チェックしないと進めなくなる
 

②またはcheckedをいれておく
 
<label><input checked type="checkbox" name="favorite[]" value="web">web</label>
 
③javascriptで入力されているかどうかを見てアラートを出す
 
--->とりあえずfavorite.php
 
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="UTF-8">
  <title>JavaScript</title>
  <link rel="stylesheet" href="test1.css">
 </head>
 <body>
 
 <form action="result2.php" method="get">
  <h1>おきにいりは?</h1>
  <label><input type="text" name="u_name" required></label>
  <label><input type="checkbox" name="favorite[]" value="tv" required>テレビ</label>
  <label><input checked type="checkbox" name="favorite[]" value="web">web</label>
  <label><input type="checkbox" name="favorite[]" value="jump">jump</label>
  <p><input type="submit"></p>
 </form>
 
 </body>
</html>
 
  
しかし、ユーザが「直接リザルト画面をurlで入力してきたら」エラーが出まくりですよ
 
ここで登場するのがPHPです
つづく
 
PR

コメント

ブログ内検索

カレンダー

04 2025/05 06
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31