time関数を使った連続投稿対策 (localtime,date)

かなり前のことですが、孤島の遺跡というサイトで公開されていた掲示板の連続投稿対策を取り入れてみたいと思います。
現在は、孤島の遺跡(復刻版)というサイトがあります。
今回は、孤島の遺跡の頑丈な掲示板を参考にします。
動作の仕組みは、任意の2つの値を使用します。現在の時間からチェック用の値を作成します。
投稿前に作成した値を<input>にセットし投稿後に値を戻して確認します。

セットする値 = (現在までの経過時間 + 値1) * 値2

ポストされたら上記値を元に戻します。

表示された時間 = (セットされた値 / 値2) - 値1

任意の値で連続投稿を阻止します。
それでは、実際のソースです。

//セットする値を作成します。
$pcode1 = 112345;
$pcode2 = 20;
$pcode = (time() + $pcode1) * $pcode2;
//投稿時間に戻します。
$ttime = ($_POST['pcode'] / $pcode2) - $pcode1;
if((time() - $ttime) < 10){
    print "投稿時間が短すぎます。";
}

ここで出てくるのがtime()関数です。
time関数は、1970年1月1日 00:00:00 からの通算秒数を返します。
投稿する前の秒数と投稿されたときの秒数を比較して早すぎる場合や遅すぎる場合をエラーとします。

他にもlocaltime()関数を使用すると日付を要素別に配列に格納することができます。
年、月、日と分けて情報を扱いたい場合、この関数を使うといいです。
特徴は、第二引数に1を指定すると連想配列として受け取ることができます。

もうひとつよく使いそうな関数を紹介します。
date()関数です。この関数は、与えられた書式にあわせて日付文字列を返します。

<?php
print "日付:" . date("Y/m/d H:i:s");
?>

以上のように日付にかかわる関数は、まだまだあります。

それでは、フォーラムの投稿部分のソースです。

サンプル

<?php
require('common.php');
require('postmsg.php');

//親メッセージオブジェクト作成
$parentmsg = new B3Post($db);
if(isset($foruminfo->pid)){
    //発言もとのメッセージがある場合
    $parentmsg->GetPostMessage($foruminfo->pid,$db);
    $getdata['fid'] = $foruminfo->fid;
    $getdata['tid'] = $foruminfo->tid;
    $getdata['pid'] = $foruminfo->pid;
    $getdata['pg'] = $foruminfo->pg;
}
else{
    $getdata['fid'] = $foruminfo->fid;
    $getdata['tid'] =$foruminfo->tid;
    $getdata['pg'] = $foruminfo->pg;
}
//メソッドにより分岐(POSTは投稿中)
if($_SERVER['REQUEST_METHOD'] == 'POST'){
    //投稿メッセージオブジェクト作成
    $decpcode = ($_POST['pcode'] / $pcode2) - $pcode1;
    $chkdate = localtime($decpcode,1);
    if((time() - $decpcode) < $pminsec){
        print '再投稿時間が早すぎるか遅すぎます。';
        exit;
    }
    if((time() - $decpcode) > $pmaxsec){
        print '再投稿時間が早すぎるか遅すぎます。';
        exit;
    }
    $msg = new B3Post($db);
    $msg->subject = $_POST['subject'];
    $msg->user = $_POST['name'];
    $msg->message = $_POST['message'];
    $msg->fid = $_POST['fid'];
    $msg->tid = $_POST['tid'];
    $msg->pid = $_POST['pid'];
    //データベース登録処理
    if($msg->InsertMessage()){
        //リダイレクト
        if($_POST['pid'] != ''){
            header("Location: http://localhost:80/msg.php?fid=" . $_POST['fid'] . "&tid=" . $_POST['tid'] . "&pid=" . $_POST['pid']);
        }
        else{
            header("Location: http://localhost:80/topic.php?fid=" . $_POST['fid'] . "&tid=" . $_POST['tid']);
        }
        exit;
    }
    else{
        $err = $msg->GetLastError();
        print $err['message'];
        exit;
    }
}
else{
    //連続投稿禁止コードの作成
    $pcode = (time() + $pcode1) * $pcode2;
}
//テンプレート出力
$smarty->assign('getdata',$getdata);
$smarty->assign('parent',$parentmsg);
$smarty->assign('pcode',$pcode);
$smarty->display('post.tpl');

?>