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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

2回答

583閲覧

適切な条件分岐がわからない

hitonoko

総合スコア42

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2022/09/22 02:20

編集2022/09/22 02:36

前提

phpとデータベースをphpmyadmin5.1.1で簡易的なカレンダーアプリを作っています。
選択した日付の横のtdに送信したテキストを表示させる機能を実装中に以下のが発生しました。

実現したいこと

登録を押した時の年($year)と月($month)と日にち($d)が、DB内のyearとmonthとdayとと同じだった場合に処理が実行されるようにしたい

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

全ての日付の横のtdにテキストが表示されてしまう。

該当のソースコード

php

1<?php 2 3$year = date("Y"); 4$month = date("m"); 5$answer = ""; 6$datehide = ""; 7$data = ""; 8$text =""; 9$redday=""; 10$redmonth =""; 11$redyear = ""; 12$redtext = ""; 13if(isset($_GET['open'])){ 14 $year = $_GET['year']; 15 $month = $_GET['month']; 16 17 if($year >= 2031 || $year <= 1999){ 18 $answer = "無効な年 "; 19 $redyear = "borderred"; 20 $year = date("Y"); 21 $datehide = "datehide"; 22 } 23 24 if($month >= 13 || $month <= 0){ 25 $answer .= "無効な月 "; 26 $redmonth = "borderred"; 27 $month = date("m"); 28 $datehide = "datehide"; 29 } 30 31} 32 33if(isset($_POST['add'])){ 34 $answer = ""; 35 $redmonth =""; 36 $redyear = ""; 37 $day = $_POST['day']; 38 $text = $_POST['text']; 39 $date = date('d',strtotime("$year-$month last day of this month")); 40 if($day > $date || $day <= 0){ 41 $answer .= "無効な日付 "; 42 $redday = "borderred"; 43 $datehide = "datehide"; 44 }elseif($text == "" || ctype_space($text)||mb_ereg_match(' ',$text)){ 45 $answer .= "空欄 "; 46 $redtext = "borderred"; 47 }else{ 48 $dsn = 'mysql:dbname=schedule;host=localhost'; 49 $user = 'root'; 50 $pass = ''; 51 52 try{ 53 $dbh = new PDO($dsn, $user, $pass); 54 55 $dbh->query('SET NAMES utf8'); 56 57 58 $sql = 'insert into schedule (year, month,day,content) values (?, ?, ?, ?)'; 59 $stmt = $dbh->prepare($sql); 60 $flag = $stmt->execute(array($year, $month,$day,$text)); 61 62 }catch (PDOException $e){ 63 print('Error:'.$e->getMessage()); 64 die(); 65 } 66 $dbh = null; 67 header("Location:calendar2.php?year=$year&month=$month&open=表示"); 68 exit; 69 } 70 71} 72 73?> 74 75<html> 76 <style> 77 tbody{ 78 display:flex; 79 } 80 tr{ 81 display:flex; 82 border:1px solid black; 83 } 84 85 td{ 86 border:1px solid black; 87 display:flex; 88 } 89 90 .datehide{ 91 display:none; 92 } 93 94 .borderred{ 95 border:3px solid red; 96 } 97 </style> 98 <form action="" method="get"> 99 <select name="year" class="<?php echo $redyear ?>"> 100 <?php 101 if($year == ""){ 102 $year = date("Y"); 103 104 }else{ 105 $year = $year; 106 } 107 for($y= 2000; $y <=2030; $y++){ 108 if($year == $y){ 109 $selected = "selected"; 110 }else{ 111 $selected = ""; 112 } 113 echo "<option $selected>$y</option>"; 114 } 115 ?> 116 </select> 117 <select name="month" id="" class="<?php echo $redmonth ?>"> 118 <?php 119 if($month == ""){ 120 $month = date("m"); 121 122 }else{ 123 $month = $month; 124 } 125 for($m= 1; $m <=12; $m++){ 126 if($month == $m){ 127 $selected = "selected"; 128 }else{ 129 $selected = ""; 130 } 131 echo "<option $selected>$m</option>"; 132 } 133 ?> 134 </select> 135 <input type="submit" name="open" value="表示" ></input> 136 </form> 137 <br></br> 138 <div class="<?php echo $datehide ?>"><?php echo $year?><?php echo $month ?></div> 139 <?php echo $answer?> 140 <form action="" method="post"> 141 <select name="day" id="" class="<?php echo $redday ?>"> 142 <?php 143 $date = date('d',strtotime("$year-$month last day of this month")); 144 for($d= 1; $d <=$date; $d++){ 145 echo "<option>$d</option>"; 146 } 147 ?> 148 </select> 149 <input type="text" name="text" class="<?php echo $redtext ?>"> 150 <input type="submit" name="add" value="登録"> 151 <?php 152 for($d= 1; $d <=$date; $d++){ 153 ?> 154 <table> 155 <tbody> 156 <tr> 157 <?php echo "<td>$d</td>"; ?> 158 <td> 159 <?php 160 $txt =""; 161 $dsn = 'mysql:dbname=schedule;host=localhost'; 162 $user = 'root'; 163 $pass = ''; 164 165 $dbh = new PDO($dsn, $user, $pass); 166 167 // SQLを実行する 168 $sql = 'SELECT * FROM schedule'; 169 $stmt = $dbh->query($sql); 170 // SQLの実行結果を取り出す 171 while($schedule = $stmt->fetch(PDO::FETCH_ASSOC)){ 172 /*selectで値を抽出してwhereで登録した年($year)と月($month)と日にち($d)が 173 DB内のyearとmonthとdayとと同じだった場合に処理が実行されるように記述した 174 つもりだが全てのtdに$textが表示されてしまう。*/ 175 if("SELECT year, month, day FROM schedule WHERE year = $year AND month = $month AND day = $d"){ 176 if($txt == ""){ 177 $txt = htmlspecialchars($schedule["content"], ENT_QUOTES, "UTF-8"); 178 }else{ 179 $txt .= htmlspecialchars(",".$schedule["content"], ENT_QUOTES, "UTF-8"); 180 } 181 } 182 } 183 echo $txt; 184 // 接続を閉じる 185 $dbh = null; 186 187 ?> 188 189 </td> 190 </tr> 191 </tbody> 192 </table> 193 <?php 194 } 195 ?> 196 </form> 197</html>

試したこと

条件を

if("SELECT year, month, day FROM schedule WHERE year IN($year) AND month IN($month) AND day IN($d"))

