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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PHP

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

Q&A

解決済

4回答

3171閲覧

SELECT文とパラメータの引き継ぎ

yutaishikawa_

総合スコア58

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2015/07/10 00:27

編集2015/07/10 08:11

前回に引き続き、質問させていただきます。
現在タスク機能付きのカレンダーを作成しているところでして、SELECT文でMySQLからカラムを表示しようとしたところ、中々うまくいきません。

方法として、$taskという変数と、$taskDataという連想配列を準備し、
$rowにテーブル情報を格納。
最後に、$taskという変数に<td></td>という処理をもたせ、ループすることで、タスクありの日付をカレンダーから選択されたときに、その日のテーブル情報を引っ張ってこれるのではないかと思っておりました。
↓画像の<tabale>タグに、index.phpで作成しているカレンダーの日付に格納されている情報を表示したく思っております。
![イメージ説明]WIDTH:390

あと、もう少しな気がするのですが、知識不足でつまづいてしまいました。
具体的な表示方法等(記述)がありましたら、ご指導宜しくお願い致します。

lang

1<?php 2require_once('dbconnect.php'); 3// 年月日のパラメータを取得する。 4$ymd = isset($_GET['ymd']) ? $_GET['ymd'] : date("Y-m-d"); 5$task = ""; 6// タスクの配列を準備 7$taskData = array(); 8// PHP->MySQLtable 9// タスクのパラメータを送れるようにする。 10$query = $mysqli->query(" SELECT * FROM tasks WHERE task_date = '$ymd' "); 11 // エラー処理 12 if (!$query) { 13 die('クエリーが失敗しました。'.mysql_error()); 14 } 15 // 日ごとにタスクを取得 16 while ($row = $query->fetch_assoc()) { 17 $taskData[] = array( 18 'id'=>$row['id'], 19 'title'=>$row['title'], 20 'task_date'=>$row['task_date'], 21 'place'=>$row['place'], 22 'memo'=>$row['memo'] 23 ); 24 } 25 if (isset($taskData[$row])) { 26 // 結合代入演算子を使用して、<td>を取得。配列の箱が完成。 27 $task .= str_repeat('<td></td>', 5); 28 $tasks = '<td>'.$row.'</td>'; 29 // タスクを初期化 30 $task = ""; 31 } 32?> 33<!DOCTYPE html> 34<html lang="ja"> 35<meta charset="utf-8"> 36<title>Today | タスク一覧</title> 37<table border="1"> 38 <thead> 39 <tr> 40 <th>タイトル</th> 41 <th>日時</th> 42 <th>場所</th> 43 <th>メモ</th> 44 </tr> 45 </thead> 46 <tbody> 47 <?php 48 echo $task; 49 ?> 50 </tbody> 51</table> 52 <p><a href="index.php">追加画面に戻る</a></p> 53</html>

追記:皆様ご回答ありがとうございます。まとめてみたところ、以下のような記述となりました。
ですが、表示はされません。

lang

1<?php 2require_once('dbconnect.php'); 3// 年月日のパラメータを取得する。 4$ymd = isset($_GET['ymd']) ? $_GET['ymd'] : date("Y-m-d"); 5// タスクの配列を準備 6$task = ""; 7$taskData = array(); 8// PHP->MySQLtable 9// タスクのパラメータを送れるようにする。 10$query = $mysqli->query(" SELECT * FROM tasks WHERE task_date = '$ymd' "); 11 // エラー処理 12 if (!$query) { 13 die('クエリーが失敗しました。'.mysql_error()); 14 } 15while ($row[] = $query->fetch_assoc()) { 16 // 各メンバ取得 17 $taskData[] = array( 18 'id'=>$row['id'], 19 'title'=>$row['title'], 20 'task_date'=>$row['task_date'], 21 'place'=>$row['place'], 22 'memo'=>$row['memo'] 23 ); 24 // タスクを表示形式に設定 25 $task .= "<td>".$row."</td>"; 26} 27?> 28<!DOCTYPE html> 29<html lang="ja"> 30<meta charset="utf-8"> 31<title>Today | タスク一覧</title> 32<table border="1"> 33 <thead> 34 <tr> 35 <th>タイトル</th> 36 <th>日時</th> 37 <th>場所</th> 38 <th>メモ</th> 39 </tr> 40 </thead> 41 <tbody> 42 <?php foreach ($taskData as $row): ?> 43 <tr> 44 <td><?= htmlspecialchars($row['title']) ?></td> 45 <td><?= htmlspecialchars($row['task_date']) ?></td> 46 <td><?= htmlspecialchars($row['place']) ?></td> 47 <td><?= htmlspecialchars($row['memo']) ?></td> 48 </tr> 49 <?php endforeach; ?> 50 </tbody> 51</table> 52 <p><a href="index.php">追加画面に戻る</a></p> 53</html>

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

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

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

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

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

