410.coffee

まじめにふざける。

【入門】PHPで掲示板を作る|サンプルコードあり

掲示板は結構いい練習になります。

張り切っていきましょう!

動作環境を整える

今回はサーバーを使用しますので、

サーバーを立てるか無料レンタルサーバーを借りましょう。

Indexの作成

今回はPHPで作成するため、端子は.phpの

index.php

を作成します。

作成出来たらいつもの書きます。

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>bbs</title>
  </head>
  <?php

   ?>
  <body>

  </body>
</html>

POSTから情報を受け取る

今回の肝です。

HTMLのFromタグから情報を受け取ります。

<body>
    <form action="index.php" method="post">
    <input type="text" name="comment"><br/>
    <input type="submit" value="送信">
    </form>
</body>

とりあえずPOSTのフォームと、submitを作成します。

このフォームから情報を受け取るには、

$_POST[‘(name)’]

を使用します。

試しに入力された情報を表示してみましょう。

<?php
  $comment = $_POST[comment];
  print($comment);
?>

これで入力された情報が表示できたと思います。

データを保存しよう

次に、入力された情報がデータとなって保存できるようにしたいと思います。

今回はtxtに保存する方式で行きます。

まずはその核となるtxtファイルを作成しましょう。

今回は comment.txt にします。

ファイルを読み込もう

ファイルの読み込みは

$filename = 'comment.txt';
 
$fp = fopen($filename, 'r');

$txt = fgets($fp);

//ここに処理

fclose($fp);

この一連の動作で可能です。

てことで comment.txt に何か適当なことを入れてください。

そしたら表示してみます。

<?php

  $filename = 'comment.txt';
  $fp = fopen($filename, 'r');
  $txt = fgets($fp);

  print($txt);

  fclose($fp);
?>

表示できましたでしょうか。

これで半分完成とまではいきませんがあと少しです。

ファイルに書き込もう

今回は掲示板なので、追記しようのほうが正しいですね。

さて、先ほどはtxtの中身を表示させましたが、今回は追記するだけです。

追記するにはrからaに変えましょう。

<?php

  $fp = fopen($filename, 'r→a');
  fclose($fp);

?>

実は r は読み込み専用で、

aは書き込み(追記専用)です。

それとは別にw、書き込み(上書き)などもあります。

<?php

  $comment = $_POST[comment];

  $filename = 'comment.txt';
  $fp = fopen($filename, 'a');

  fwrite($fp,"<p>".$comment."</p>\n");

  fclose($fp);

  if (isset($_POST['sub'])) {
    $fp = fopen($filename, 'r');
      while ($txt = fgets($fp)) {
        echo $txt;
      }
    fclose($fp);
  }

?>

少し複雑なことをしていますね。

簡単に説明すると、

追記して、submitから反応があれば表示

という感じです。

とりあえず十分掲示板の機能はありますね。

もっと掲示板ぽくしていきます。

