Top > PHP > フォーム
  • とりあえず、名前欄とコメント欄を付けたフォームとします。
    action=<? echo $PHP_SELF;?> とするとターゲットが自分自身になる!
    <form method="post" action="<? echo $PHP_SELF; ?>"><b>N </b><input name="name" type="text" size="10">
    <b>:</b><input name="mes" type="text" size="40"><input type="submit" value=" Send "></form>
     
  • 表示処理
    表示は簡単です。一行に一データ入っているので、最新10件表示させるにはログ先頭から10行読み込めばいいです。
    $lines = file("log.log");
    //file() 関数でファイルの内容を配列に入れます。ログの一行分(改行まで)が配列の一要素となります。
    for($i = 0; $i < 10; $i++) {
    //配列の番号を増やして出力
      echo $lines[$i];
    
    }
     

ついでにカンマ等で区切った場合も示しておきます。

$lines = file("log.log");
for($i = 0; $i < 10; $i++){
  list($now,$name,$mes)=explode(",",$lines[$i]); 
  echo "$name >> $mes <font size=1>[$now]</font><br>\n";
}
 

explode() 関数によりカンマで分割して、それを list() で変数に代入

if($name && $mes){

次に変数の処理をします。外部からくる値は何が来るかわかりません。HTMLタグを入力されれば荒らされる可能性があるのでHTMLタグを変換しましょう。htmlspecialchars() 関数を使います。タグ除去にはstrip_tags() があります。

$mes = htmlspecialchars ($mes);
$name = htmlspecialchars ($name);
一番↑で「パソコン機能」と入力するとわかりますが、スクリプトをShift-JISで書いた場合「ソ能表」など2バイト目が5Cになっているものは後ろに\マークが付きます。これはphp.iniでmagic quotes gpc がOnになっている為です。

EUCで書けない場合やmagic_quotes_gpcがOffに出来ない場合は\マークを除去します。

if(get_magic_quotes_gpc()){

 $mes = stripslashes($mes);
 $name = stripslashes($name);

}
get_magic_quotes_gpc()は、php.iniの設定を返します。Onなら1です。Onの場合stripslashes() 関数でバックスラッシュを取り除きます。

次に日付けのフォーマットを決めます。gmdateと+9時間で海外の鯖でも日本時間が出ます。

$now = gmdate("d(D) h:i a",time()+60*60*9);
今回はログの中身をそのまま表示するので、HTMLの(実際に表示する)状態でファイルに書き込みます。フォーマットして変数に入れておきましょう。

$dat = "$name >> $mes <font size=1>[$now]</font><br>\n";
データの最後に改行コードを入れます。これでログ一行一データとなります。

ログの書き込みですが、一般に掲示板などでは

・先頭から書き込んで、先頭から表示
・最後に書き込んで、後ろから表示

の2つの方法があると思いますが、今回は前者の方法で行います。
ファイルの先頭に最新データを書き込み、現データを一定件数(100件)を越えないように書き込みます。

$lines = file("log.log"); //いままでのログを配列に読み込む
$fp = fopen("log.log","w"); //ログをオープン(空になる)
fputs($fp,$dat); //データを書き込む(先頭に)
for($i = 0; $i < 99; $i++) //いままでの分を追記

 fputs($fp, $lines[$i]);	//(配列0-98→現ログ1-99行目)

fclose ($fp);
となります。 ログを100件にまとめるには現ログの99件を書き直せばいいです。

さて表示と書き込みをまとめてみましょう。書き込み処理は表示より前に持ってきた方がいいですね。同じ名前(ログファイル名)や後から変更する数値(表示行数)は変数か定数として、先頭に移動させましょう。

[ ソース ] [ 実行結果 ][ ログ ]

効率などはあまり考えてないので、追求したい方は考えてみてください。

最新ログを下に表示するバージョン
[ ソース ] [ 実行結果 ]

複数行の入力
複数行の場合は、やや違った処理が必要となります。TEXTAREAで入力欄を作ってみます。

form method="post" action="tt5.php">

textarea name="com" cols="40"></textarea>

input type="submit" value="submit"> </form>

 

$com =

複数行を入力してみてください。一行で表示されますよね?ソースを見るとわかりますが実際には改行コードを送っているので、改行コードをHTMLの改行「<br>」に変換すればいいんです。

ただし、改行コードはOSによって異なるので統一する必要があります。 \nに統一してから、<br>に変換します。

$com = $_POST['com']; //method="post"なら$_POST、getなら$_GET
$com = str_replace("\r\n", "\r", $com); //Win系は\r\n
$com = str_replace("\r", "\n", $com); //Mac系は\r
$com = str_replace("\n", "<br>", $com); //\n除去して<br>

nl2br()を使えば、改行の前に<br />を入れてくれますが、改行コードは消えません

これで複数行がデータ上一行になり、HTMLで表示した時には複数行となります。

TEXEAREAを使ったサンプルです
[ ソース ] [ 実行結果 ]

クッキーやページ処理については、掲示板スクリプトを参考にして見てください。setcookie() はすべてのHTML文やechoの前で実行しなければいけません。


リロード     ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sat, 04 Dec 2010 22:49:43 JST (2850d)