PHPとMySQLでブラウザから閲覧できる電子掲示板を作ってみた
最近、ウェブ開発のバイトに転職するためにPHPの勉強をしています(´・ω・`)
一通り勉強が終わったので、腕試しに電子掲示板を作ってみました。
今日は、そのソースコードを貼ろうと思います!
(注意:下記コードはセキュリティを全く考えていません。そのまま外部に公開することは危険ですので、よろしくお願いいたします。)
目次
スポンサーリンク
作った電子掲示板の概要
仕様
1つのスレッドに書き込みしていくという単純な掲示板です。スレッドの作成はできません。
書き込む人は、ユーザ名と書き込み内容を指定できます。
デザインについて
デザイン部分は全く触っていないため、とても地味です。タグを付けてスタイルシートでいじればまともになると思われます。
@デザイン

サーバ環境について
サーバはCentOS 7 でWebサーバはApache、データベースはMySQL(MariaDB)を使用しています。
ソースコード
構成について
主に5つのコードから構成されています。
- index.php(ユーザーがアクセスするページ)
- init.php(データベースに接続するスクリプト)
- add.php(form.phpから送られてきた情報を処理するスクリプト)
- view.php(書き込みを表示するスクリプト)
- form.php(書き込みを入力するスクリプト)
これらのファイルを同一ディレクトリに置いてもらえれば、最低限の掲示板の機能として、動作します。
データベースについて
データベースのカラムは、以下のように設計してあります。
MariaDB [board_test]> show columns from thread1; +---------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+-------------------+----------------+ | number | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | time | timestamp | NO | | CURRENT_TIMESTAMP | | | content | varchar(600) | YES | | NULL | | +---------+--------------+------+-----+-------------------+----------------+ 4 rows in set (0.03 sec)
index.php
<html>
<head>
<title>掲示板</title>
<meta http-equiv="content-type" content="text/html;
charset=utf-8">
</head>
<body>
<?php // DB情報 ?>
<?php require 'init.php' ?>
<?php // 書き込み追加 ?>
<?php require 'add.php' ?>
<!-- 書き込み一覧 -->
<?php require 'view.php'; ?>
<!-- 投稿フォーム -->
<?php require 'form.php' ?>
</body>
</html>
<?php
// データベースの秘密情報
$db_user = "board_test"; // ユーザ名
$db_pass = "123456789"; // パスワード
$db_host = "localhost"; // ホスト名
$db_name = "board_test"; // データベース名
$db_type = "mysql"; // データベースの種類
?>
<?php
// DSN組み立て
$dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8";
// データベース接続
try {
// データベース接続
$pdo = new PDO($dsn, $db_user, $db_pass);
// エラーモード設定
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}
catch (PDOException $Exception) {
// エラーメッセージ
die('接続エラー:'.$Exception->getMessage());
}
?>
init.php
<?php
// データベースの秘密情報
$db_user = "board_test"; // ユーザ名
$db_pass = "123456789"; // パスワード
$db_host = "localhost"; // ホスト名
$db_name = "board_test"; // データベース名
$db_type = "mysql"; // データベースの種類
?>
<?php
// DSN組み立て
$dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8";
// データベース接続
try {
// データベース接続
$pdo = new PDO($dsn, $db_user, $db_pass);
// エラーモード設定
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}
catch (PDOException $Exception){
// エラーメッセージ
die('接続エラー:'.$Exception->getMessage());
}
?>
add.php
<?php
// form.phpから送信されてきた場合
if (isset($_POST["name"], $_POST["content"])) {
//名前が空のとき
if ($_POST["name"] == '') {
$isName = false;
}
else {
$isName = true;
}
// 内容が空のとき
if ($_POST["content"] == '') {
$isContent = false;
} else {
$isContent = true;
}
}
?>
<?php
// データベースに追加する
if (isset($isName, $isContent)) {
if ($isName && $isContent) {
try {
// トランザクション開始
$pdo->beginTransaction();
// SQL文を発行
$sql = "INSERT INTO thread1 (name, content) VALUES (:_name, :_content)";
// ステートメントハンドラを取得
$stmh = $pdo->prepare($sql);
// 値を結びつける
$stmh->bindValue(":_name", $_POST["name"], PDO::PARAM_STR);
$stmh->bindValue(":_content", $_POST["content"], PDO::PARAM_STR);
// 実行
$stmh->execute();
// トランザクション終了
$pdo->commit();
} catch (PDOException $Exception) {
$pdo->rollBack;
print("エラー" . $Exception->getMessage());
}
}
}
?>
view.php
<?php
// ステートメントハンドラを取得
try {
// トランザクション開始
$pdo->beginTransaction();
// SQL文を発行
$sql = "SELECT * FROM thread1";
// ステートメントハンドラを取得
$stmh = $pdo->prepare($sql);
// 実行
$stmh->execute();
// 書き込み件数を取得
$count = $stmh->rowCount();
// トランザクション終了
$pdo->commit();
}
catch (PDOException $Exception){
print("エラー:" . $Exception->getMessage());
}
// 書き込み件数を表示
if ($count == 0) {
// 書き込みがないとき
print("書き込みがありません。<br>");
}
else {
// 書き込み件数を表示
print("書き込み件数は" . $count . "件です。<br><br><br>");
}
?>
<?php
// 書き込みを表示する
while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
?>
番号:<?php print($row['number']); ?><br>
名前:<?php print($row['name']); ?><br>
時間:<?php print($row['time']); ?><br>
内容:<?php print($row['content']); ?><br>
<br>
<br>
<?php
}
?>
form.php
<?php
// $isNameと$isContentが存在するとき
if (isset($isName, $isContent)){
// 名前が空のとき
if (!$isName) {
print("名前が入力されていません。<br>");
}
// 内容が空のとき
if (!$isContent) {
print("内容が入力されていません。<br><br>");
}
}
?>
<form name="post" method="post" action="index.php">
名前:<input type="text" name="name"><br><br>
内容:<br>
<textarea name="content" rows="10" cols="30"></textarea><br>
<input type="submit" value="送信">
</form>
備考
今回作ったのは、あくまでもテスト用です。
セキュリティ対策が全くなされていないので、決して外部には公開しないでください (><)
スポンサーリンク
関連記事