プロが教えるわが家の防犯対策術!

自作PHPブログでの記事を5件ずつ表示する方法について

PHPで自作のブログをサイト等を参考に制作しているのですが、
最新の記事5件ずつ表示させたい場合はどのような記述をすれば良いのでしょうか?
「前ページ」と「次ページ」的なリンクを貼りたいと思っております。
一番最古の記事のページまで行くと「前ページ」リンクも消えるようにしたいのです。
pager等を検索したのですが、いまいち自分の物に組み込むとなるといまいちよくわからなくなります。
LIMITで5件表示まではわかったのですが、「次へ」で6~10件表示の仕方がわかりませんでした。
どのような記述が良いでしょうか、よろしくお願いします。

<?php
$pdo = new PDO("mysql:dbname=blog", "root");
$st = $pdo->query("SELECT * FROM post ORDER BY no DESC LIMIT 5");
$posts = $st->fetchAll();
for ($i = 0; $i < count($posts); $i++) {
$st = $pdo->query("SELECT * FROM comment WHERE post_no={$posts[$i]['no']} ORDER BY no DESC");
$posts[$i]['comments'] = $st->fetchAll();
}
require 't_index.php';
?>

t_index.phpで表示のプログラムを書いています。

A 回答 (1件)

pagerを使うべきだと思いますけどねぇ。

まぁ一度は練習問題としてやってみるといいかもしれません。

5件表示なのに5件しか読まないのでは「次データがあるかどうか」が判断出来ません(最初に全レコード数を取得していれば別ですが、そうではありませんよね)。

ざっくりと書きますので、ソースを机上で追ってみてください。

<?php
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "");

// デバッグ用ここから
$st = $pdo->query("truncate table post");
$st->execute();
$st = $pdo->prepare("insert into post(no, post) values(?, ?)");
for ($i = 1; $i < 21; $i++) { // 作成数を変えてデバッグする
$st->execute(array($i, 'post_' . $i));
}
// デバッグ用ここから

$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
if ($page < 1) { $page = 1; }

$perpage = 5; // ページ当りの記事数

$st1 = $pdo->prepare("select * from post order by no desc limit :skip , :read");
$st2 = $pdo->prepare("select * from comment where post_no=:post_no order by no desc");

$skip = ($page - 1) * $perpage;
$read = $perpage + 1;
$st1->bindParam(':skip', $skip, PDO::PARAM_INT);
$st1->bindParam(':read', $read, PDO::PARAM_INT);
$st1->execute();
$cnt = 0;
while($row1 = $st1->fetch()) { // 記事を読む
if (++$cnt > $perpage) { break; }
print $row1['no'] . '<br />'; //とりあえずnoだけ表示
$post_no = $row1['no'];
$st2->bindParam(':post_no', $post_no, PDO::PARAM_INT);
$st2->execute();
while($row2 = $st2->fetch()) { // コメントを読む
print $row2['post_no'] . '-' . $row2['no'] . '<br />'; // こっちもとりあえずの表示
}
}
// リンク生成
if ($page > 1) {
print '<a href="?page=' . ($page - 1) . '">Prev.</a>';
}
if ($cnt > $perpage ) {
print '<a href="?page=' . ($page + 1) . '">Next.</a>';
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!