掲示板ページ送りその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構造なのかさっぱり思いつかないんだ…