PHPとMySQLで掲示板を作っています。
ページングの処理で分からないことがあるので質問をさせていただきます。
画面に10件のレコードを表示するようにしています。
データベースにさらに10件以上のデータがあれば次の10件のレコードを表示する「次へ」リンク
なければリンクを表示しない判別をしたいのですが上手くいきません。
ホームページを参考にし、
if(count($row) > $limit){
array_pop($row);
echo '<a href="index.php?p=', $next_num, '">次へ</a>','</td>';
} else {
echo '末尾';
}
で分岐をしたいのですが、$rowのcountがechoで出力したところ1となってしまい上手くいきません。
何か原因があるのでしょうか。もしくは別の方法で分岐を取り入れることは可能でしょうか。
<?php
$p = isset($_GET['p']) ? intval($_GET['p']) : 0;
$limit = 10;
$v_page = $limit + 1;
$offset = $p * $limit;
$pdo=new PDO('mysql:host=ホスト名;dbname=board;charset=utf8','ユーザー','パス');
$sql=$pdo->prepare('select * from board1 order by nomber desc limit :limit offset :offset ');
$sql->bindValue(":limit", $v_page, PDO::PARAM_INT);
$sql->bindValue(":offset", $offset, PDO::PARAM_INT);
$sql->execute();
while ($row = $sql -> fetch(PDO::FETCH_ASSOC)){
echo '<tr>';
echo '<td>', htmlspecialchars($row['nomber']), '</td>';
echo '<td>', htmlspecialchars($row['name']),'</td>';
echo '<td>', '<img src="',$row['icon'],'.png">','</td>';
echo '<td>', htmlspecialchars($row['trip']), '</td>';
echo '<td>', htmlspecialchars($row['message']), '</td>';
echo '<td>', '<a href="delete-in.php?nomber=', $row['nomber'], '">削除</a>','</td>';
echo '</tr>';
echo "\n";
}
$next_num = $p+1;
$prev_num = $p-1;
if(count($row) > $limit){
array_pop($row);
echo '<a href="index.php?p=', $next_num, '">次へ</a>','</td>';
} else {
echo '末尾';
}
if($p > 0){
echo '<a href="index.php?p=', $prev_num, '">前へ</a>','</td>';
} else {
echo '';
}
皆様のご回答を参考に下記で解決いたしました。
・総ページ数を求めるということ、またその求め方
・fetchを使う場合のcountの戻り値
を知ることができ大いに勉強になりました。
ご回答いただきました皆様本当にありがとうございます。
<?php
$p = isset($_GET['p']) ? intval($_GET['p']) : 0;
$limit = 10;
$v_page = $limit + 1;
$offset = $p * $limit;
$pdo=new PDO('mysql:host=ホスト;dbname=board;charset=utf8','ユーザー','パス');
$sql=$pdo->prepare('select * from board1 order by nomber desc limit :limit offset :offset ');
$sql->bindValue(":limit", $v_page, PDO::PARAM_INT);
$sql->bindValue(":offset", $offset, PDO::PARAM_INT);
$sql->execute();
while ($row = $sql -> fetch(PDO::FETCH_ASSOC)){
echo '<tr>';
echo '<td>', htmlspecialchars($row['nomber']), '</td>';
echo '<td>', htmlspecialchars($row['name']),'</td>';
echo '<td>', '<img src="',$row['icon'],'.png">','</td>';
echo '<td>', htmlspecialchars($row['trip']), '</td>';
echo '<td>', htmlspecialchars($row['message']), '</td>';
echo '<td>', '<a href="delete-in.php?nomber=', $row['nomber'], '">削除</a>','</td>';
echo '</tr>';
echo "\n";
}
#ここまでは質問時のソースと同じです。
#ここからソースを書き換えました。
$pdo=new PDO('mysql:host=ホスト;dbname=board;charset=utf8','ユーザー','パス');
$sql=$pdo->query('select * from board1');
$total_res=$sql->rowCount();
$next_num = $p+1;
$prev_num = $p-1;
$total_page= ceil($total_res / $limit);
if($p > 0){
echo '<a href="index.php?p=', $prev_num, '">前へ</a>','</td>';
} else {
echo '最新';
}
if($total_page-1 > $p){
echo '<a href="index.php?p=', $next_num, '">次へ</a>','</td>';
} else {
echo '末尾';
}
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
SELECT * FROM table WHERE column = ? LIMIT 10 offset 0;
これで返ってくるレコード数は最大で10件ですね。1ページあたり10件($count_per_page)ずつ表示する場合、こうなります。
SELECT COUNT(*) as cnt FROM table WHERE column = ?;
こうすると、同じ検索条件のときの、全件のレコード数($total_count)を取得できます。
レコード数が、128件あったとき、10件ずつ表示すると、
0 〜 9 → 1ページ目
10 〜 19 → 2ページ目
20 〜 29 → 3ページ目
...
120 〜 128 → 13ページ目
となりますね。このとき、13という値($total_page)がわかれば、「次へ」のボタンを表示するかどうかは判定できますので、これを計算で求めることはできますね。
<?php
$total_count / $count_per_page; // 12.8
ceil($total_count / $count_per_page); // 13
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
リミットが10件のところわざと1件余計に取得して、その1件があれば「次へ」を表示する仕組みでしょうか。
count($row)では1行ごとに対しての件数になってしまうので、
PDOStatement::rowCount が使えないでしょうか(未検証)
if($sql->rowCount() > $limit){
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
あらかじめ全体のページ数とカレントページが何ページ目かを把握しておき
- カレントページが2ページ目以降なら「前へ」
- カレントページが最終頁(全体ページ数)より前なら「次へ」
を表示してください
専用のis_firstpage()とかis_lastpage()などの関数をつくってもよいかもしれません
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
fetch は1レコードしか取得しないと思いますよ
fetchAll を用いて全体の件数を把握してLimit と offset を設定しないと無理だと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
11件目があれば、11件目から読み直したいということでしょうか。
$resultCount = 0;
while ($row = $sql -> fetch(PDO::FETCH_ASSOC)){
$resultCount ++ ;
...
}
if($resultCount > $limit){
echo '<a href="index.php?p=', $next_num, '">次へ</a>','</td>';
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/12 16:36
恥ずかしながら小数点を切り捨てるceilという関数を初めて知りました。
実践してみます。
2017/01/12 16:37