guest

回答4

0

次のような書き方が良く使われています。

lang

1<table border="1"> 2 <thead> 3 <tr> 4 <th>タイトル</th> 5 <th>日時</th> 6 <th>場所</th> 7 <th>メモ</th> 8 </tr> 9 </thead> 10 <tbody> 11 <?php foreach ($taskData as $data): ?> 12 <tr> 13 <td><?= htmlspecialchars($data['title']) ?></td> 14 <td><?= htmlspecialchars($data['task_date']) ?></td> 15 <td><?= htmlspecialchars($data['place']) ?></td> 16 <td><?= htmlspecialchars($data['memo']) ?></td> 17 </tr> 18 <?php endforeach; ?> 19 </tbody> 20</table>

htmlspecialchars は場合によっては第3引数まで指定しないと脆弱なことがあるので注意)

投稿2015/07/10 01:59

ngyuki

総合スコア4514

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

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

yutaishikawa_

2015/07/10 03:42

ご回答ありがとうございます。 私の乏しい知識から推測するに、foreach():endforeach;で$tadkDataのarray()から各要素から取り出す処理で、それをhtmlspecialcharsでHTMLエンティティに変換して表示している。という認識なのですが、お間違いありませんでしょうか。 日々勉強しているのですが、未だにわからないことが多いので、非解釈するのに非常に手間がかかってしまい、申し訳ありません。 ちなみに$dataなのは何か理由(変数の例で使われることが多い)などございますのでしょうか?
ngyuki

2015/07/10 04:47

> foreach():endforeach;で~~ その通りです。 > ちなみに$dataなのは~~~ ShunsukeIzui さんの回答からコピペしたからです、特に理由はありません。
yutaishikawa_

2015/07/10 08:14

かしこまりました。 また一つ、実用的な知識を得ることができました。 ご回答ありがとうございました。
guest

0

表示の仕方については他の方の回答のものでいいと思います。

多分質問の答えではないので誰も指摘していないと思うのですが、

$ymd = isset($_GET['ymd']) ? $_GET['ymd'] : date("Y-m-d");
$query = $mysqli->query(" SELECT * FROM tasks WHERE task_date = '$ymd' ");

の部分はユーザーがGETのパラメータを書き換えることによって、本来想定されていないSQLが実行できてしまうので危険です。

ここでのチェックには checkdate関数を使うといいと思います。
練習課題ですので、実際に値を整形して、checkdateをかけるまでの処理は記載しないでおきます。

投稿2015/07/10 03:26

編集2015/07/10 03:47
tempakyousuke

総合スコア155

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

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

yutaishikawa_

2015/07/10 03:46

いつもご回答ありがとうございます。 ご指摘ありがとうございます。パラメータのや表示や引き継ぎに関して未だ知識が乏しいので、再度確認しておきます。 表示がされてみた後に、checkdate関数を用い、パラメータの危険性に対し対策を考えてみます。
guest

0

ベストアンサー

まず仕様についてですが、おそらくカレンダーに予定事案等が投稿された場合に、カレンダーの日付等をクリックすると、該当日の詳細予定が表示される物だと推察いたします。

本質問案件は、詳細予定一覧表示画面の内容と見受けます。

質問事項は、DBから該当日付のデータを取得し、1予定=1行にして並べる際に、1件も表示されないということかと存じます。

また、本案件は練習課題について質問されておられると認識しております。
よって、虚弱性等についての記述は省略しています。


while文の中でデータを取得し、$taskDataバッファに詰めておられますが、
while文の後のif文で$taskDataから詰めたデータを取り出していないため、表示されません。

また、$taskに、<td>タグ等詰め込むことで、HTML部分に極力PHPの記述をしない意図があるかと存じます。

そこで、下記のような、while文の中で$task に詰め込むようにされてはいかがでしょう。
(while文の下のif文は削除)

lang

