掲示板ページ送りその2

前回、失敗していたのはいろいろな勘違いをしていたからみたいです。
判明してできるようになったのでソースと解説

<?php
$host = "";
$user = "";
$pass = "";
$dbname = "sample";
//ページ数取得
$page=$_GET['page'];

//1ページに表示する記事の数
$pagemax = 3;

$db = mysql_connect($host,$user,$pass) or die("db接続できません");

//db選択
mysql_select_db($dbname,$db) or die("接続エラー");


if ($_SERVER["REQUEST_METHOD"]  == "POST") {
    
    $name = cnv_dbstr($_POST["name"]);
    $com = cnv_dbstr($_POST["com"]);
    
    if($name && $com){
        $sql = "INSERT INTO bbs(name,com,datetime) ";
        $sql .= "VALUES(";
        $sql .= "'".$name."',";
        $sql .= "'".$com."',";
        $sql .= "'".date("Y/m/d H:i:s")."'";
        $sql .= ")";
        $res = mysql_query($sql,$db) or die("データ追加エラー");
        if($res){
            echo "書き込みありがとうございました";            
            }
        }
    else{
        echo "名前とメッセージは必須です";
        }
    }

    
    // SQLコマンド用の文字列に変換する関数
function cnv_dbstr($string) {
    // タグを無効にする
    $string = htmlspecialchars($string);

    // magic_quotes_gpcがONの場合はエスケープを解除する
    if (get_magic_quotes_gpc()) {
        $string = stripslashes($string);
    }

    // SQLコマンド用の文字列にエスケープする
    $string = mysql_real_escape_string($string);
    return $string;
}

//表示部分
$all = "select count(*) from bbs";
$total = mysql_query($all, $db) or die("error");
$row= mysql_fetch_array($total, MYSQL_NUM);
$all_com= $row[0];

//全部で何ページか
$page_no = $all_com / $pagemax;
//切り上げ整数にする
$page_no = ceil($page_no);

//ありえないページ数だったらエラー
if($page_no < $page){
    print "ページ数が不正です";
    exit;
    }

//$pageの引数がnullでも0でも1にする
if($page==null or $page==0 or $page==1){
    $page = 1;
    $page_start = 0;
    $page_end = $pagemax;
    //$output = array_slice($lines, 0,$pagemax);
    //ここ、前にバグってたので修正
    //kiji_view($output);
    if ($page < $page_no){        
        //記事表示のユーザー関数のあとgetでページ送りのリンク
        $footer = "<a href = dbname.php?page=2>next→</a><br>\n";
    }
}else{
    //$pageの引数がある場合、変数$nextpageと$prevpageを用意
    $nextpage = $page+1;
    $prevpage = $page-1;
    
    $page_start = $pagemax*$page - $pagemax;
    $page_end = $pagemax;

    $footer = "<a href = dbname.php?page=$prevpage>←prev</a> \n";
    //最終ページにはnextのリンクを付けない
    if ($page < $page_no){
        $footer .= "<a href = dbname.php?page=$nextpage>next→</a><br>\n";
    }
        else{
    $footer .= "<br>\n";
    }
}
//データを逆順、LIMIT句で指定の数だけ取り出す
$sql = "SELECT * FROM bbs ORDER BY id desc LIMIT ";
$sql .= $page_start;
$sql .= ",";
$sql .= $page_end;
$res = mysql_query($sql, $db) or die("データ抽出エラー");
    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
    echo "<hr>[";
    echo $row["id"];
    echo "]";
        echo $row["name"];
    echo "(" . date("Y/m/d H:i", strtotime($row["datetime"])) . ")";
    echo "<p>" . nl2br($row["com"]) . "</p>";
    }


print "<hr>";
//ページ送り部分のフッター表示
print $footer;

?>

フォーム部分書いてませんが、これで動きました。
解説ですが、

SELECT * FROM bbs ORDER BY id desc LIMIT 

がキモですね。
idが大きい程新しい投稿になりますからdescが逆順の指定。LIMITは引数が2つ必要です。
最初のがoffsetと言って取り出す最初の件数。2つめが何件取り出すか。
SELECT * FROM bbs ORDER BY id desc LIMIT 0,3
これだと逆順にした最初から3件取れる。offsetが0だと省略化だそうです。
SELECT * FROM bbs ORDER BY id desc LIMIT 10,15
この場合は10件目から15件を取得する。ここで注意するのは最初から15件目じゃなく10件目から15件ということ。
これで取れる件数は15です。5ではなくて。ここを勘違いしていたので前回の表示が変になっていたのでした。
皆さんはお間違えなきよう。

次はスレッド式というか、親記事があって返信がある掲示板を考えたい。
どういうdb構造なのかさっぱり思いつかないんだ…