チェックボックスと配列の関係
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です
つづく