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

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

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

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

Q&A

解決済

6回答

2535閲覧

DBの情報を基にラジオボックスにチェックがつかない

earnest_gay

総合スコア615

PHP

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

0グッド

0クリップ

投稿2016/06/30 06:16

編集2016/06/30 08:14

phpのクラス呼び出しについてです。

↓性別のラジオボックスのクラス
ファイル名:Gender.php

<?php class Gender{ static function getGender(){ $checked = ( filter_input(INPUT_POST, 'gender') === '男性') ? ' checked="checked"' : ''; $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; $checked = ( filter_input(INPUT_POST, 'gender') === '女性') ? ' checked="checked"' : ''; $options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked . ' />女性'; return $options; } } ?>

↓使いたいところで呼び出して使う。
ファイル名:register_human_ja.php

<tr> <td>性別</td> <td><?php echo Gender::getGender(); ?></td> </tr>

↓結果
イメージ説明

入力に誤りがあって再度ページを読み込んでも
$checked = ( filter_input(INPUT_POST, 'gender') === '男性') ? ' checked="checked"' : '';
これによって、以前入力したものを選択している状態にできました。

これを踏まえて、プロフィール更新でも同じことをします。

<?php class Gender{ static function getGender(){ $checked = ( $row['gender'] === '男性') ? ' checked="checked"' : ''; $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; $checked = ( $row['gender'] === '女性') ? ' checked="checked"' : ''; $options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked . ' />女性'; return $options; } } ?>

↓使いたいところで呼び出して使う。
ファイル名:register_human_ja.php

<?php $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $pdo = new PDO($dsn, $user, $password, $option); $sql = "SELECT * FROM user_data WHERE id=203"; $stmt = $pdo->query($sql); $row = $stmt->fetch(); ?> <tr> <td>性別</td> <td><?php echo Gender::getGender(); ?></td> </tr>

id=203の$row['gender']には男性が入っています。

しかし、どうしてもラジオボックスのどちらかにチェックがつきません。

ファイルを分けているからなのか?と思い、下記を試しました。

<?php require_once('Loader.php'); $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $pdo = new PDO($dsn, $user, $password, $option); $sql = "SELECT * FROM user_data WHERE id=203"; $stmt = $pdo->query($sql); $row = $stmt->fetch(); $checked = ( $row['gender'] === '男性') ? ' checked="checked"' : ''; $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; echo $options; ?>

↓結果
イメージ説明
ちゃんとcheckが付いています。

じゃあ、両方に対応できるようにと下記も試しました。

<?php require_once('Loader.php'); $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $pdo = new PDO($dsn, $user, $password, $option); $sql = "SELECT * FROM user_data WHERE id=203"; $stmt = $pdo->query($sql); $row = $stmt->fetch(); $checked = ( $row['gender'] === '男性') ? ' checked="checked"' : ''; $checked = ( $row['gender'] === '女性') ? ' checked="checked"' : ''; $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; $options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked . ' />女性'; echo $options; ?>

↓結果
イメージ説明

どちらにもチェックがつかなくなりました。

何が原因なのでしょうか?


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

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

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

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

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

guest

回答6

0

そもそもですが…

複数の選択肢からひとつを選択するときは

<input type="radio">

複数の選択肢から複数を選択するときは

<input type="checkbox">

です。

投稿2016/06/30 08:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

しかし、どうしてもラジオボックスのどちらかにチェックがつきません。

ん?

PHP

1$options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; 2$options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked . ' />女性';

name="gender"

nameが両方同じだからでは?
ラジオボタンってそういう部品だと思いますが?
私、何か勘違いしてるのかな・・・?

投稿2016/06/30 06:40

Mr_Roboto

総合スコア2208

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

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

earnest_gay

2016/06/30 07:03

name="gender" は違うと思います... 回答ありがとうございます。
guest

0

$checkedを男性と女性で使いまわしてるからでは?
男性のチェックでTRUEになって、checkedを代入しておいても、女性のチェックでFALSEになれば''を入れちゃいますよね。
こんな感じにしてみてはどうでしょう?

HTML

1$checked1 = ( $row['gender'] === '男性') ? ' checked="checked"' : ''; 2$checked2 = ( $row['gender'] === '女性') ? ' checked="checked"' : ''; 3$options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked1 . ' required />男性'; 4$options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked2 . ' />女性';

投稿2016/06/30 06:32

ttyp03

総合スコア16996

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

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

earnest_gay

2016/06/30 07:03

回答ありがとうございます。
guest

0

$checkedが上書きされています。
変数を分けましょう。

$checked1 = ( $row['gender'] === '男性') ? ' checked="checked"' : ''; $checked2 = ( $row['gender'] === '女性') ? ' checked="checked"' : ''; $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked1 . ' required />男性'; $options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked2 . ' />女性';

投稿2016/06/30 06:29

moonphase

総合スコア6621

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

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

