【入門】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