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

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

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

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

Q&A

解決済

2回答

393閲覧

DBから取得したデータを表に挿入したのですがNULLの値がおかしくなります。ご協力お願いします。

memo73608069

総合スコア5

PHP

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

0グッド

0クリップ

投稿2020/02/18 11:45

編集2020/02/18 13:01

前提・実現したいこと

PHP初心者です。
DBから取得したデータを表に表示させたいのですがNULLの値の場所が下の画像のようになります。
NULLの場所を表示させない方法はありますか?
表の余白もできればそろえたいです。

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

イメージ説明

該当のソースコード

session_start(); $user = $_SESSION['user']; ?> <?php $day = date("Y/m"); if($day == '2020/02'){ try{ $pdo = new PDO( 'mysql:host=localhost;dbname=friske;charset=utf8', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $sql = "SELECT day,youbi,Todo1,memo1,Todo2,memo2,Todo3,memo3,Todo4,memo4,Todo5,memo5 FROM calendar_2020_$user AS T1 WHERE EXISTS(SELECT * FROM calendar_2020 WHERE (T1.Todo1 AND T1.memo1 AND T1.Todo2 AND T1.memo2 AND T1.Todo3 AND T1.memo3 AND T1.Todo4 AND T1.memo4 AND T1.Todo5 AND T1.memo5) IS NOT null)AND month=2 "; $stmh = $pdo->prepare($sql); $stmh->execute(); }catch(PDOException $Exception){ die('接続エラー:' .$Exception->getMessage()); } }elseif($day == "2020/03"){ try{ $pdo = new PDO( 'mysql:host=localhost;dbname=friske;charset=utf8', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $sql = "SELECT day,youbi,Todo1,memo1,Todo2,memo2,Todo3,memo3,Todo4,memo4,Todo5,memo5 FROM calendar_2020_$user AS T1 WHERE EXISTS(SELECT * FROM calendar_2020 WHERE (T1.Todo1 AND T1.memo1 AND T1.Todo2 AND T1.memo2 AND T1.Todo3 AND T1.memo3 AND T1.Todo4 AND T1.memo4 AND T1.Todo5 AND T1.memo5) IS NOT null)AND month=2 "; $stmh = $pdo->prepare($sql); $stmh->execute(); }catch(PDOException $Exception){ die('接続エラー:' .$Exception->getMessage()); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>今月の予定</title> </head> <body> <h2>今月の予定</h2> <?php while($row = $stmh->fetch(PDO::FETCH_ASSOC)){ ?> <table border> <tr> <td><?=htmlspecialchars($row['day'])?>(<?=htmlspecialchars($row['youbi'])?>)</td> <td><?=htmlspecialchars($row['Todo1'])?></td> <td><?=htmlspecialchars($row['memo1'])?></td> <td><?=htmlspecialchars($row['Todo2'])?></td> <td><?=htmlspecialchars($row['memo2'])?></td> <td><?=htmlspecialchars($row['Todo3'])?></td> <td><?=htmlspecialchars($row['memo3'])?></td> <td><?=htmlspecialchars($row['Todo4'])?></td> <td><?=htmlspecialchars($row['memo4'])?></td> <td><?=htmlspecialchars($row['Todo5'])?></td> <td><?=htmlspecialchars($row['memo5'])?></td> <?php } $pdo = null; ?> </tr> </table> </body> </html>

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

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

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

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

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

takasima20

2020/02/18 11:50

「NULLの場所を表示させない方法」とは? (意図がわからんス) 均等に表示したいなら css なりなんなりで幅を固定するもんだと思うのですが…
m.ts10806

2020/02/18 12:04 編集

コードはマークダウンのcode機能を利用してご提示ください。 また、静的HTMLではどう表現したいのでしょうか。 NULLはいわば「何もない」状態なので、おかしくも何もないと思います。
memo73608069

2020/02/18 12:10

表の空白の部分を表示させないような作りにしたいのですが...
m.ts10806

2020/02/18 12:55

コードはマークダウンのcode機能を利用してご提示ください。
m.ts10806

2020/02/18 12:57 編集

>nullだった時その列を表示させない これそのままPHPで書けばいいだけでは・・・。 PHPにはデフォルト関数にnullの判定する機能もあるし、「nullと判定されたら出力しない」だけです。
memo73608069

2020/02/18 13:04

私の力不足でどのように書いたらいいのか...
m.ts10806

2020/02/18 13:44

PHP null 判定 とかでズバリその機能のPHPマニュアル出てきますし、 サンプルコードもありますが、それらは何のは参考にもなりませんか?
guest

回答2

0

php

1<h2>今月の予定</h2> 2<table border> 3<?php 4while($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 5?> 6<tr> 7<td><?=htmlspecialchars($row['day'])?>(<?=htmlspecialchars($row['youbi'])?>)</td> 8<td><?=htmlspecialchars($row['Todo1'])?></td> 9<td><?=htmlspecialchars($row['memo1'])?></td> 10<td><?=htmlspecialchars($row['Todo2'])?></td> 11<td><?=htmlspecialchars($row['memo2'])?></td> 12<td><?=htmlspecialchars($row['Todo3'])?></td> 13<td><?=htmlspecialchars($row['memo3'])?></td> 14<td><?=htmlspecialchars($row['Todo4'])?></td> 15<td><?=htmlspecialchars($row['memo4'])?></td> 16<td><?=htmlspecialchars($row['Todo5'])?></td> 17<td><?=htmlspecialchars($row['memo5'])?></td> 18</tr> 19<?php 20} 21$pdo = null; 22?> 23</table> 24</body> 25</html>

なんじゃないかなーと、直感的に。
trの対応がおかしいまま次のtableタグが出現したので。


コードの冒頭で、

php

1function h($s) { 2 return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 3}

を定義しておけば、

php

1<h2>今月の予定</h2> 2<table border> 3<?php 4while($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 5 for ($i = 1; $i <= 5; ++$i) { 6 if ((isset($row['Todo'.$i])) && (is_null($row['Todo'.$i]))) { // NULLだったときの対策はいらないのかな? 7 $row['Todo'.$i] = ''; 8 } 9 if ((isset($row['memo'.$i])) && (is_null($row['memo'.$i]))) { // NULLだったときの対策はいらないのかな? 10 $row['memo'.$i] = ''; 11 } 12 } 13?> 14<tr> 15<td><?=h($row['day'])?>(<?=h($row['youbi'])?>)</td> 16<td><?=h($row['Todo1'])?></td> 17<td><?=h($row['memo1'])?></td> 18<td><?=h($row['Todo2'])?></td> 19<td><?=h($row['memo2'])?></td> 20<td><?=h($row['Todo3'])?></td> 21<td><?=h($row['memo3'])?></td> 22<td><?=h($row['Todo4'])?></td> 23<td><?=h($row['memo4'])?></td> 24<td><?=h($row['Todo5'])?></td> 25<td><?=h($row['memo5'])?></td> 26</tr> 27<?php 28} 29$pdo = null; 30?> 31</table> 32</body> 33</html>

にコード量削減ができるなど。

コードの分岐内でデータベース接続をしているけど、
コードの冒頭で定義しておいて$pdoを最後まで使い回せばいいので、
そこもコード削減できる要素。

投稿2020/02/18 11:50

編集2020/02/18 12:02
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

memo73608069

2020/02/18 12:11

ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/02/18 12:39

3月の方に「month=2 」ってあるけど、いずれprepare()してbindValue()で年や月を与えてexecute()するやりかたに置き換えますよね?
退会済みユーザー

退会済みユーザー

2020/02/18 12:41

テーブル名が「calendar_2020_$user 」などとセッション変数由来の変数展開なのは、セッション変数に良からぬことを仕込まれたら詰むので改めるべきかと。
memo73608069

2020/02/18 12:53

その予定です。 nullだった時その列を表示させないようにする時はどのようなコードを書けばいいでしょうか?
退会済みユーザー

退会済みユーザー

2020/02/19 01:29

表示させない、ということは、出力する前にnullじゃないことを確認してtdタグらの出力をコントロールするしか無いです。 if (!is_null($row['Todo1']))でNULLでないことを保証して出力すれば。 5つまであるなら1,2,3,4,5をfor()ループでクエリ返せばいいし。 わたしのかいたサンプルコードにヒントはあります。
guest

0

ベストアンサー

もし、未入力の TO DO を出力したくないって話なら
こんな感じでどうでしょう

php

1//こっから上は省略 2function get_todo($row) { 3 $ret = array(); 4 for ($i=1;$i<=5;$i++) { 5 $t = $row['Todo' . $i]; 6 $m = $row['memo' . $i]; 7 if (!empty($t) && !empty($m)) { 8 $ret[] = array($t, $m); 9 } 10 } 11 return $ret; 12} 13?> 14<!DOCTYPE html> 15<html lang="ja"> 16<head> 17 <meta charset="utf-8"> 18 <title>今月の予定</title> 19</head> 20<body> 21 22<h2>今月の予定</h2> 23<?php 24 while($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 25?> 26<table border> 27<tr> 28<td><?=htmlspecialchars($row['day'])?>(<?=htmlspecialchars($row['youbi'])?>)</td> 29<?php 30 foreach (get_todo($row) as list($t, $m)) { 31?> 32<td><?=htmlspecialchars($t)?></td> 33<td><?=htmlspecialchars($m)?></td> 34<?php 35 } 36 } 37 $pdo = null; 38?> 39</tr> 40</table> 41</body> 42</html>

投稿2020/02/18 15:16

takasima20

総合スコア7458

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

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

memo73608069

2020/02/19 01:41

実行したらできました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問