phpな休日 BBS sitemap
1. 24時間後(1日後)の時間を取得する

date 関数で現在時刻を取得後、strtotime 関数で+1dayとします。

print "今は:";
print date('Y年m月d日 H時i分') . "<br>¥n";
print "<br><br>1日後は:";
$limit = date('Y年m月d日 H時i分',strtotime("+1 day"));
print $limit;

実行

strtotime のみ実行すると

print "strtotime:" . strtotime("now");
print "<br><br>strtotime,+1 day:" . strtotime("+1 day");

実行

2. 投稿から24時間以内の記事には [New] 画像を表示する

[6. 複数行データの読み書き表示] のフォームに、新しい投稿(投稿から24時間以内)には [New] 画像を表示する機能を追加します。
使用する画像はこちら

元にするスクリプトは form4.php(サブウィンドウで実行) のほうです。

上記 form4.php の時は

お名前<>コメント<>投稿日時<>

というログ形式でしたが、今回は最後に

strtotime("+1 day");

で取得した値を追加していきます。

お名前<>コメント<>投稿日時<>投稿から24時間後の値<>

このようなログを作成していき、ログを読み込む時の [strtotime] とログに書かれた [1日後の数値] を比べて、ログに書かれた値のほうが大きい場合に限り画像を表示します。

3. タイムスタンプを比較して条件に合えば画像を表示する

スクリプトは以下のようになっています。
スクリプト名は [form5.php]、ログファイルは [log.cgi] です。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
if (($_POST["name"] != "") or ($_POST["comment"] != "")) { //もしPOSTに [name] か [comment] があれば
if (isset($_POST["name"])) { //もしPOSTに [name] があれば
$name = $_POST["name"]; //POSTのデータを変数$nameに格納
if( get_magic_quotes_gpc() ) { $name = stripslashes("$name"); } //クォートをエスケープする
$name = mb_strimwidth ($name, 0, 30, "", "UTF-8"); //長いデータを30バイトでカット
$name = htmlspecialchars ($name); //HTMLタグ禁止
}
if (isset($_POST["comment"])) { //もしPOSTに [comment] があれば
$comment = $_POST["comment"]; //POSTのデータを変数$commentに格納
if( get_magic_quotes_gpc() ) { $comment = stripslashes("$comment"); } //クォートをエスケープする
$comment = mb_strimwidth ($comment, 0, 200, "", "UTF-8"); //長いデータを200バイトでカット
$comment = str_replace("¥r¥n", "¥r", $comment); //Windowsの改行コードを置き換え
$comment = str_replace("¥r", "¥n", $comment); //Machintoshの改行コードを置き換え
$comment = str_replace("¥n", "<br>", $comment); //¥nを<br>に変換(表示用)
$comment = htmlspecialchars ($comment); //HTMLタグ禁止
}
$data = fopen ("./log.cgi","r"); //ファイルを読みこみ専用でオープン
$bdata = fgets ($data); //1行読み込む
list($bname,$bcomment,$btime,$blimit) = explode("<>",$bdata); //変数に変換
fclose($data); //ファイルを閉じる
if (($bname != $name) or ($bcomment != $comment)){ //nameかcomment違っていたら
$time = date("Y/n/j G:i"); //日時の取得
$log = file("./log.cgi"); //ファイル1行づつ配列に入れながら読み込む
$limit = strtotime("+1 day"); //1日後のタイムスタンプ
$topwrite = "$name<>$comment<>$time<>$limit<>¥n"; //新しく追加するデータを <> で区切って整形
$write = fopen("./log.cgi","w"); //書き込み用モードでデータを開く(データは空になる)
flock($write, LOCK_EX); //ファイルロック開始
fputs($write, $topwrite); //先頭に1行書き込む
for($i = 0; $i < 9; $i++){ //9行まで走査処理をする
fputs($write, $log[$i]); //今までの分を書き込む
}
flock ($write, LOCK_UN); //ファイルロック解除
fclose ($write); //ファイルを閉じる
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>投稿から24時間以内の記事には [New] 画像を表示する</title>
</head>
<body>
<br>
<form method="POST" action="./form5.php">
お名前 <input type="text" name="name" size="20"><br>
コメント <input type="text" name="comment" size="60"><br>
<input type="submit" value="送信">
</form>
<br>
<?php
$sttime = strtotime("now"); //現在のタイムスタンプ
$log = file("log.cgi"); //データをオープン
for($i=0; $i<count($log); $i++) { //1行づつ走査しながら表示します
$list = explode("<>",$log[$i]);
if ($sttime < $list[3]) { //ログに書かれた1日後のタイムスタンプと現在のタイムスタンプを比較
print "<img src='./new.gif'><br>¥n"; //24時間以内なら [New] 画像を表示
}
print "お名前: " . $list[0] . "<br>¥n";
print "コメント: " . $list[1] . "<br>¥n";
print "日時: " . $list[2] . "<br>¥n";
print "<hr>";
}
?>
</body>
</html>

サブウィンドウで実行

Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/31/index.cgi:147 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/31/index.cgi on line 147