ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【PHP】簡易掲示板


某学習サイトのチュートリアルで簡易掲示板を作りました。

全体像

  • index.php
  • bbs.dat

index.phpから入力した値をbbs.datに保存。
bbs.datのデータをあるだけindex.phpに表示する。

制作時間
3時間

反省、改善点

  • セキュリティの面を調べて付け足していく。
  • データベースとのやりとりで作れるようにする。

入力画面

<?php
//エラーを表示
ini_set( 'display_errors', 1 );
error_reporting( E_ALL );

$dataFile = 'bbs.dt';

//エスケープする関数
function h($s){
return htmlspecialchars($s,ENT_QUOTES,'UTF-8');
}

$dataFile = 'bbs.dat';

//REQUEST_METHODがPOSTの時。(postされたとき)
//messageとuserがセットされていたら
if($_SERVER['REQUEST_METHOD']=='POST' && isset($_POST['message'])&&isset($_POST['user'])){

    $message = trim($_POST['message']);
    $user = trim($_POST['user']);
    
//messageが空じゃなかったら
    if($message !== ''){
        //userが空だったらnonameと設定する三項演算子
        $user =($user === '') ? 'noname' : $user;
        //mesageとuserにtabと改行をつける
        $message = str_replace("\t",'',$message);
        $user = str_replace("\t",'',$user);
        //日付も一緒に書き込む
        $postedAt = date('Y-m-d H:i:s');
        //メッセージをタブで区切って改行する
        $newData  = $message."\t".$user."\t".$postedAt."\n";
        //ファイルを開く
        $fp = fopen($dataFile,'a');
        //このファイルに書き込む
        fwrite($fp,$newData);
        //ファイルを閉じる
        fclose($fp);
    }
}
//一行ずつデータを取り出して配列に入れる
$posts = file($dataFile,FILE_IGNORE_NEW_LINES);
$post = array_reverse($posts);
?>
<!DOCTYPE html>
<html>
<head lang="ja">
<meta charset="utf-8">
<title>簡易掲示板</title>
</head>
<body>
<h1>簡易掲示板</h1>
<!--datファイルを指定するのでactionは空-->
<form action="" method="POST">
mesage:<input type="text" name="message">
user:<input type="text" name="user">
<input type="submit" value="投稿">

</form>
<h2>投稿一覧(0件)</h2>
<ul>
<!--postsがあるかどうか-->
<?php if (count($posts)): ?>
    <!--postの中身をひとつづつ抽出していく-->
    <?php foreach ($posts as $post):?>
    <!--
    php7ではlistは左のパラメータから値を入れていく
    php5ではlistは右のパラメータから値を入れていく
    http://php.net/manual/ja/function.list.php
    -->
    <?php list($message, $user, $postedAt) = explode("\t",$post); ?>
    <?php ?>
    <li><?php echo h($message); ?><?php echo h($user); ?><?php echo h($postedAt); ?></li>
    <?php endforeach; ?>    
<?php else : ?>
    <li>まだ投稿はありません。</li>
<?php endif ; ?>
</ul>
</body>
</html>