meideru blog

家電メーカーで働いているmeideruのブログです。主に技術系・ガジェット系の話を書いています。

PHPとMySQLでブラウザから閲覧できる電子掲示板を作ってみた

      2019/11/10

最近、ウェブ開発のバイトに転職するために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>

 

備考

今回作ったのは、あくまでもテスト用です。

セキュリティ対策が全くなされていないので、決して外部には公開しないでください (><)

 - 技術系