meideru blog

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

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

      2016/08/03

最近、ウェブ開発のバイトに転職するためにPHPの勉強をしています(´・ω・`)

一通り勉強が終わったので、腕試しに電子掲示板を作ってみました。

今日は、そのソースコードを貼ろうと思います!

(注意:勉強を始めたばかりの素人が書いたため、セキュリティ上に大きな問題がある恐れがあります。このソースを使用する際は、自己責任でお願いします。)

作った電子掲示板の概要

仕様

1つのスレッドに書き込みしていくという単純な掲示板です。スレッドの作成はできません。

書き込む人は、ユーザ名と書き込み内容を指定できます。

デザインについて

デザイン部分は全く触っていないため、とても地味です。タグを付けてスタイルシートでいじればまともになると思われます。

@デザイン
デザイン

サーバ環境について

サーバはCentOS 7 でWebサーバはApache、データベースはMySQL(MariaDB)を使用しています。

ソースコード

ソースコードを貼る前に、データベースについて説明します。

データベースのカラムは、以下のように設計してあります。

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)

 

では、ソースコードを順に貼っていきたいと思います。全部で5つから構成されています。

<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());
}
?>

 

<?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();
    }
  }
}
?>

 

<?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
}
?>

 

<?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>

 

ソースコードは以上です。

ソースコードの解説

上でも説明した通り、5つから構成されています。

index.php

index.phpは、ユーザがアクセスするページです。

それぞれの機能は、ソース内でrequireで呼び出しています。

init.php

init.phpは、データベースに接続するためのスクリプトです。

一応言っておきますが、データベースの秘密情報はデタラメなので、公開しても問題無いです。

add.php

add.phpは、form.phpから送信されてきた情報を処理するスクリプトです。

具体的には、データベースにform.phpから送信されてきた書き込みを追加します。

view.php

view.phpは、書き込みを表示するスクリプトです。

殺風景ですが、スタイルシートで編集すれば、見栄えがもっと良くなると思われます。

form.php

form.phpは、書き込みを入力するスクリプトです。

送信先はindex.phpですが、requireされているのでadd.phpで処理します。

 

こんなところです!

 - 技術系