earnest_gay

2016/06/30 07:01

確かに$checkedが上書きされていますね... ありがとうございます。
guest

0

ベストアンサー

Gender#getGenderからアクセス可能な$rowという変数は存在しません。$rowは呼び出される側のスコープ内で変数として作成されており、クラス側からは見えないです。
filter_input(INPUT_POST, 'gender')はPHPのどこからでもアクセス出来ますが、ただの変数はスコープ内でしかアクセスできません。だからfilter_inputの場合は動作し、$rowへのアクセスはスコープの外であるため動作していないのです。

getGenderメソッドを修正するなら、こうするべきでしょう。

PHP

1static function getGender($gender){ 2 $checked = ( $gender === '男性') ? ' checked="checked"' : ''; 3 $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; 4 5 $checked = ( $gender === '女性') ? ' checked="checked"' : ''; 6 $options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked . ' />女性'; 7 8 return $options; 9}

そして呼び出す側はこう変更すべきです。

###filter_inputを使う場合

PHP

1<?php echo Gender::getGender(filter_input(INPUT_POST, 'gender')); ?>

DBの$rowを使う場合

PHP

1<?php echo Gender::getGender($row['gender']); ?>

こうすればどちらのパターンでも使用できますね。

投稿2016/06/30 06:28

編集2016/06/30 07:15
masaya_ohashi

総合スコア9206

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

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

earnest_gay

2016/06/30 07:01

性別を引数に渡す... ここでもそういうロジックが必要でしたか... 本当に参考になります。 $checked = ( $row['gender'] === '男性') or (filter_input(INPUT_POST, 'gender') === '男性')? ' checked="checked"' : ''; みたいなことで対応できるのかと思ってました... 先日のものも視野に入れての回答ありがとうございます。 ちょっと気になったのですが、<%php の%はなんなのでしょうか?
masaya_ohashi

2016/06/30 07:15

あ、ごめんなさい!%じゃなくて?でした!%で始まるタグはJSPという言語で使われるのでPHPとは無関係です。
earnest_gay

2016/06/30 07:31 編集

色々な言語使われてるんですね! こちらで申し訳ないのですが、昨日回答頂いた都道府県のものも同じようなロジックでやっているのですが、よろしければアドバイスいただきたいです。 static function getPrefs($prefset){ $prefset = array('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県'); $pref = $prefset;//引数に渡された都道府県がここに入る if(!$pref) {//$prefに何か入ってたらここはスキップ $pref = "東京都"; } foreach ($prefset as $prefs) { $selected = ''; if($pref == $prefs) {//大阪が入ってれば大阪にselected $selected = ' selected'; } $options .= "<option value=".$prefs.$selected.">".$prefs."</option>"; } return $options; } 呼び出す側 <select class="pref" name="pref"> <?php echo Pref::getPrefs(filter_input(INPUT_POST,'pref')); ?> </select> 若しくは <select class="pref" name="pref"> <?php echo Pref::getPrefs($row['pref'])); ?> </select> であってると思うのですが、どうも意図したものが選択されず... ※失礼しました。 同じ変数を$prefset = arrayで使っていたためでした。
masaya_ohashi

2016/06/30 07:37

引数と、内部でarrayで作っている都道府県リスト、どちらも$prefsetという名前になってますよね?これだと外から何を渡されても都道府県リストで上書きされてしまいます。 $pref = $prefset;という行は必要なく、最初から引数を$prefという名前にしていれば意図した動作になるのではないでしょうか。
earnest_gay

2016/06/30 08:22

すいません。 こちらも試しているのですが、なかなかうまくいかず... 質問量が少ないので新たに質問立てるのも悪いかと思い、申し訳ないんですがお時間ありましたら教えていただけると幸いです。 <?php function getYear($yearget){ $test=$yearget; $now = date("Y"); $options = ""; for($i = 1950;$i <= $now;$i++){ if($yearget === $i){ $selected = ' selected'; } $options .= "<option value=".$i.$selected.">".$i."年"."</option>"; } return $options; } ?> <form action="" method="post"> <select class="year" name="year"> <?php echo getYear(filter_input(INPUT_POST, 'year')); ?> </select> <input type="submit" value="送信"> </form> <?php var_dump($test); ?>
guest

0

$checked = ( $row['gender'] === '男性') ? ' checked="checked"' : ''; $checked = ( $row['gender'] === '女性') ? ' checked="checked"' : ''; $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性'; $options .= '<input type="radio" class="woman" id="woman" name="gender" value="女性" ' . $checked . ' />女性';

であれば、$checked変数が競合して女性のほうに引っ張られていますね
なんどかご指摘した通り、競合をはじくためには
$checked["gender"]["男性"]、$checked["gender"]["女性"]のような
工夫が必要だと思います

投稿2016/06/30 06:27

yambejp

総合スコア114505

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

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

earnest_gay

2016/06/30 06:56

ありがとうございます汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問