アクセス向上大失敗 www.igros.net
Last updated 2004/8/16
コメントバック 対応

投稿制約を設ける -簡単PHP掲示板講座 STEP11-

[PR]特集 Amazon.co.jp レコメンドコンテンツ



STEP11
・投稿データにいくつかの制約を設ける
  [STEP10の問題点] HTMLタグや投稿メッセージサイズなど「なんでもあり」でした。
  [決め事] HTMLタグ禁止、投稿メッセージサイズ1,000文字上限、記録データ数30件までとします。
参考ソースプログラム
解説
<?php
# プログラム bbs.php STEP11
 $submit = $HTTP_POST_VARS["SUBMIT"];
 if ($submit=="送信") {
  $name = $HTTP_POST_VARS["NAME"];
  $mail = $HTTP_POST_VARS["MAIL"];
  $body = $HTTP_POST_VARS["BODY"];
  if ($name=="" or $body=="") {
   echo '<font color="#FF000">必須項目入力エラー</font><br>';
   echo 'お名前と本文は必ず入力してください<br>';
   echo '<a href="javascript:history.back()">戻る</a>';
   exit;
  }
  # HTML取除き
  $name = htmlspecialchars("$name");
  $mail = htmlspecialchars("$mail");
  $body = htmlspecialchars("$body");
  # メッセージ長1,000文字でカット
  $body = substr($body, 0, 1000);

  $body = str_replace("\r\n", "<br>", $body);
  $dt = date("y/m/d H:i:s");
  $data = file("data.txt");
  $fp = fopen("data.txt", "w");
   fwrite($fp, "$name\t$mail\t$body\t$dt\n");

   $i = 1;
   foreach ($data as $value) {
    if($i < 30) {
     fwrite($fp, "$value");
     $i++;
    }
   }
  fclose($fp);
 }
 echo '
  <html>
  <head>
  <title>PHP-BBS</title>
  </head>
  <body>
  <h1>PHP-BBS</h1>
  STEP11<br>
  <form method="post" action="bbs.php" accept-charset="x-euc-jp">
  お名前 <input type="text" size="16" maxlength="30" name="NAME">
  メール <input type="text" size="30" maxlength="50" name="MAIL"><br>
  本文<br>
  <textarea rows="10" cols="70" wrap="soft" name="BODY"></textarea><br>
  <input type="submit" name="SUBMIT" value="送信">
  </form>
 ';
 $data = file("data.txt");
 foreach ($data as $value) {
  $view = explode("\t", $value);
   echo '<hr size="5" width="70%" align="left" noshade>';
   if ($view[1]=="") { echo "<font color=\"#000080\"><b>$view[0]</b></font> $view[3]<br>"; }
   else { echo "<a href=\"mailto:$mail\"><font color=\"#000080\"><b>$view[0]</b></font></a> $view[3]<br>"; }
   echo "$view[2]<br>";
 }
 echo '</body></html>';
?>

$name = htmlspecialchars("$name");のhtmlspecialcharsはPHPのHTMLエンティティ命令です。
$nameに格納されている文字列の中から< >などのHTMLマークアップ記号を普通の文字として表示するようコード変換します。
(例.<は&lt;、>は&gt; のように)
$mail=、$body=も同様です。
これでいわゆるHTML禁止になります。

$body = substr($body, 0, 1000);のsubstrはPHPの与えられた文字列から指定した長さで文字列を切出し返す命令です。
$bodyに格納されている文字列の0番目(つまり最初)から1,000番目(つまり1,000文字)までを$bodyに再格納します。
決め事として投稿メッセージサイズ1,000文字にしたので、正確にはsubstr($body, 0, 999);になります。

記録データ件数を制限するためforeachループ文の中に判定文を加えます。
まず、foreachループの外(直前)で、任意の変数$iに初期値として1をセットします。
実際にfwrite($fp, "$value");でファイルへ記録する前に、$iの値と制限値:30を比較し、$iが30より小さければファイルへ書き込みます。
書き込んだ直後に、$iを1プラス更新($i++;)し、ループを繰返します。
そのうち$iの値が2,3,4...30に達すると、それ以降はファイルへ書き込みません。
つまり、古いデータは記録されず捨てられることになります。

では質問です!
1投稿メッセージの最大文字数を300、記録する最大件数を100件にする場合、どこをどう直せば良いでしょうか?
答えは↓(1例として)

 $body = substr($body, 0, 1000); を
 $body = substr($body, 0, 299);

 if($i < 30) { を
 if($i < 100) {

ここまでのサンプル check!

この間、サンプル掲示板で目立っていた再読込みによる二重投稿防止対策を行います。


<<<< トップ <<< テーマトップ << サブテーマトップ < 前頁次頁 >

www.igros.net
[PR]特集 Amazon.co.jp レコメンドコンテンツ



Copyright(C) アクセス向上大失敗 All Rights Reservd.
version2.0