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

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

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

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

Q&A

解決済

3回答

2295閲覧

ラジオボタンでなぜかFemaleにチェックがついてしまう

YukaSaku

総合スコア52

PHP

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

0グッド

0クリップ

投稿2017/05/24 20:17

フォームにある、Male,Femaleをチェックするラジオボタンで、初期画面はどちらも選択してある状態に無いんですが、一度エラーを出して(1箇所ブランクとか)再入力時、ラジオボタンのチェックがFemaleについてしまいます。

(chromeブラウザでHTMLをチェックしたら、MaleとFemale両方がcheckedとなっていました。)

これを、ユーザーがもしラジオボタンをブランクでエラーを出したならブランクのまま、もしMaleを選択してて、他の箇所でエラーを出したなら、Maleをそのままチェックしていて欲しいのですが、どのように書けばいいでしょうか。

php

1<?php 2 /* Program name: form.inc 3 * Description: Defines a form that collects a user's 4 * name and phone number. 5 */ 6$labels1 = array( "username" => "User Name", 7 "phone" => "Phone", 8 "email" => "Email"); 9$labels2 = array ("password" => "Password"); 10$gen = array("Male" , "Female"); 11$date = date("Y-m-d H:i:s"); 12$submit = "Submit"; 13?> 14 15<html> 16<head> 17 <title>Register</title> 18 <style type='text/css'> 19 <!-- 20 form { 21 margin: 1.5em 0 0 0; 22 padding: 0; 23 } 24 #field {padding-bottom: 1em;} 25 label { 26 font-weight: bold; 27 float: left; 28 width: 20%; 29 margin-right: 1em; 30 text-align: right; 31 } 32 #submit { 33 margin-left: 35%; 34 } 35 --> 36 </style> 37</head> 38<body> 39<h3>Registration</h3> 40 <?php 41 echo "<form action='$_SERVER[PHP_SELF]' method='POST'>" 42 ?> 43 <fieldset style="background: #EFEFEF; width:630px; border: 1px solid #CC0000; height:100; padding-left:10px; padding-right:10px; padding-top:10px; padding-bottom:10px;"> 44 <legend>Registration Form</legend> 45 <?php 46 foreach($labels1 as $field => $label1) 47 { 48 echo "<div id='field'><label for='$field'>$label1</label> 49 <input id='$field' name='$field' type='text' value='".@$_POST[$field]."' 50 size='50%' maxlength='65' /></div>\n"; 51 } 52foreach($labels2 as $field => $label2) 53 { 54 echo "<div id='field'><label for='$field'>$label2</label> 55 <input id='$field' name='$field' type='password' value='".@$_POST[$field]."' 56 size='50%' maxlength='65' /></div>\n"; 57 } 58echo "<div class='gen'> <label>Gender</label>"; 59foreach($gen as $value) 60{ 61 echo "<input type='radio' name='gen' "; 62 if(isset($_POST['gen']) == $value) 63 { 64 echo " checked"; 65 } 66 echo " value='$value' style='margin-left: 10%'/>$value"; 67} 68echo "</div>"; 69 70 echo "<input type='hidden' name='submitted' value='yes'>"; 71 echo "<div id='submit'> 72 <input type='submit' name='pButton' value='$submit'></div>"; 73?> 74</fieldset> 75</form> 76</body> 77</html>

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

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

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

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

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

guest

回答3

0

ベストアンサー

if(isset($_POST['gen']) == $value)

ここが問題で、isset()はtrue/falseしか返しませんが、true == 文字列という比較では文字列がboolに変換されるので、空文字列や'0'などを除いて必ずtrueとなってしまいます。

ちゃんと$_POSTの中身を判定する必要があります。

php

1// その1:略さずに書く 2if(isset($_POST['gen']) && $_POST['gen'] === $value) 3 4// その2:エラーを止める 5if(@$_POST['gen'] === $value) 6 7// その3:PHP 7ではこうも書ける 8if(($_POST['gen'] ?? '') === $value)

