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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

1回答

2444閲覧

PDOでSELECT分を発行し、データにnullが含まれる場合の処理が分かりません

dotnet

総合スコア25

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

1クリップ

投稿2021/04/07 02:10

編集2021/04/07 04:31

前提・実現したいこと

PHP7.4.16+PostgreSQL10.13でwebシステムの勉強中です。
PDOでDBへアクセスしてデータを取得→ブラウザにテーブル表示するところまでは問題なかったのですが、取得した値にnullが含まれているとそれ以後のデータを表示することができません。

該当のソースコード

SQL

1create table test( 2 id int not null, 3 text1 text, 4 text2 text, 5 text3 text, 6 constraint pk_test primary key(id) 7); 8 9insert into test values(1, 'hoge1', 'fuga1', 'aaa'); 10insert into test values(2, 'hoge2', 'fuga2', 'bbb'); 11insert into test values(3, 'hoge3', 'fuga3', 'ccc'); 12insert into test values(4, 'hoge4', 'fuga4', 'ddd'); 13insert into test values(5, 'hoge5', 'fuga5', 'eee');

PHP

1<?php 2require_once 'connectDatabase.php'; 3?> 4<html> 5 6<head> 7 <meta http-equiv="content-type" charset="utf-8"> 8</head> 9 <dl> 10 <div style="display:inline-flex"> 11 </div> 12 </dl> 13 <table border="1"> 14 <tr> 15 <th style="width:100px">id</th> 16 <th style="width:300px">text1</th> 17 <th style="width:300px">text2</th> 18 <th style="width:300px">text3</th><br> 19 </tr> 20 <?php 21 try { 22 $db = connectDB(); // 外部クラスでDBへ接続 23 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 24 $stt = $db->query("select id, text1, text2, text3 from test order by id desc"); 25 while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { 26 ?> 27 <tr> 28 <td><?= e($row['id']) ?></td> 29 <td><?= e($row['text1']) ?></td> 30 <td><?= e($row['text2']) ?></td> 31 <td><?= e($row['text3']) ?></td> 32 </tr> 33 <?php 34 } 35 } catch (PDOException $e) { 36 print "Error: {$e->getMessage()}"; 37 } 38 ?> 39 </table> 40 </form> 41 42</html>

前述のDDL実行後
データにnullが無いとき

update test set text1=null where id=5;実行後
データにnullが含まれるとき

2枚目キャプチャ出力時のソース

<html> <head> <meta http-equiv="content-type" charset="utf-8"> </head> <dl> <div style="display:inline-flex"> </div> </dl> <table border="1"> <tr> <th style="width:100px">id</th> <th style="width:300px">text1</th> <th style="width:300px">text2</th> <th style="width:300px">text3</th><br> </tr> <tr> <td>5</td> <td>

出力箇所で利用しているeの内容

<?php function e(string $str, string $charset = 'UTF-8'): string{ return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, $charset); }

var_dump($row)を加筆しました

<?= var_dump($row) ?> <tr> <td><?= e($row['id']) ?></td> <td><?= e($row['text1']) ?></td> <td><?= e($row['text2']) ?></td> <td><?= e($row['text3']) ?></td>

var_dumpの結果

試したこと

select分で列名指定する箇所をcoalesce(text1, '')にしても変化は無かったので、nullだけでなく空文字の場合に特別な処理が必要であろうことは分かりました。該当する情報が無いか検索したのですが、テーブル全列にデータがある前提のものしか見つけることができませんでした。

直面している事象以外にも修正点がありましたらご指摘頂けると幸いです。
宜しくお願いいたします。

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

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

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

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

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

m.ts10806

2021/04/07 02:19

ブラウザで「ソースを表示」をするとどうなってますか?
m.ts10806

2021/04/07 02:20

念の為e()のコードも提示してください
dotnet

2021/04/07 02:39 編集

有難うございます。ソースを質問本文に加筆致しました。ご教示くださり有難うございます。
m.ts10806

2021/04/07 02:33

質問は編集できますので
m.ts10806

2021/04/07 02:34

あと、$eではなくe()のことを聞いています。PHPにデフォルトで存在している機能ではありませんので
dotnet

2021/04/07 02:46 編集

大変失礼致しました。こちらも質問に加筆致しましたので宜しくお願い致します。
FKM

2021/04/07 04:20 編集

while文のループ中にvar_dump($row)を実行してみてください。その値を取得してみてください。
dotnet

2021/04/07 04:32

質問に結果を加筆しました。宜しくお願い致します。
guest

回答1

0

ベストアンサー

関数eの引数にstringなんて型指定をしているせいです。
そのためにnullが引数に入ってくると

Fatal error: Uncaught TypeError: Argument 1 passed to e() must be of the type string, null given, called in…

なエラーが入ってくるはずなのでエラー表示は常にしておきましょう。

投稿2021/04/07 04:45

編集2021/04/07 04:46
FKM

総合スコア3660

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

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

dotnet

2021/04/07 05:22

DBでtext1::textとキャストするようにしましたがうまくいかなかったので、function e(string $strをfunction e(?string $strに修正して正常動作を確認しました。 本番環境でも無いのにエラー出力を切っていたのは完全にオウンゴールでした。とっても助かりました!有難うございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問