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

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

ただいまの
回答率

89.52%

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

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,352

earnest_gay

score 401

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;

?>

↓結果
イメージ説明

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

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


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/06/30 17:24

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 6

checkベストアンサー

0

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

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

static function getGender($gender){
    $checked = ( $gender === '男性') ? ' checked="checked"' : '';
    $options = '<input type="radio" class="men" id="men" name="gender" value="男性" ' . $checked . ' required />男性';

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

    return $options;
}

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

filter_inputを使う場合

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

 DBの$rowを使う場合

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/30 16:26 編集

    色々な言語使われてるんですね!

    こちらで申し訳ないのですが、昨日回答頂いた都道府県のものも同じようなロジックでやっているのですが、よろしければアドバイスいただきたいです。

    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で使っていたためでした。

    キャンセル

  • 2016/06/30 16:37

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

    キャンセル

  • 2016/06/30 17: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);
    ?>

    キャンセル

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 15:56

    ありがとうございます汗

    キャンセル

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 16:01

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

    キャンセル

0

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

$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 16:03

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

    キャンセル

0

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

ん?

$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 . ' />女性';

name="gender" 

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/30 16:03

    name="gender" は違うと思います...

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

    キャンセル

0

そもそもですが…

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

<input type="radio">

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

<input type="checkbox">

です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる