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

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

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

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

PHP

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

Q&A

解決済

3回答

2824閲覧

phpのtextareaでのデータ送信がなぜか出来ず困っています。助けていただけましたら幸いです。

shaketaku

総合スコア3

MySQL

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

PHP

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

0グッド

0クリップ

投稿2023/04/11 10:16

編集2023/04/12 09:15

実現したいこと

textareaでカレンダーに書き込みをしてスケジュールカレンダーのようなものを作りたいと考えています。

前提

php,mysqlで書き込めるカレンダースケジュールシステムを作っています。

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

textareaの内容をformにて送信するのがうまくできておらず、困っております。いろいろと調べたのですが、なぜ送信が出来ていないのかがよくわからず、教えていただけましたら幸いです。

該当のソースコード

ソースコード

<!-----------カレンダープログラム---------------> <?php var_dump($_POST['text_msg']); //追加 $ym = null; $timestamp = null; $today = null; $html_title = null; $prev = null; $next = null; $day_count = null; $youbi = null; $weeks = null; $week = null; $day = null; $day_count = null; $option = null; $pdo = null; $text_msg = array(); session_start(); //タイムゾーンを設定 date_default_timezone_set('Asia/Tokyo'); //前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 if(isset($_GET['ym'])){ $ym = $_GET['ym']; }else{ //今月の年月を表示 $ym = date('Y-m'); } //タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする //strtotime('Y-m-01') $timestamp = strtotime($ym . '-01'); if($timestamp === false){//エラー対策として形式チェックを追加 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 $ym = date('Y-m'); $timestamp = strtotime($ym . '-01'); } //今月の日付 フォーマット  $today = date('Y-m-j'); //カレンダーのタイトルを作成 例)2020年10月 $html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) //前月・次月の年月を取得 //strtotime(,基準) $prev = date('Y-m', strtotime('-1 month', $timestamp)); $next = date('Y-m', strtotime('+1 month', $timestamp)); //該当月の日数を取得 $day_count = date('t', $timestamp); //1日が何曜日か $youbi = date('w', $timestamp); //カレンダー作成の準備 $weeks = []; $week = ''; //第1週目:空のセルを追加 //str_repeat(文字列, 反復回数) $week .= str_repeat('<td></td>', $youbi); for($day = 1; $day <= $day_count; $day++, $youbi++) { $date = $ym . '-' . $day; //それぞれの日付をY-m-d形式で表示例:2020-01-23 //$dayはfor関数のおかげで1日づつ増えていく if($today == $date) { //もしその日が今日なら $week .= '<td class="today">' . $day . "<textarea name = 'text_msg'>" ; } else { //上2つ以外なら //修正 $week .= '<td>' . $day . "<textarea name = 'text_msg'>"; } $week .= '</textarea>'.'</td>'; if($youbi % 7 == 6 || $day == $day_count) {//週終わり、月終わりの場合 //%は余りを求める、||はまたは //土曜日を取得 if($day == $day_count) {//月の最終日、空セルを追加 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 $week = '';//weekをリセット } } ?> <?php //データベースの接続情報 define( 'DB_HOST', 'localhost'); define( 'DB_USER', 'root'); define( 'DB_PASS', 'growry1293'); define( 'DB_NAME' , 'calender'); try{ $option = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_MULTI_STATEMENTS => false); $pdo = new PDO('mysql:charset=UTF8;dbname='.DB_NAME.';host='.DB_HOST,DB_USER,DB_PASS, $option); }catch(PDOException $e){ $error_msg[]= $e -> getMessage(); } if (!empty(($_POST['update']))) {  //修正 $text_msg = preg_replace('/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '',$_POST['text_msg']); echo $text_msg; if(empty($text_msg)){ $error_msg[] = '内容を入力してください。' ; }else{ $_SESSION['text_msg'] = $text_msg; } if(empty($error_msg)){ $pdo -> beginTransaction(); try{ // SQL作成 $stmt = $pdo->prepare("INSERT INTO msg_box (text_msg) VALUES ( :text_msg)"); // 値をセット $stmt->bindParam( ':text_msg', $text_msg, PDO::PARAM_STR); //sqlクエリの実行 $res = $stmt->execute(); //コミット $res = $pdo->commit(); }catch(Exception $e){ $pdo -> rollBack(); } if($res){ $_SESSION['success_msg'] = "書き込みに成功しました"; }else{ $error_msg[] = "書き込みに失敗しました。"; } $stmt = null; header('Location:[""]'); exit; } }else{ echo "データが送信されていない"; } if( !empty($pdo)){ //メッセージのデータを取得する $sql = "SELECT text_msg FROM msg_box"; $message_array = $pdo->query($sql); } ?> <!-----------カレンダープログラム---------------> <!-----------データベースに接続--------> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>PHPカレンダー</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet"> <style> .container { font-family: 'Noto Sans', sans-serif; margin-top: 80px; width: 80vw; margin: 0 auto; } h3 { margin-bottom: 30px; } th { height: 30px; text-align: center; } td { height: 100px; } textarea{ height: 100px; width: auto; } .today { background: orange; } th:nth-of-type(1), td:nth-of-type(1) { color: red; } th:nth-of-type(7), td:nth-of-type(7) { color: blue; } .holiday{ color: red; } .update_box{ text-align: center; } .submit_box{ width: 120px; height: 50px; margin: 50px auto; } </style> </head> <body id=""> <div class="container"> <h3><a href="?ym=<?php echo $prev; ?>">&lt;</a><?php echo $html_title; ?><a href="?ym=<?php echo $next; ?>">&gt;</a></h3> <form action="" method = "POST"> <table class="table table-bordered"> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> <?php foreach ($weeks as $week) { echo $week; } ?> </table> <div class = "update_box"> <input type="submit" name = "update" class = "submit_box" value = "更新する"></input> </div> </form> </div> </body> </html> ```ここに言語名を入力

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

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

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

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

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

yambejp

2023/04/11 10:19

ソースコードのマークダウンがおかしくなっています
y_waiwai

2023/04/11 10:50

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
shaketaku

2023/04/11 16:02

ご指摘ありがとうございます。 修正いたしました。 お時間あるときにでも回答いただけましたら幸いです。
yambejp

2023/04/12 07:26

とりあえずtextareaのnameの付け方が煩雑で処理がおかしくなっています 配列系の名前の付け方にするなど工夫が必要でしょう。 getとpostを混ぜて使ったり、手に負えないならpostに統一してください $_SERVER['PHP_SELF']とかも使っちゃダメなやつです
shaketaku

2023/04/12 09:17 編集

ご指摘ありがとうございます。 自分でもnameの付け方に問題があるのかと思っていましたので、ご指摘いただいたようにnameを単純なものに変えました。とりあえず全部のtextareaに同じnameをつけて、それでデータが無事送信されてたら配列の名前に変更しようと思ったのですが、データが送信されてもデータの中身が空になっている状況です。 なぜこのようなことになっているのかわからず、教えていただけないでしょうか。 自分の予想だと先頭のvar_dumpにて入力された文字列が表示されるはずなのですが、、、。
yambejp

2023/04/12 09:23

回答つけておきました。 質問が冗長すぎてわかりづらいので、もっと課題を絞った方が解決しやすくなると思いますよ
shaketaku

2023/04/12 09:56

ありがとうございます! アドバイスもありがとうございます。 今後はそのようにいたします。
guest

回答3

0

自己解決

皆様、丁寧にご回答いただき本当にありがとうございました。
無事に解決することが出来ました。
配列にしてデータを送ることで無事にデータを取得することが出来ました。

php

1<!-----------カレンダープログラム---------------> 2<?php 3var_dump($_POST); 4$ym = null; 5$timestamp = null; 6$today = null; 7$html_title = null; 8$prev = null; 9$next = null; 10$day_count = null; 11$youbi = null; 12$weeks = null; 13$week = null; 14$day = null; 15$day_count = null; 16$option = null; 17$pdo = null; 18$text_msg = array(); 19 20session_start(); 21//タイムゾーンを設定 22date_default_timezone_set('Asia/Tokyo'); 23 24 25//前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 26if(isset($_GET['ym'])){ 27 $ym = $_GET['ym']; 28}else{ 29 //今月の年月を表示 30 $ym = date('Y-m'); 31} 32 33//タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする 34//strtotime('Y-m-01') 35$timestamp = strtotime($ym . '-01'); 36if($timestamp === false){//エラー対策として形式チェックを追加 37 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 38 $ym = date('Y-m'); 39 $timestamp = strtotime($ym . '-01'); 40} 41 42//今月の日付 フォーマット  43$today = date('Y-m-j'); 44 45//カレンダーのタイトルを作成 例)2020年10月 46$html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) 47 48//前月・次月の年月を取得 49//strtotime(,基準) 50$prev = date('Y-m', strtotime('-1 month', $timestamp)); 51$next = date('Y-m', strtotime('+1 month', $timestamp)); 52 53 54//該当月の日数を取得 55$day_count = date('t', $timestamp); 56 57//1日が何曜日か 58$youbi = date('w', $timestamp); 59 60//カレンダー作成の準備 61$weeks = []; 62$week = ''; 63 64//第1週目:空のセルを追加 65//str_repeat(文字列, 反復回数) 66$week .= str_repeat('<td></td>', $youbi); 67 68for($day = 1; $day <= $day_count; $day++, $youbi++) { 69 70 $date = $ym . '-' . $day; 71 //それぞれの日付をY-m-d形式で表示例:2020-01-23 72 //$dayはfor関数のおかげで1日づつ増えていく 73 74 if($today == $date) { 75 //もしその日が今日なら 76 $week .= '<td class="today">' . $day . "<textarea name = 'text_msg[]'>" ; 77 } else { 78 //上2つ以外なら 79 $week .= '<td>' . $day . "<textarea name = 'text_msg[]'>"; 80 } 81 $week .= '</textarea>'.'</td>'; 82 83 if($youbi % 7 == 6 || $day == $day_count) {//週終わり、月終わりの場合 84 //%は余りを求める、||はまたは 85 //土曜日を取得 86 87 if($day == $day_count) {//月の最終日、空セルを追加 88 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); 89 } 90 91 $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 92 93 $week = '';//weekをリセット 94 } 95} 96?> 97<?php 98//データベースの接続情報 99define( 'DB_HOST', 'localhost'); 100define( 'DB_USER', 'root'); 101define( 'DB_PASS', 'growry1293'); 102define( 'DB_NAME' , 'calender'); 103 104 105try{ 106 $option = array( 107 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 108 PDO::MYSQL_ATTR_MULTI_STATEMENTS => false); 109 $pdo = new PDO('mysql:charset=UTF8;dbname='.DB_NAME.';host='.DB_HOST,DB_USER,DB_PASS, $option); 110}catch(PDOException $e){ 111 $error_msg[]= $e -> getMessage(); 112} 113 114if (isset(($_POST["update"]))){ 115 for($i = 1; $i<count($_POST["text_msg"]); $i++){ 116 if(!empty($_POST["text_msg"][$i])){ 117 $text_msg=preg_replace('/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $_POST["text_msg"][$i]); 118 echo("データが送信されました"); 119 print_r($_POST["text_msg"][$i]); 120 break; 121 } 122 } 123 if(empty($text_msg)){ 124 $error_msg[] = '内容を入力してください。'; 125 }else{ 126 $_SESSION['text_msg'] = $text_msg; 127 } 128 129 if(empty($error_msg)){ 130 131 $pdo -> beginTransaction(); 132 133 try { 134 // SQL作成 135 $stmt = $pdo->prepare("INSERT INTO msg_box (text_msg) VALUES ( :text_msg)"); 136 137 // 値をセット 138 $stmt->bindParam(':text_msg', $text_msg, PDO::PARAM_STR); 139 140 //sqlクエリの実行 141 $res = $stmt->execute(); 142 143 //コミット 144 $res = $pdo->commit(); 145 } catch(Exception $e) { 146 $pdo -> rollBack(); 147 } 148 if($res) { 149 $_SESSION['success_msg'] = "書き込みに成功しました"; 150 } else { 151 $error_msg[] = "書き込みに失敗しました。"; 152 } 153 $stmt = null; 154 header('"Location:C:\Users\81806\Downloads\originalsite\ess_portal_site\php\calender_php\calender.php'); 155 exit; 156 } 157}else { 158 echo "データが送信されていない。"; 159} 160if(!empty($pdo)) { 161 162 //メッセージのデータを取得する 163 $sql = "SELECT text_msg FROM msg_box"; 164 $message_array = $pdo->query($sql); 165} 166?> 167 168<!-----------カレンダープログラム---------------> 169<!-----------データベースに接続--------> 170 171 172<!DOCTYPE html> 173<html lang="ja"> 174<head> 175 <meta charset="utf-8"> 176 <title>PHPカレンダー</title> 177 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 178 <link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet"> 179 <style> 180 .container { 181 font-family: 'Noto Sans', sans-serif; 182 margin-top: 80px; 183 width: 80vw; 184 margin: 0 auto; 185 } 186 h3 { 187 margin-bottom: 30px; 188 } 189 th { 190 height: 30px; 191 text-align: center; 192 } 193 td { 194 height: 100px; 195 } 196 textarea{ 197 height: 100px; 198 width: auto; 199 } 200 .today { 201 background: orange; 202 } 203 th:nth-of-type(1), td:nth-of-type(1) { 204 color: red; 205 } 206 th:nth-of-type(7), td:nth-of-type(7) { 207 color: blue; 208 } 209 .holiday{ 210 color: red; 211 } 212 .update_box{ 213 text-align: center; 214 } 215 .submit_box{ 216 width: 120px; 217 height: 50px; 218 margin: 50px auto; 219 } 220 </style> 221</head> 222 223<body id=""> 224 <div class="container"> 225 <h3><a href="?ym=<?php echo $prev; ?>">&lt;</a><?php echo $html_title; ?><a href="?ym=<?php echo $next; ?>">&gt;</a></h3> 226 <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> 227 <table class="table table-bordered"> 228 <tr> 229 <th></th> 230 <th></th> 231 <th></th> 232 <th></th> 233 <th></th> 234 <th></th> 235 <th></th> 236 </tr> 237 <?php 238 foreach ($weeks as $week) { 239 echo $week; 240 } 241 ?> 242 </table> 243 <div class = "update_box"> 244 <input type="submit" class = "submit_box" value = "更新する" name = "update"></input> 245 </div> 246 </form> 247 </div> 248</body> 249</html>

