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

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

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

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Q&A

2回答

1128閲覧

DBに関連付けたラジオボタンについて

hianmain

総合スコア0

PHP

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

0グッド

1クリップ

投稿2020/05/08 08:13

編集2020/05/08 11:33

前提・実現したいこと

掲示板作成の課題で
($_SESSION['COLOR']が空 
AND
COLOR_MASTER.COLOR_IDが3)
OR
($_SESSION['COLOR']とCOLOR_MASTER.COLOR_IDが一致)
の際にcheckedを入れたいです。

発生している問題・エラーメッセージ

上記の条件式に合う、コードを記述していると思うのですが、最初にページを開いた際(初期状態)に、ラジオボタンのID3にcheckedがつかないです。

エラー表記に関して
error_reporting(E_ALL & ~E_NOTICE);の設定をするらしく、noticeのエラーが出ないようになっているとのことです。

該当のソースコード

PHP

1<?php 2 3error_reporting(E_ALL & ~E_NOTICE); 4 5//セッションスタート 6session_start(); 7 8//DB接続クラス読み込み 9include 'DBConnect.php'; 10 11//共通関数読み込み 12include 'function.php'; 13 14//セッションIDを再作成する 15session_regenerate_id(true); 16 17//エスケープ 18function h($s) { 19return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 20} 21 22//ログインしているか判断 23if(empty($_SESSION['USER_ID'])){ 24 header( "Location: ./login.php" ); 25 exit(); 26} 27 28//確認ボタンを押した 29if(!empty($_POST['Submit'])){ 30 31 //処理 32 if($_POST['token'] !== $_SESSION['token']){ 33 //セッションの内容を削除する処理を後ほど記述 34 header( "Location: ./login.php" ); 35 exit(); 36 }else{ 37 //POSTされた値を$_SESSION['XXX']に代入 38 $_SESSION['USER_NAME'] = $_POST['username']; 39 $_SESSION['EMAIL'] = $_POST['email']; 40 $_SESSION['TITLE'] = $_POST['title']; 41 $_SESSION['TEXT'] = $_POST['text']; 42 $_SESSION['COLOR'] = $_POST['color']; 43 44 //エラー変数を空にする 45 $err = ""; 46 47 48 //EmailCheck 49 $checkEmail = new CheckFunction(); 50 $return = $checkEmail->checkEmail($_SESSION['EMAIL']); 51 if($return === false){ 52 $err = "E-mailは’半角英数字@test.co.jp’の形式で入力してください<br />"; 53 } 54 55 //文字数Check 56 $checklen = new CheckFunction(); 57 $param2 = 50; 58 $return = $checklen->checkLen($_SESSION['TITLE'],$param2); 59 if($return === false){ 60 $err .= "タイトルは50文字以下で入力してください<br />"; 61 } 62 63 //空文字Check(TEXT) 64 $checkBlank = new CheckFunction(); 65 $return = $checkBlank->checkBlank($_SESSION['TEXT']); 66 if($return === false){ 67 $err .= "「本文」を入力してください<br />"; 68 } 69 70 if(empty($err)){ 71 $_SESSION['ACTION_NAME'] = "inout_confirm"; 72 header( "Location: ./confirm.php" ); 73 exit(); 74 } 75 76 } 77} 78 79if(!empty($_POST['clear'])){ 80 //$_SESSION['XXX']の情報を削除 81 82 unset($_SESSION['USER_NAME']); 83 unset($_SESSION['EMAIL']); 84 unset($_SESSION['TITLE']); 85 unset($_SESSION['TEXT']); 86 unset($_SESSION['COLOR']); 87 88 $_SESSION['ACTION_NAME'] = "input_clear"; 89} 90 91//$_SESSION['ACTION_NAME'] に "input_display"を代入 92$_SESSION['ACTION_NAME'] = "input_display"; 93 94?> 95<!-- HTML出力 --> 96<!-- $err変数を表示 --> 97<!DOCTYPE html> 98<html lang="ja"> 99<head> 100 <meta charset="UTF-8"> 101 <link rel="stylesheet" href="./css/master.css" type="text/css"> 102 <title>掲示板</title> 103</head> 104<body> 105<header> 106 掲示板 107</header> 108 <?php echo $_SESSION['COLOR']; //ここで送信を押した際に$_SESSION['COLOR']に値が入るか確認をしていました。 109 if(isset($err)){ 110 echo "<span style='color:#ff0000'>".$err ."</span>"; 111 } 112 ?> 113<main> 114 <div> 115 <form action="input.php" method="POST"> 116 <div> 117 <table class="inputArticle"> 118 <tr> 119 <td class="itemName"><div>名前</div></td> 120 <td><div> 121 <input type="text" name="username" value="<?php echo h($_SESSION['USER_NAME']) ;?>"> 122 </div></td> 123 </tr> 124 <tr> 125 <td class="itemName"><div>E-mail</div></td> 126 <td><div> 127 <input type="text" name="email" value="<?php echo h($_SESSION['EMAIL']) ;?>"> 128 </div></td> 129 </tr> 130 <tr> 131 <td class="itemName"><div>タイトル</div></td> 132 <td><div> 133 <input type="text" name="title" value="<?php echo h($_SESSION['TITLE']) ;?>"> 134 </div></td> 135 </tr> 136 <tr> 137 <td class="itemName"><div>本文</div></td> 138 <td><div> 139 <textarea name="text" cols="35" rows="5"><?php echo h($_SESSION['TEXT']) ;?></textarea> 140 </div></td> 141 </tr> 142 <?php 143 144 //DB,COLOR_MASTERからデータを全件取得 145 $dbh = new DBgetDBH(); 146 $stmt = $dbh->getDBconnect()->prepare('select * from COLOR_MASTER'); 147 148 $stmt->execute(); 149 $rows = $stmt->fetchAll(); 150 ?> 151 <tr> 152 <td class="itemName"><div>文字色</div></td> 153 <td><div> 154 <!-- 後で直す --> 155 <?php foreach($rows as $row) : ?> 156 <input class="radio" type="radio" name="color" value="<?php echo h($row['COLOR_ID']) ; ?>" id="<?php echo h($row['COLOR_ID']) ; ?>" 157 <?php if($_SESSION['COLOR'] === "" AND h($row['COLOR_ID']) === 3 OR $_SESSION['COLOR'] === h($row['COLOR_ID'])){ echo 'checked' ;} ;?>> 158 <label for="<?php echo h($row['COLOR_ID']) ; ?>" style="color:#<?php echo h($row['COLOR_CODE']) ; ?>"><?php echo h($row['COLOR_NAME']) ; ?></label> 159 <?php endforeach ; ?> 160 </div></td> 161 </tr> 162 </table> 163 </div> 164 <div> 165 <?php 166 167 //セッションIDを$_SESSIONに格納 168 $_SESSION['SESSION_ID'] = session_id(); 169 170 //$_SESSION_IDをハッシュ化してトークンを生成 171 $token = hash("sha256", $_SESSION['SESSION_ID']); 172 173 $_SESSION['token'] = $token; 174 175 ?> 176 <input type="submit" name="clear" value="クリア"> 177 <input type="submit" name="Submit" value="確認"> 178 <input type="hidden" name="token" value="<?php echo $token ; ?>"> 179 </div> 180 </form> 181 <hr> 182 <?php 183 184 //DBから過去記事を取得 185 $dbh = new DBgetDBH(); 186 $stmt = $dbh->getDBconnect()->prepare('SELECT * FROM ARTICLE RIGHT JOIN COLOR_MASTER ON ARTICLE.COLOR_ID = COLOR_MASTER.COLOR_ID ORDER BY CREATE_DATE DESC;'); 187 $stmt->execute(); 188 $rows = $stmt->fetchAll(); 189 190 ?> 191 <div> 192 <?php foreach($rows as $row) : ?> 193 <table class="postedArticle" style="color:#<?php echo h($row['COLOR_CODE']); ?>"> 194 <tr> 195 <td class="articleId"><div><?php echo h($row['ARTICLE_ID']) ; ?></div></td> 196 <td class="articleTitle"><div> 197 <?php 198 199 $checkBlank = new CheckFunction(); 200 $return = $checkBlank->checkBlank(h($row['TITLE'])); 201 if($return === false){ 202 echo "no title"; 203 }else{ 204 echo h($row['TITLE']); 205 } 206 ?> 207 </div></td> 208 </tr> 209 <tr> 210 <!-- 211 colspanタグ…表(テーブル)にて、水平方向のセルの結合数(セルがまたがる列数)を指定する。 212 --> 213 <td class="articleText" colspan="2"><div> 214 <?php echo h($row['TEXT']) ?> 215 </div></td> 216 </tr> 217 <tr> 218 <td class="articleDate" colspan="2"><div> 219 <?php 220 $date = h($row['CREATE_DATE']); 221 echo date('Y年m月d日 H時i分',strtotime($date)); 222 223 $checkBlank = new CheckFunction(); 224 $return = $checkBlank->checkBlank(h($row['NAME'])); 225 226 if($return === false){ 227 $name = "nobody"; 228 }else{ 229 $name = h($row['NAME']); 230 } 231 232 $checkBlank = new CheckFunction(); 233 $return = $checkBlank->checkBlank(h($row['EMAIL'])); 234 235 if($return === false){ 236 echo " ".h($name); 237 }else{ 238 echo " ".'<a href="mailto:'.h($row['EMAIL']).'">'.h($name).'</a>'; 239 } 240 ?> 241 </div></td> 242 </tr> 243 </table> 244 <?php endforeach ; ?> 245 </div> 246 </div> 247</main> 248</body> 249</html>