投稿2017/05/24 22:29

maisumakun

総合スコア145121

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

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

YukaSaku

2017/05/25 03:30

略してることすらわかってなかったのですが、こちらで解決しました。 初心者なので、まず略されてないコードを書いて理解しないとダメですね。勉強になります。 その3も思い切って試してみました。 いろんな方法を教えていただきまして、ありがとうございます。
guest

0

2つの問題があります。

1つめは比較演算子。PHPの == 演算子は非常にゆるい判定で、true と "Male" を比較するとなんと true を返します。

php

1$hoge = 'hello'; 2var_dump(isset($hoge) == 'Male'); 3 4# bool(true)

まとも(?)な判定を行う場合は、=== 演算子を使ってください。

php

1$hoge = 'hello'; 2var_dump(isset($hoge) === 'Male'); 3 4# bool(false)

== はPHPの "クソ仕様" として有名で、本当にたびたびトラブルの原因になるので、極力 === を使うよう心がけてください。

PHP: 比較演算子 - Manual


2つめに、今回の checked の判定は、$_POST['gen'] がセットされていて、かつ その値が Male / Female であることが条件ですので、判定式は2つになるはずです。

php

1if(isset($_POST['gen']) == $value) { echo " checked"; } 2 34 5if(isset($_POST['gen']) && $_POST['gen'] === $value) { echo " checked"; }

なお PHP7.0 以降では、NULL合体演算子 という新しい演算子を使ってもう少しシンプルに書けます。

php

1if($value === $_POST['gen'] ?? null) { echo " checked"; }

投稿2017/05/24 22:25

編集2017/05/24 22:34
miyahan

総合スコア3095

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

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

YukaSaku

2017/05/25 03:35

とてもわかりやすい説明をありがとうございます。上の方とすごく迷ったのですが、初心者の私にはその1その2その3の説明があったのが今後の理解に役に立ちそうだったので上の方をベストアンサーとさせていただきました。 ==はクソなんですね。知らなかったです。今後は===を使っていこうと思います。 またいろいろ質問させていただくと思いますので、よろしくお願いします。
guest

0

本題にあまり関係ないですが
「$_SERVER[PHP_SELF]」はセキュリティ的に使用しない方がいい
$_SERVER["SCRIPT_NAME"]を検討ください

また全体的に冗長な書き方をされているようなので
HTML部分はテンプレート化した方がよいと思いますよ

追記

念の為追記しておきます。
POST値の参照は長く以下a1のような方式を取られていましたが
a2のようにPHP5以降インテリジェントでスマートなfilter_input()
整備されたこともあり使わない手はないと思います。
(filter_inputはデータの整合性をチェックしたり、デフォルト値の指定をすることができます)
またa3のような書き方もできますが、任意にエラーを無視する方式のため
あまりおすすめできません。
参考になれば幸いです

PHP

1<form method="post"> 2<input type="text" name="a"> 3<input type="submit" value="go"> 4</form> 5 6<?PHP 7$a1=isset($_POST["a"])?$_POST["a"]:NULL; 8var_dump($a1); 9 10$a2=filter_input(INPUT_POST,"a"); 11var_dump($a2); 12 13$a3=@$_POST["3"]; 14var_dump($a2); 15?> 16

投稿2017/05/25 02:08

編集2017/05/25 03:38
yambejp

総合スコア114572

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

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

YukaSaku

2017/05/25 03:23

$_SERVERの件、ありがとうございます。勉強になります。 コードの書き方は、学校の教えでこんな形で私もだいぶ頭が混乱しています。
yambejp

2017/05/25 03:37

POSTデータの受け方について追記しておきました
YukaSaku

2017/05/25 03:46 編集

本当ですね。filter_inputの方がすっきりしてて、パッと見てすぐ理解できました。 学校の教科書がなぜか積極的に@を使うんです。おっしゃる通り、エラーを無視するようなのでa3みたいな方法はあまり好きじゃないなぁと思っています。 ありがとうございます。 今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問