投稿2023/04/12 16:19

shaketaku

総合スコア3

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

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

0

とりあえず、同じような送付パラメータを配列的にあつかうにはこう

PHP

1<?PHP 2$text_msg=filter_input(INPUT_POST,"text_msg",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3var_dump($text_msg); 4?> 5<form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post"> 6<textarea name="text_msg[1]">a</textarea> 7<textarea name="text_msg[2]">b</textarea> 8<textarea name="text_msg[3]">c</textarea> 9<input type="submit" value="send"> 10</form>

投稿2023/04/12 09:21

yambejp

総合スコア114839

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

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

shaketaku

2023/04/12 16:20

ありがとうございます。 yambejp様のおかげでヒントを得てうまく解決することが出来ました。 本当にありがとうございました!!
guest

0

エラーが出ていることに気がついていますか?
先頭に下記を記述して実行してみてください。

PHP

1<?php 2ini_set('display_errors', 1); //追加 3 4$ym = null;

投稿2023/04/11 16:38

pippi19

総合スコア679

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

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

shaketaku

2023/04/11 17:38

返信ありがとうございます。 エラーは気づいているのですが、こちらのエラーはtextareaからのデータが送信されていないため、条件式の部分がイコールにならずループを抜けないためこのようなエラーが出てるのではないかと考えているのですが、違いますでしょうか?また、どのようにしたら書き込めるタイプのカレンダースケジュールが出来るか教えていただけたら幸いです。初学者のため基本的な質問をしてしまい申し訳ありません。
pippi19

2023/04/11 17:49

本当にtextareaの値がPOSTできていないかどうか、今一度確認してみてください。 デバッグ方法は下記を先頭に追加します。 <?php var_dump($_POST);
shaketaku

2023/04/12 16:21

丁寧に回答いただきありがとうございました。 おかげさまで解決することが出来ました。 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問