1while ($row = $query->fetch_assoc()) 2{ 3 // 各メンバ取得 4 $id = $row['id']; 5 $title = $row['title']; 6 $task_date = $row['task_date']; 7 $place = $row['place']; 8 $memo = $row['memo']; 9 10 // タスクを表示形式に設定 11 $task .= "<tr><td>${title}</td><td>${task_date}</td><td>${place}</td><td>${memo}</td></tr>"; 12}

■デバック用
下記のように、$row,$task の値を確認してみると、どこに原因があるのか掘り下げることが出来ます。
少なくとも、全く何も表示されない状態だとしたら、DBからデータを取るためのどこかに不備があります。
※データ取得が出来ないため、while文の中に入らず$task="" の状態で抜ける。

lang

1while ($row = $query->fetch_assoc()) 2{ 3 // 各メンバ取得 4 $id = $row['id']; 5 $title = $row['title']; 6 $task_date = $row['task_date']; 7 $place = $row['place']; 8 $memo = $row['memo']; 9 10 // タスクを表示形式に設定 11 $task .= "<tr><td>${title}</td><td>${task_date}</td><td>${place}</td><td>${memo}</td></tr>"; 12} 13 14var_dump($task); 15var_dump($row);

投稿2015/07/10 02:38

編集2015/07/10 06:36
KenjiObata

総合スコア440

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

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

yutaishikawa_

2015/07/10 03:35

ご回答ありがとうございます。 私の拙い文章でそこまで解釈していただき、嬉しく思います。 おっしゃる通りでございます。 どのご回答にも当てはまらず、if文の書き方が悪かったのか、表示されることはありませんでした。 しかし、本回答についても表示することはできませんでした。 他に、変数定義の部分で手を加えた方がいいでしょうか?
tempakyousuke

2015/07/10 03:57

まだ出ていないなら一回while文の中の頭でprint_r($row);をやってみてSQLの結果が0件でないか確かめてみた方がいいと思います。あとこちらの回答のやりかたでもhtmlspecialcharsはかけておいた方がいいと思います。
yutaishikawa_

2015/07/10 08:07

ありがとうございます。 おっしゃっていただいた通り、と、それなりの応用もきかせてみたのですが、一向に表示がされないのです。。。 $rowに関しては頭でvar_dumpしたところ、変化なし。お尻の方でvar_dumpするとNULLがでてきました。 個人的に、シンプルなところで一番頭を抱えているかもしれません。
KenjiObata

2015/07/10 08:14

推察ですが、SQL等の文法にエラーはないけれどもヒットするデータが0件というような状態ではないでしょうか? 試しに、SELECT文の WHERE を無しにしてデータが確実に取れる状態にしてテストされてはいかがでしょう。 $query = $mysqli->query(" SELECT * FROM tasks");
yutaishikawa_

2015/07/10 08:54

ご回答ありがとうございます。 $query で var_dumpしてみたところ、 object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(5) ["lengths"]=> NULL ["num_rows"]=> int(17) ["type"]=> int(0) } というデータが取れました。 ヒットするデータはある状態だとおもうのですが、やはり、正しく指定できていないということでしょうか。
tempakyousuke

2015/07/10 11:13

<?php $query = $mysqli->query(" SELECT * FROM tasks"); // エラー処理 if (!$query) { die('クエリーが失敗しました。'.mysql_error()); } while ($row[] = $query->fetch_assoc()) { var_dump($row); } ?> はどうなりますか?
yutaishikawa_

2015/07/12 23:30

リプライ遅れてしまいました。 $rowをvar_dumpしたところ、tableであるtasksからカラムを取得できていたのを確認しました! この値を全て、 $taskData[] = array( 'id'=>$row['id'], 'title'=>$row['title'], 'task_date'=>$row['task_date'], 'place'=>$row['place'], 'memo'=>$row['memo'] ); で$row['']に格納し、 $task .= $taskData; という処理を書いていた限り処理がまったく動作することはありませんでした...
guest

0

私だったらという回答をします。

lang

1<table border="1"> 2 <thead> 3 <tr> 4 <th>タイトル</th> 5 <th>日時</th> 6 <th>場所</th> 7 <th>メモ</th> 8 </tr> 9 </thead> 10 <tbody> 11 <?php 12 foreach($taskData as $data){ 13 echo '<tr>'; 14 echo '<td>'.$data['title'].'</td><td>'.$data['task_date'].'</td><td>'.$data['place'].'</td><td>'.$data['memo'].'</td>'; 15 echo '</tr>'; 16 } 17 ?> 18 </tbody> 19</table> 20

といった具合に直接echoさせて表示させるようにしてみてはいかがでしょうか。

投稿2015/07/10 01:07

編集2015/07/10 01:08
orange0190

総合スコア1698

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

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

ngyuki

2015/07/10 02:00

-1 した者ではありませんが、ちょっと PHP っぽくないのと XSS 脆弱性があると思います
orange0190

2015/07/10 02:24 編集

> XSS 脆弱性があると思います そのとおりですね。ただ今回はものすごく単純に考えただけ(ただ表示させただけ)なので、参考程度にしてもらえればなーと思います。 本当に何も考えてなかったので。 >ちょっと PHP っぽくない まあ、私は完全に独学なので、正直何がPHPっぽいかはわかってません。 PHPっぽくなくても実現できてしまいますし・・・
yutaishikawa_

2015/07/10 03:22

ご回答ありがとうございます。 まだまだ練習の身なので、脆弱性に関しては未だ視野に入れていない為、詳しい内容に関しては私としても判断できないですが、非常に参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問