現時点

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>bbs</title>
  </head>
  <?php
    $comment = $_POST[comment];

    $filename = 'comment.txt';
    $fp = fopen($filename, 'a');

    fwrite($fp,"<p>".$comment."</p>\n");

    fclose($fp);

    }

   if (isset($_POST['sub'])) {
     $fp = fopen($filename, 'r');
     while ($txt = fgets($fp)) {
      echo $txt;
    }
    fclose($fp);

   ?>
  <body>
    <form action="index.php" method="post">
    <input type="text" name="comment"><br/>
    <input type="submit" name="sub" value="送信">
    </form>
  </body>
</html>

空欄かどうか判定しよう

今の状態だと実は、空欄のまま送信しても書き込まれちゃいます。

これだと容量の無駄ですよね。

ということで空欄かどうか判定していきます。

<?php
if (isset($_POST['sub'])) {
  if (empty($comment)) {
    header('Location: ./error.html');
    exit;
  }else {
        $fp = fopen($filename, 'a');

        fwrite($fp,"<p>".$comment."</p>\n");
 
        fclose($fp);
  }
}
?>

ついでにerror.htmlも作って、エラーメッセージを表示をさせましょう。

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Error</title>
  </head>
  <body>
    <p>Error : 101</p>
    <p>コメント が書かれていません</p>
    <p>三秒後に元のページへ戻ります。</p>
    <META HTTP-EQUIV='refresh' CONTENT='3; URL=./index.php'>
  </body>
</html>

これでOkです。

二重投稿対策をしよう。

結構地味ですが重要ですよ。

クロームなどを使用していると、送信した後に

更新をしようとすると二重投稿になってしまいます。

まずいので対策します。

まずはreload.htmlを作成してください。

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Reload</title>
  </head>
  <body>
    <p>投稿しました</p>
    <p>三秒後に元のページへ戻ります。</p>
    <p>※二重投稿のもとになるためブラウザバックはお控えください。</p>
    <META HTTP-EQUIV='refresh' CONTENT='3; URL=./index.php'>
  </body>
</html>

次にindex.phpに移ります。

さっき書いた投稿のコードに少し書き足します。

<?php
  if (empty($comment)) {
    header('Location: ./error.html');
    exit;
  }else {
        $fp = fopen($filename, 'a');

        fwrite($fp,"<p>".$comment."</p>\n");
 
        fclose($fp);

        header('Location: ./reload.html'); //ここ
  }
?>

これで対策は完了です。

IDや連番を振ろう

少し細かいところを作っていきます。

時間を表示しよう

時間を表示させるにはdateを使います。

$date = date('YmdHis');
$time = date('Y:m:d H:i:s');

左から、年 月 日 (週)時間 分 秒 です。

これらを使っていつ投稿されたかわかるようにします。

$write = "<p>".$time."</p><p>".$comment."</p>\n";

fwrite($fp,$write);

書き換えてください。

これでおそらく時間がでかでかと書かれていると思います。

連番を振る

やはり重要です。

何スレ目かは欠かせないですね。

今回は楽したいのでtxtを使います。

count.txtを作成してください。

$file_handle = fopen( "./count.txt", "a");
fwrite( $file_handle, '1');
fclose($file_handle);

$count = filesize("./count.txt");

書く処理のあたりにこれを配置します。

したらあとはこちらに上書きしてください。

$write = "<p>".$count." ".$time."</p><p>".$comment."</p>\n";

これで連番は完成です。

1000超えたら書き込めないようにする。

完全番外編です。

全ての処理を、こちらで囲むとできます。

if ($count > 1000) {
}else {
//ここに
}

IDを付与したい

これはやり方色々ありますが、今回はcookieを使用します。

session_start();

$_COOKIE[session_name()];
$id = mb_substr( $_COOKIE[session_name()], 0, 6, "UTF-8" );

解説すると、クッキーIDを取得してそれを6文字で表示させます。

あとはこちらをコピーして上書きしてください。

$write = "<p>".$count." ".$time." ".$id."</p><p>".$comment."</p>\n";

ハンドルネームをつけたい

とりあえずコメントの横に新しいフォームを作ります。

<form action="index.php" method="post">
   <input type="text" name="comment"><input type="text" name="my_name" placeholder="ハンドルネーム(省略可)"><br/>
   <input type="submit" name="sub" value="送信">
</form>  

そしたら、ハンドルネームがある場合とない場合で条件分岐させます。

if(empty($my_name = $_POST["my_name"])){
  $myname = "匿名さん";
}
else {
  $myname = $_POST["my_name"];
}

あとはこれを上書きしてください。

$write = "<p>".$count." ".$myname." ".$time." ".$id."</p><p>".$comment."</p>\n";

これでハンドルネームは完成です。

最後に

これで掲示板が完成したと思います。

結構いい練習になりましたか?

それではまた別の機会で~

サンプルコード

index.php

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>bbs</title>
  </head>
  <?php
    session_start();

    $comment = $_POST[comment];

    $filename = 'comment.txt';

    $date = date('YmdHis');
    $time = date('Y:m:d H:i:s');

    $_COOKIE[session_name()];
    $id = mb_substr( $_COOKIE[session_name()], 0, 6, "UTF-8" );

    if(empty($my_name = $_POST["my_name"])){
      $myname = "匿名さん";
    }
    else {
      $myname = $_POST["my_name"];
    }

    if (isset($_POST['sub'])) {

      if (empty($comment)) {
        header('Location: ./error.html');
        exit;
      }else {

        $file_handle = fopen( "./count.txt", "a");
        fwrite( $file_handle, '1');
        fclose($file_handle);

        $count = filesize("./count.txt");

        $fp = fopen($filename, 'a');

        $write = "<p>".$count." ".$myname." ".$time." ".$id."</p><p>".$comment."</p>\n";

        fwrite($fp,$write);

        fclose($fp);

        header('Location: ./reload.html');
      }

    }

    $fp = fopen($filename, 'r');
      while ($txt = fgets($fp)) {
        echo $txt;
      }
    fclose($fp);

   ?>
  <body>
    <form action="index.php" method="post">
    <input type="text" name="comment"><input type="text" name="my_name" placeholder="ハンドルネーム(省略可)"><br/>
    <input type="submit" name="sub" value="送信">
    </form>
  </body>
</html>

error.html

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Error</title>
  </head>
  <body>
    <p>Error : 101</p>
    <p>コメント が書かれていません</p>
    <p>三秒後に元のページへ戻ります。</p>
    <META HTTP-EQUIV='refresh' CONTENT='3; URL=./index.php/'>
  </body>
</html>

reload.html

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Reload</title>
  </head>
  <body>
    <p>投稿しました</p>
    <p>三秒後に元のページへ戻ります。</p>
    <p>※二重投稿のもとになるためブラウザバックはお控えください。</p>
    <META HTTP-EQUIV='refresh' CONTENT='3; URL=./index.php'>
  </body>
</html>

comment.txt

  

count.txt