phpな休日 BBS sitemap
ログをページで区切って表示

1ページに表示するログの行数を設定して複数ページを行き来する機能を追加してみます。

01 <?php
02 mb_language("ja");
03 mb_internal_encoding("UTF-8");
04 if (isset($_GET["line"])) {$line = $_GET["line"];} //GETで渡された番号を $line に代入
05 if (($_POST["name"] != "") or ($_POST["comment"] != "")) { //もしPOSTに [name] か [comment] があれば
06 if ($_POST["name"]) { //もしPOSTに [name] があれば
07 $name = $_POST["name"]; //POSTのデータを変数$nameに格納
08 if( get_magic_quotes_gpc() ) { $name = stripslashes("$name"); } //クォートをエスケープする
09 $name = htmlspecialchars ($name); //HTMLタグ禁止
10 $name = mb_strimwidth ($name, 0, 30, "", "UTF-8"); //長いデータを30バイトでカット
11 }
12 if ($_POST["comment"]) { //もしPOSTに [comment] があれば
13 $comment = $_POST["comment"]; //POSTのデータを変数$commentに格納
14 if( get_magic_quotes_gpc() ) { $comment = stripslashes("$comment"); } //クォートをエスケープする
15 $comment = htmlspecialchars ($comment); //HTMLタグ禁止
16 $comment = mb_strimwidth ($comment, 0, 200, "", "UTF-8"); //長いデータを200バイトでカット
17 }
18 $data = fopen ("./log.txt","r"); //ファイルを読みこみ専用でオープン
19 $bdata = fgets ($data); //1行読み込む
20 list($bname,$bcomment,$btime) = explode("<>",$bdata); //変数に変換
21 fclose($data); //ファイルを閉じる
22 if (($bname != $name) or ($bcomment != $comment)){ //name か comment が違っていたら
23 $time = date("Y/n/j G:i"); //日時の取得
24 $log = file("./log.txt"); //ファイル1行づつ配列に入れながら読み込む
25 $topwrite = "$name<>$comment<>$time<>\n"; //新しく追加するデータを <> で区切って整形
26 $write = fopen("./log.txt","w"); //書き込み用モードでデータを開く(データは空になる)
27 flock($write, LOCK_EX); //ファイルロック開始
28 fputs($write, $topwrite); //先頭に1行書き込む
29 for($i = 0; $i < 25; $i++){ //25行まで走査処理をする
30 fputs($write, $log[$i]); //今までの分を書き込む
31 }
32 flock ($write, LOCK_UN); //ファイルロック解除
33 fclose ($write); //ファイルを閉じる
34 }
35 }
36 ?>
37 <html>
38 <head>
39 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
40 <title>ログをページで区切って表示</title>
41 </head>
42 <body>
43 <br>
44 <form method="POST" action="form5.php">
45 お名前 <input type="text" name="name" size="20"><br>
46 コメント <input type="text" name="comment" size="60"><br>
47 <input type="submit" value="送信">
48 </form>
49 <br>
50 <?php
51 $log = file("log.txt"); //ログファイルを読み込みます
52 if (!isset($line)) {
53 $line = 0; //最初のページは 0
54 }
55 $pageline = 5; //1ページに表示させる行数
56 for ($i = $line; $i < $line+$pageline; $i++) { //1行づつ走査しながら1ページ分を表示します
57 $list = explode("<>",$log[$i]);
58 print $list[0] . " " . $list[2] . " " . $list[1] . "<br>\n";
59 print "<hr>";
60 }
61 $totalline = (count($log)); //総行数
62 $totalpage = ceil(($totalline / $pageline)); //総ページ数(小数点以下切り上げ)
63 if ($totalline > $pageline) { //2ページ以上になるなら
64 $back = $totalline; //最初の $back は総行数
65 $now = 1; //ページ番号は1から
66 $next = 0; //行番号に代入される値は0から
67 for ($i = $line; $back >= 1; $i++) { //1行づつ走査しながら1ページ分を表示します
68 print "<a href='form5.php?line=" . $next . "'>" . $now . "</a> "; //GETで渡すリンク(行番号)
69 $now++; //ページ番号を増やしていく
70 $next = $next + $pageline; //行番号を増やしていく
71 $back = $back - $pageline; //行番号を減らしていく
72 }
73 }
74 ?>
75 </body>
76 </html>

サブウィンドウで実行

赤文字が新しく書きかえ・書き加えた部分です。
4行目の if (isset($_GET["line"])) {$line = $_GET["line"];} で GET で渡された行番号を受け取っています。GETについては後程。
29行目、今回はログの保存を25行に設定しました。
44行目と68行目の [form5.php] はPHPのファイル名に合わせて書いてあります。
50行目からPHPによる処理になりますが、52行目の if (!isset($line)) {、lineを受け取っていない場合、すなわち初めてページを開いた場合です。その場合は $line = 0; と、最新のログから表示します。
55行目で1ページに表示する行数を設定しています。変数名はあとで見た時戸惑わないようにわかりやすい名前をつけるようにします。
次の for 文ですが、$i = $line; $i < $line+$pageline; と1ページ分だけ走査しています。1番目の引数($line)から2番目の引数($line+$pageline)までを走査するという意味です。最初のページで言えば $line(0) ~ $line(0)+s$pageline(5)ですから5行分です。$line の値はユーザーのクリックによって変動しますが、いつでも5行になります。だったら [5] と書けば良いのですが、その通りです。ただ、表示の行数を変更したくなった時に修正が1か所で済むということです。
61行目 $totalline = (count($log)); でログファイルの行数を取得しています。count() が関数です。
62行目は総行数÷ページの行数で総ページ数を計算していますが、割り切れなかった場合に結果を繰り上げて返す関数 ceil() 関数を使っています。
複数ページ表示処理の準備として64~66行目の変数をセットします。$back と $now と $next です。
ページ番号を 1 から必要な分だけ表示します。この場合 $next は値が 5 づつ増えていき、$back は 5 づつ減っていきます。$backが 1 になるまで繰り返します。
68行目の GET ですがページからページへデータを渡す場合、POSTの他にGETで渡す方法があります。<a href="form5.php?line=5">2</a> のようにリンクを張る要領でデータを渡せます。この場合は line=5 。それをこのスクリプトの最初(4行目)で受け取ります。

追記)
<a href="http://www.p-ho.net/">phpな休日</a>
のようなリンクを print文中に書く場合、
print "ここに";
ダブルクォーテーションで囲むわけですが
print "<a href="http://www.p-ho.net/">phpな休日</a>";
このように書くとエラーになります。
ダブルクォーテーションの中に書く場合は、中に入るダブルクォーテーションをシングルクォーテーションに書きかえてください。
print "<a href='http://www.p-ho.net/'>phpな休日</a>";

2022.9.29 last edit

Produced by haku