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

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

ただいまの
回答率

87.80%

PHP データベースからのカラム取得エラーメッセージ

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 621

score 55

データベースから取得したデータを表として出します。
データベースには日付と数字とメッセージが登録されています。
もし、データベースからカラムを取得できなかった場合に「データを取得できません。」というメッセージを表示したいのですが、どのようにすればできますか?

<?php
    try {
        require_once 'db.php';
        //データベース接続
        $dbh = new PDO(dsn, db_uesr, pass);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        //データ取得
        $stmt = $dbh->query("SELECT * FROM record");
        $array = $stmt->fetchAll();
    } catch (PDOException $e) {
        echo $e->getMesssage;
    }
    $dbh = null;
            if (empty($array))  {
                echo "データを取得できません。";
            } else {
                echo '<table>';
                    foreach ($array as $row) {
                        echo "<tr>";
                            echo "<td>", date('Y/m/d H:i:s', strtotime($row ["day"])), "</td>";
                            echo "<td>", htmlspecialchars($row ["number"], ENT_QUOTES, 'UTF-8'), "</td>";
                            echo "<td>", htmlspecialchars($row ["message"], ENT_QUOTES, 'UTF-8'), "</td>";
                        echo "</tr>";
                    }
                echo "</table>";
            }
?>

 試したこと

表の$row['number']を$row['num']に変更すると
Notice: Undefined index:
のエラーが現在登録されているデータの数字項目全部に表示される

 やりたいこと

上のような場合にエラーメッセージだけ表示させたい。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2018/08/10 11:12

    var_export($array);をしていただきたいのと、やりたいことはカラムがないときで間違いないですか?

    キャンセル

  • ryusan_012

    2018/08/10 11:17

    カラムがないときで合っています。

    キャンセル

  • papinianus

    2018/08/10 11:25

    わかりました。では私としてはvar_exportは結構です

    キャンセル

回答 3

checkベストアンサー

+2

やろうとしてるのは、レコードが0件の時の処理の話でなく
いわゆるコーディングミス。recordテーブルの存在しないカラムへアクセスしようとしたときに
エラーをださないようにするってことですよね?

PHPには、array_key_existsという関数があります。

date('Y/m/d H:i:s', strtotime($row ["day"]))


の部分を以下のように修正すれば、望みの結果になるかもしれません。

array_key_exists("day", $row) ? date('Y/m/d H:i:s', strtotime($row ["day"])) : "データを取得できません。" 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/10 13:41

    きれいに動きました、ありがとうございます。
    もしここから表を表示せずにメッセージだけを表示ってできますか?

    キャンセル

+1

        $stmt = $dbh->query("SELECT * FROM record");
        $array = $stmt->fetchAll();


$arrayに読み込んでいるのに、

                    foreach ($date as $row) {


定義もしていない$dateでforeachループを回そうとしているから。


typoを直されたあとの話として察するに、

$stmt = $dbh->query("SELECT * FROM record");


で取得しようとしているテーブルrecord上に存在しないカラムは取得できないわけで、

表の$row['number']を$row['num']に変更すると
Notice: Undefined index:
のエラーが現在登録されているデータの数字項目全部に表示される

ってことはテーブルにカラムnumberはあってもnumはない、っていうことですよね?
テーブルrecordの定義を確認してくださいね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/10 11:00

    すみません、これはタイポでした

    キャンセル

  • 2018/08/10 11:02

    実際に動かしているコードを書いてくださいね! なんのためのソースコードの開示なのかと。

    キャンセル

0

質問した結果やりたいのは、例えば

echo "<td>", htmlspecialchars($row ["number"], ENT_QUOTES, 'UTF-8'), "</td>";


のところを

echo "<td>", isset($row["num"]) ? htmlspecialchars($row ["num"], ENT_QUOTES, 'UTF-8') : "&nbsp;", "</td>";


という感じかなと思いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/10 13:41

    issetでもいけるんですね、ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る