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

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

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

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

Q&A

解決済

1回答

5267閲覧

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

nosonosolife

総合スコア42

PHP

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

0グッド

1クリップ

投稿2016/06/17 10:22

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

php

1//index.php 2 3$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; 4$user = 'ユーザー名'; 5$password = 'パスワード'; 6 7try { 8$pdo = new PDO($dsn, $user, $password); 9$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 10 11mb_language("uni"); 12mb_internal_encoding("utf-8"); //内部文字コードを変更 13mb_http_input("auto"); 14mb_http_output("utf-8"); 15 16$userData = null; 17 18$page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号 19$pagemax = 100;//1ページあたりの表示数 20 21$start = ($page == 1)? 0 : ($page-1) * $pagemax; 22 23//datasテーブルから日付の降順でデータを取得 24$sql = "select * from bbs_data ORDER BY user_id DESC limit ".$start.",".$pagemax; 25 26$result = $pdo->query($sql); 27$count = $result->fetchColumn(); 28$count = intval($count, 10); 29 30$limit = ceil($count/$pagemax);//最大ページ数 31 32while ($row = $result->fetchObject()){ 33 $userData[]=array( 34 'id' => $row->user_id 35 ,'date' => $row->user_date 36 ,'name' => $row->user_name 37 ,'title' => $row->user_title 38 ,'message' => $row->user_mes 39 ); 40} 41 42require 'index_temp.php'; 43exit; 44} 45catch (PDOException $e) 46{ 47 //例外処理 48 die('Error:' . $e->getMessage()); 49}

php

1//index_temp.php 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5</head> 6 <body> 7 <article id="bbslistbox"> 8 <section id="bbslists"> 9 <?php if (isset($userData)){ ?> 10 <?php foreach ($userData as $postdata) { ?> 11 <dl class="bbsdata"> 12 <dt class="head"> 13 <span class="title"><?php echo htmlspecialchars($postdata['title']) ?></span> 14 <span class="name">Name:<?php echo htmlspecialchars($postdata['name']) ?></span> 15 </dt> 16 <dd class="message"> 17 <?php echo htmlspecialchars(nl2br($postdata['message'])) ?> 18 </dd> 19 <dd class="detail"> 20 <span><?php echo $postdata['date'] ?></span><span>ID:<?php echo $postdata['id'] ?></span> 21 </dd> 22 </dl> 23 <?php } ?> 24 <?php } ?> 25 </section> 26 </article> 27 </body> 28</html>

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

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

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

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

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

kei344

2016/06/17 17:30

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

回答1

0

ベストアンサー

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

PHP

1$count = $result->fetchColumn();

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

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

PHP

1// 全レコード数を取るSQL 2$sql = "select count(*) from bbs_data"; 3$result = $pdo->query($sql); 4$count = $result->fetchColumn(); 5$count = intval($count, 10); 6$limit = ceil($count/$pagemax);//最大ページ数 7 8//datasテーブルから日付の降順でデータを取得 9$sql = "select * from bbs_data ORDER BY user_id DESC limit ".$start.",".$pagemax; 10$result = $pdo->query($sql); 11 12while ($row = $result->fetchObject()){ 13 $userData[]=array( 14 'id' => $row->user_id 15 ,'date' => $row->user_date 16 ,'name' => $row->user_name 17 ,'title' => $row->user_title 18 ,'message' => $row->user_mes 19 ); 20} 21

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

PHP

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

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

投稿2016/06/17 10:28

編集2016/06/17 10:58
masaya_ohashi

総合スコア9206

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

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

nosonosolife

2016/06/17 10:33

ご回答ありがとうございます。 $countは、テータの全件数を入れている変数なのですが、 その処理のせいで1件目のデータが読み込まれなかったということなんでしょうか。
masaya_ohashi

2016/06/17 10:38

いえ、いまのコードを見る限り、$result->fetchColumn()で取ってこれる値は全件数の数値ではありません。bbs_dataの1件目の第一カラムの値でしかありません。 全件数が欲しいならこうするはずです。 $sql = "select count(*) from bbs_data"; $result = $pdo->query($sql); $count = $result->fetchColumn();
nosonosolife

2016/06/17 10:53

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

2016/06/17 11:18

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

2016/06/17 13:41

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問