にしてみたが動かない

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

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

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

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

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

m.ts10806

2022/09/22 02:24

>phpmyadminを使って あくまでMySQLもしくはMariaDBを操作するためのツールでしかないので、 表現としては正しくないです。 「データベースを〇〇で」としたほうが良いでしょう。 ※〇〇は自身のDBとバージョンを記載してください。
m.ts10806

2022/09/22 02:26 編集

あと >if("SELECT year, month, day FROM schedule WHERE year = $year AND month = $month AND day = $d"){ SQL「文」であってSQLの実行結果ではないので、これは全く意味不明なコードになっていると思います。 SQL文はPHPにとってはただの文字列です。
guest

回答2

0

状況がわかりませんが、year/month/dayを別々に持つのではなくdate型の1カラムでもつことをおすすめします
UIの絡みでY/M/Dが別々のパラメータで送られてくるとしても、受け取り側で合体して処理すればよいでしょう

投稿2022/09/22 02:59

yambejp

総合スコア114762

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

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

0

自己解決

php

1<?php 2session_start(); 3 4//ログインされていない場合は強制的にログインページにリダイレクト 5if (!isset($_SESSION["login"])) { 6 header("Location: index.php"); 7 exit(); 8} 9 10//ログインされている場合は表示用メッセージを編集 11$message = $_SESSION['login']."さんようこそ"; 12$message = htmlspecialchars($message); 13 14$year = date("Y"); 15$month = date("m"); 16$answer = ""; 17$datehide = ""; 18$data = ""; 19$text =""; 20$redday=""; 21$redmonth =""; 22$redyear = ""; 23$redtext = ""; 24if(isset($_GET['open'])){ 25 $year = $_GET['year']; 26 $month = $_GET['month']; 27 28 if($year >= 2031 || $year <= 1999){ 29 $answer = "無効な年 "; 30 $redyear = "borderred"; 31 $year = date("Y"); 32 $datehide = "datehide"; 33 } 34 35 if($month >= 13 || $month <= 0){ 36 $answer .= "無効な月 "; 37 $redmonth = "borderred"; 38 $month = date("m"); 39 $datehide = "datehide"; 40 } 41 42} 43 44if(isset($_POST['add'])){ 45 $answer = ""; 46 $redmonth =""; 47 $redyear = ""; 48 $day = $_POST['day']; 49 $text = $_POST['text']; 50 $date = date('d',strtotime("$year-$month last day of this month")); 51 if($day > $date || $day <= 0){ 52 $answer .= "無効な日付 "; 53 $redday = "borderred"; 54 $datehide = "datehide"; 55 }elseif($text == "" || ctype_space($text)||mb_ereg_match(' ',$text)){ 56 $answer .= "空欄 "; 57 $redtext = "borderred"; 58 }else{ 59 $dsn = 'mysql:dbname=schedule;host=localhost'; 60 $user = 'root'; 61 $pass = ''; 62 63 try{ 64 $dbh = new PDO($dsn, $user, $pass); 65 66 $dbh->query('SET NAMES utf8'); 67 68 69 $sql = 'insert into schedule (year, month,day,content) values (?, ?, ?, ?)'; 70 $stmt = $dbh->prepare($sql); 71 $flag = $stmt->execute(array($year, $month,$day,$text)); 72 73 }catch (PDOException $e){ 74 print('Error:'.$e->getMessage()); 75 die(); 76 } 77 $dbh = null; 78 header("Location:calendar2.php?year=$year&month=$month&open=表示"); 79 exit; 80 } 81 82} 83 84?> 85 86<html> 87 <style> 88 tbody{ 89 display:flex; 90 } 91 tr{ 92 display:flex; 93 border:1px solid black; 94 } 95 96 td{ 97 border:1px solid black; 98 display:flex; 99 } 100 101 .datehide{ 102 display:none; 103 } 104 105 .borderred{ 106 border:3px solid red; 107 } 108 </style> 109 <form action="" method="get"> 110 <div class="message"><?php echo $message;?></div> 111 <select name="year" class="<?php echo $redyear ?>"> 112 <?php 113 if($year == ""){ 114 $year = date("Y"); 115 116 }else{ 117 $year = $year; 118 } 119 for($y= 2000; $y <=2030; $y++){ 120 if($year == $y){ 121 $selected = "selected"; 122 }else{ 123 $selected = ""; 124 } 125 echo "<option $selected>$y</option>"; 126 } 127 ?> 128 </select> 129 <select name="month" id="" class="<?php echo $redmonth ?>"> 130 <?php 131 if($month == ""){ 132 $month = date("m"); 133 134 }else{ 135 $month = $month; 136 } 137 for($m= 1; $m <=12; $m++){ 138 if($month == $m){ 139 $selected = "selected"; 140 }else{ 141 $selected = ""; 142 } 143 echo "<option $selected>$m</option>"; 144 } 145 ?> 146 </select> 147 <input type="submit" name="open" value="表示" ></input> 148 </form> 149 <a href="logout.php">ログアウト</a> 150 <br></br> 151 <div class="<?php echo $datehide ?>"><?php echo $year?><?php echo $month ?></div> 152 <?php echo $answer?> 153 <form action="" method="post"> 154 <select name="day" id="" class="<?php echo $redday ?>"> 155 <?php 156 $date = date('d',strtotime("$year-$month last day of this month")); 157 for($d= 1; $d <=$date; $d++){ 158 echo "<option>$d</option>"; 159 } 160 ?> 161 </select> 162 <input type="text" name="text" class="<?php echo $redtext ?>"> 163 <input type="submit" name="add" value="登録"> 164 <?php 165 for($d= 1; $d <=$date; $d++){ 166 ?> 167 <table> 168 <tbody> 169 <tr> 170 <?php echo "<td>$d</td>"; ?> 171 <td> 172 <?php 173 $txt =""; 174 $dsn = 'mysql:dbname=schedule;host=localhost'; 175 $user = 'root'; 176 $pass = ''; 177 178 $dbh = new PDO($dsn, $user, $pass); 179 180 // SQLを実行する 181 $sql = "SELECT * FROM schedule WHERE year = $year AND month = $month "; 182 $stmt = $dbh->query($sql); 183 // SQLの実行結果を取り出す 184 while($schedule = $stmt->fetch(PDO::FETCH_ASSOC)){ 185 if($d == $schedule["day"]){ 186 if($txt == ""){ 187 $txt = htmlspecialchars($schedule["content"], ENT_QUOTES, "UTF-8"); 188 }else{ 189 $txt .= htmlspecialchars(",".$schedule["content"], ENT_QUOTES, "UTF-8"); 190 } 191 } 192 } 193 echo $txt; 194 // 接続を閉じる 195 $dbh = null; 196 197 ?> 198 199 </td> 200 </tr> 201 </tbody> 202 </table> 203 <?php 204 } 205 ?> 206 </form> 207</html>

投稿2022/09/28 02:21

hitonoko

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問