トピックページの表示

フォーラムの表示ができるようになったので、次はトピックの表示です。
フォーラムの一覧ページからforum_idを取得します。
ここで登場するのが$_GETです。
あるページからページへのデータの受け渡しにGETやPOSTといったものを使います。
例えば、フォームの中に何か入力してSubmitボタンを押したりしたときに
GETやPOSTを使ってデータの受け渡しが行われます。

GETはURLに追加されてデータが受け渡されます。
(GETの場合、URLの後ろに?名前=値&名前=値といった形でデータが渡されます。)
POSTはリクエストのメッセージボディにデータが含まれて送信されます。

phpでデータを受け取るには、$_GET,$_POSTを利用します。
この$_GET,$_POST等をスーパーグローバル変数といいます。

phpは便利ですね。勝手に連想配列として分解してくれます。

例:forum_idを取得する

<?php
    print $_GET['fid'];
?>

forum_idが取得できたので、このidを使ってトピックスを取得します。
フォーラムの表示と違う点は、SQL文位ですね。

$sql = "SELECT t.topic_id,m.post_id,m.post_subject,t.reply_count,m.post_user,t.last_post_date "
     . "FROM topic t,post_message m WHERE t.forum_id = " . $_GET['fid'] 
     . " AND t.topic_id = m.topic_id AND m.parent_post_id = 0";
$dyn = mysql_query($sql);
if(!$dyn){
    die("query error");
}
while($row = mysql_fetch_array($dyn)){
    $topics[$row[post_id]]['post_subject'] = $row['post_subject'];
    $topics[$row[post_id]]['reply_count'] = $row['reply_count'];
    $topics[$row[post_id]]['post_user'] = $row['post_user'];
    $topics[$row[post_id]]['last_post_date'] = $row['last_post_date'];
}
$smarty->assign('topics',$topics);
$smarty->display('topics.tpl');

これでトピックスの一覧は表示できます。
しかし、このままではトピックが増えてきたとき、すごく長いページになってしまいます。
そこで、一度に表示するトピックを制限したいと思います。

フォーラムに何件のトピックが投稿されているかを取得しトピックの最大表示数からページ数を計算します。
表示するページは、GETで値を受け取ります。
表示ページ番号からデータの取得開始位置を決定します。

まず、トピックの総数を取得します。

$sql = "SELECT count(*) AS CNT FROM topic WHERE forum_id = " . $_GET['fid'];

次に総ページ数を取得します。

総ページ数 = ceil(トピック総数 / 1ページ表示数);

ceilは引数の次に大きい整数を返す関数です。

$_GETを使って表示するページ番号を取得します。

if(isset($_GET['pg'])){
    $page = $_GET['pg'];
}
else{
    $page = 1;
}
//ページ表示部
if($page > 1){
    $prevhtml = "<a href=\"topic.php?fid=" . $_GET['fid'] . "&pg=" . ($page - 1) . "\">&lt;-prev</a>";
}
else{
    $prevhtml = "<-prev";
}
if($page < $maxpage){
    $nexthtml = "<a href=\"topic.php?fid=" . $_GET['fid'] . "&pg=" . ($page + 1) . "\">next-&gt;</a>";
}
else{
    $nexthtml = "next->";
}

ページの遷移はこれでできそうですね。
ここで出てきた関数で、 isset というのがあります。
これは、引数で指定した変数が存在するかを検査する関数です。
いろいろなサンプルでも頻繁に使用されています。
$prevhtmlと$nexthtmlは、他の方法も考えられますがなんとなくテンプレート側で
処理させたくなかったのでこんな方法をとってみました。
このページの処理は、いろいろな方法が考えられそうですね。

まとめ

ページ間でのデータの受け渡し方法のひとつにGET,POSTの使用ができる。
GET,POSTのデータは、スーパーグローバル変数($_GET,$POST)にセットされる。

切り上げをするには float ceil( float val ) を使用する。
四捨五入をするには double round( double val , int[precision] ) を使用する。
切り捨てをするには float floor ( float value ) を使用する。

変数がセットされているかを知るには int isset ( mixed var ) を使用する。

文字列内でダブルクォーテーションを文字として扱いたい場合、\をつけてエスケープする。
他にも\n,\r,\\,\$等がある。