phpの掲示板で最初のデータだけ表示されない

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,984

nosonosolife

score 26

phpで掲示板を作成しました。
フォームでmysqlのテーブルにデータを送信し、その内容を取ってきて一度配列に入れて、100件づつ、日付順に表示する、というものです。
しかし、テーブルのデータの1行目だけが表示されません。
一体原因は何なんでしょうか。ご教授よろしくお願いいたします。

//index.php

$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8';
$user = 'ユーザー名';
$password = 'パスワード';

try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

mb_language("uni");
mb_internal_encoding("utf-8"); //内部文字コードを変更
mb_http_input("auto");
mb_http_output("utf-8");

$userData = null;

$page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号
$pagemax = 100;//1ページあたりの表示数

$start = ($page == 1)? 0 : ($page-1) * $pagemax;

//datasテーブルから日付の降順でデータを取得
$sql = "select * from bbs_data ORDER BY user_id DESC limit ".$start.",".$pagemax;

$result = $pdo->query($sql);
$count = $result->fetchColumn();
$count = intval($count, 10);

$limit = ceil($count/$pagemax);//最大ページ数

while ($row = $result->fetchObject()){
    $userData[]=array(
            'id' => $row->user_id
            ,'date' => $row->user_date
            ,'name' => $row->user_name
            ,'title' => $row->user_title
            ,'message' => $row->user_mes
    );
}

require 'index_temp.php';
exit;
}
catch (PDOException $e)
{
    //例外処理
    die('Error:' . $e->getMessage());
}
//index_temp.php
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
    <body>
        <article id="bbslistbox">
            <section id="bbslists">
                <?php if (isset($userData)){ ?>
                <?php foreach ($userData as $postdata) { ?>
                <dl class="bbsdata">
                    <dt class="head">
                        <span class="title"><?php echo htmlspecialchars($postdata['title']) ?></span>
                        <span class="name">Name:<?php echo htmlspecialchars($postdata['name']) ?></span>
                    </dt>
                    <dd class="message">
                    <?php echo htmlspecialchars(nl2br($postdata['message'])) ?>
                    </dd>
                    <dd class="detail">
                        <span><?php echo $postdata['date'] ?></span><span>ID:<?php echo $postdata['id'] ?></span>
                    </dd>
                </dl>
                <?php } ?>
                <?php } ?>
            </section>
        </article>
    </body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2016/06/18 02:30

    まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。

    キャンセル

回答 1

checkベストアンサー

+1

この行で1件目のレコードが無駄遣いされています。

$count = $result->fetchColumn();


fetchColumnをしてしまうと、その行のデータを引き出す方法はなくなります。
おそらく、この行はSELECT COUNT(*) FROM bbs_dataというクエリを処理していた名残ではありませんか?

追記

「全レコード数を取るSQL」「全レコードからlimitで必要件数のデータを取るSQL」の2回に分けなければいけません。

// 全レコード数を取るSQL
$sql = "select count(*) from bbs_data";
$result = $pdo->query($sql);
$count = $result->fetchColumn();
$count = intval($count, 10);
$limit = ceil($count/$pagemax);//最大ページ数

//datasテーブルから日付の降順でデータを取得
$sql = "select * from bbs_data ORDER BY user_id DESC limit ".$start.",".$pagemax;
$result = $pdo->query($sql);

while ($row = $result->fetchObject()){
    $userData[]=array(
            'id' => $row->user_id
            ,'date' => $row->user_date
            ,'name' => $row->user_name
            ,'title' => $row->user_title
            ,'message' => $row->user_mes
    );
}

あと、あなたのこちらのクエリですが

$sql = "select * from bbs_data ORDER BY user_id DESC limit ".$start.",".$pagemax;


ORDER BYがuser_idなので、コメントに書かれているような日付の降順データではないですよ。user_idという名前で日付を保存しているのでなければですが…

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/17 19:53

    では、limitで取得する件数を制限しつつ、データの全件数を取得するには
    どういうコードを書けばいいでしょうか。

    キャンセル

  • 2016/06/17 20:18

    無事1件目のデータを取得することができました。
    ご教授ありがとうございました。

    キャンセル

  • 2016/06/17 22:41

    解決したなら解決済みにしておくと他の回答者が終わった質問に間違って答えることがなくなるのでチェックお願いします。

    キャンセル

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

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