試したこと

上記のコードを記述し、ラジオボタン選択時に、どの値を持っているかを確認しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hianmain

2020/05/08 08:39

すみません、エラーについては何も起きていないのでif文の内容が違うのではないかなと考えています(合っているものを書いているつもりではあるのですが…)
kei344

2020/05/08 08:45

では$_SESSION['COLOR']の定義部分も提示してください。
hianmain

2020/05/08 08:50

非常に長いですがコードをすべて記述しました。
guest

回答2

0

php

1<?php if($_SESSION['COLOR'] === "" && h($row['COLOR_ID']) === 3 || $_SESSION['COLOR'] === h($row['COLOR_ID'])){ echo 'checked' ;} ;?>>

php

1<?php if($_SESSION['COLOR'] === "" && $row['COLOR_ID'] === 3 || $_SESSION['COLOR'] === $row['COLOR_ID']){ echo 'checked' ;} ;?>>

h()関数は内部的にhtmlspecialchars()をしているのだと想像しますが、
htmlspecialchars()は文字列を返します。

「===」で比較すると、型まで密にチェックされるので、
$row['COLOR_ID']が文字列になると数値の3とは違うと判定されます。

htmlspecialchars()はechoをかけるタイミングだけに使用し、
値の比較の際には使ってはいけません。

また、$_SESSION['COLOR']の初期値も空文字が入るようにしないと想定の動作をしません。

投稿2020/05/08 08:43

Akiya

総合スコア144

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

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

hianmain

2020/05/08 11:30

h()関数についてはしらなかったです!ありがとうございます! また、$_SESSION['COLOR']の初期値も空文字が入るようにしないと想定の動作をしません。 とありますがこれはどのようにすれば解決しますか?
guest

0

比較部分のコードを変更しないのであればどこかで

php

1$_SESSION['COLOR'] = '';

とするか、

php

1($_SESSION['COLOR'] ?? '') === ''

比較時にこのような対応をしてください。
(古いバージョンのPHPだと動作しませんが、
同様の処理になるように調べて実装してみてください)

投稿2020/05/08 19:41

Akiya

総合スコア144

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

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

Akiya

2020/05/08 19:43

返事先を間違えました…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問