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>
備考
今回作ったのは、あくまでもテスト用です。
セキュリティ対策が全くなされていないので、決して外部には公開しないでください (><)
スポンサーリンク
関連記事