PHP実践 簡易掲示板を実装

php009

PHPの基礎を踏まえて、簡易掲示板を作ってみよう!

準備

仕様

掲示板の仕様は以下とする。

  • ユーザー名の書き込み
  • 文章の書き込み
  • 日時、ユーザー名、文章の表示
  • 全て削除機能
  • 特定アイテムの削除
見本

環境

環境version
Rocky Linux8.4
PHP7.4.6
MariaDB サーバー15.1
MariaDB クライアント 10.3.28

MariaDB 準備

ログイン

mysql -u root -p

データベース確認

show database
//+--------------------+
//| Database           |
//+--------------------+
//| information_schema |
//| list               |
//| mysql              |
//| performance_schema |
//+--------------------+

データベース作成

create database bbs;
//+--------------------+
//| Database           |
//+--------------------+
//| bbs                |
//| information_schema |
//| list               |
//| mysql              |
//| performance_schema |
//+--------------------+

テーブル作成

テーブル作成コード
<html>
 <head>
  <title>PHP</title>
 </head>
 <body>
 <?php
    $dbName = "bbs";
    $host = "localhost";
    $user = "root";
    $pass = "****";

    // DBへアクセス
    $db = new PDO('mysql:dbname='.$dbName.';host='.$host, $user, $pass);

    // エラー時の処理
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    try {
    // テーブル作成のSQLを作成
    $sql = 'CREATE TABLE bbs_data (
                no INT(11) AUTO_INCREMENT PRIMARY KEY,
                date DATETIME,
                name VARCHAR(100),
                data VARCHAR(100)
                ) engine=innodb default charset=utf8';

    // SQL実行
    $res = $db->query($sql);
    } catch(PDOException $e) {
        pritn($e->getMessage());
        die();
    }

    // SQL 閉じる
    $db = null;

 ?>
 </body>
</html>

作成したテーブルを確認

show columns from bbs_data;
//+-------+--------------+------+-----+---------+----------------+
//| Field | Type         | Null | Key | Default | Extra          |
//+-------+--------------+------+-----+---------+----------------+
//| no    | int(11)      | NO   | PRI | NULL    | auto_increment |
//| date  | datetime     | YES  |     | NULL    |                |
//| name  | varchar(100) | YES  |     | NULL    |                |
//| data  | varchar(100) | YES  |     | NULL    |                |
//+-------+--------------+------+-----+---------+----------------+

BBS作成 調理開始

クラス(DB接続、書込み、参照、削除)

クラスソース
/* class */
class myBBS{
    private $dbName = "bbs";
    private $host   = "localhost";
    private $user   = "root";
    private $pass   = "274366";
    private $db;
    private $dbData;

    function __construct(){
        // DBへアクセス
        $this->db = new PDO('mysql:dbname='.$this->dbName.';host='.$this->host, $this->user, $this->pass);

        // エラー時の処理
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    function __destruct(){
        $this->db = null;
    }

    function dataInsert($subName, $subCont){
        // 日付取得
        $inputDate = new DateTime();
        $inputDate = $inputDate->format('Y-m-d H:i:s');

        // テーブルへ値をインサート
        $sql = "INSERT INTO bbs_data (
                        date, name, data
                    ) VALUES (
                        '".$inputDate."','".$subName."','".$subCont."'
                    )";

        // SQL実行
        $this->db->query($sql);
    }

    function dataUpdate(){
        // テーブルの値を変更
        $sql = "";

        // SQL実行
        $res = $this->db->query($sql);
    }

    function dataSelect(){
        // テーブルから値を取得(参照)
        $sql = "SELECT * FROM bbs_data";

        // SQL実行
        $res = $this->db->query($sql);

       // 実行結果がある場合は真
       if($res){
            // テーブル件数
            if($res->rowCount() > 0){
                foreach($res->fetchAll() as $row){
                    print("-------------------------------------<br/>");
                    print("no : ".$row['no']."<br/>");
                    print("date : ".$row['date']."<br/>");
                    print("name : ".$row['name']."<br/>");
                    print("text : ".$row['data']."<br/>");
                    print("<input type='submit' name='record' value='del".$row['no']."'/><br>");
                }
            } else {
                print("no data"."<br/>");
            }
        }
    }

    // テーブルデータ削除
    function dataDelete($recordNo){
        // テーブルの値を削除
        $sql = "Delete from bbs_data WHERE no =".$recordNo;

        // SQL実行
        $res = $this->db->query($sql);
    }

    // テーブルデータ削除
    function allDelete(){
        // テーブルの値を削除
        $sql = "truncate table bbs_data";

        // SQL実行
        $res = $this->db->query($sql);
    }
}

コンストラクタ __construct

PODを使用してデータベースへアクセスします。

デストラクタ __destruct

解放処理

データをテーブルへインサートするメソッド → dataInsert(ユーザー名, 文章)

日付の取得してフォーマットを整えます。

$inputDate = new DateTime();
$inputDate = $inputDate->format('Y-m-d H:i:s');

データを”bbs_data”テーブルへインサートします。

$sql = "INSERT INTO bbs_data (
                date, name, data
            ) VALUES (
                '".$inputDate."','".$subName."','".$subCont."'
            )";

テーブルデータを更新するメソッド → dataUpdate()

未実装

テーブルデータを参照 → dataSelect()

テーブルデータを取得してレコード毎に$row配列へ格納

foreach($res->fetchAll() as $row)

削除ボタン作成

それぞれの”no”をボタンへ付与して、削除時に使用する。

print("<input type='submit' name='record' value='del".$row['no']."'/><br>");

テーブルデータ削除(個別) → dataDelete(レコードNo)

テーブルから対象Noのレコードを削除

$sql = "Delete from bbs_data WHERE no =".$recordNo;

テーブルデータ削除(全部) → allDelete()

テーブルデータを”truncate”する

$sql = "truncate table bbs_data";

クラスの呼び出し

呼び出し
// データクラス生成
$myBBS = new myBBS();

if($_SERVER['REQUEST_METHOD'] === 'POST'){

    // 両データが入力されている場合
    if(isset($_POST["addText"]) != ""){
        $subName = $_POST["use_name"];
        $subCont = $_POST["contents"];
        if($subName != "" && $subCont != ""){
            /* ------ */
            /* INSERT */
            /* ------ */
            // テーブルへ値をインサート
            $myBBS->dataInsert($subName, $subCont);
        }
    }elseif(isset($_POST["delText"]) != ""){
        /* ------ */
        /* DELETE */
        /* ------ */
        // レコード全削除
        $myBBS->allDelete();
    }elseif(isset($_POST["record"]) != ""){
        /* ------ */
        /* DELETE */
        /* ------ */
        // レコード削除
        $myBBS->dataDelete(trim($_POST["record"], "del"));
    }
}
/* ------ */
/* SELECT */
/* ------ */
// テーブル参照
$myBBS->dataSelect();

HTTPメソッド確認

“POST”を確認する

if($_SERVER['REQUEST_METHOD'] === 'POST'){

POSTデータ確認

“submit”されたデータの内容が存在する場合は”真”

$subName = $_POST["use_name"];
$subCont = $_POST["contents"];
if($subName != "" && $subCont != ""){

レコード全消去判定

}elseif(isset($_POST["delText"]) != ""){

レコード消去判定

“submit”データの”no”部分だけ”trim”する。

$myBBS->dataDelete(trim($_POST["record"], "del"));

テーブルの参照

“bbs_data”テーブルのデータを全て参照するクラスメソッド呼び出し

$myBBS->dataSelect();

HTTP

HTTP
<form action="" method="post">
    <h2>Name</h2><br>
    <input type="text" name="use_name"><br>
    <h2>Contents</h2><br>
    <textarea name="contents" rows="20" cols="100"></textarea><br>
    <input type="submit" name="addText" value="add"/>
    <input type="submit" name="delText" value="del"/>

form

“post”メソッドを設定

input

“submit”タイプの”name”を”addText”, “delText”とする。

BBS 完成

ソース
<?php
    /* class */
    class myBBS{
        private $dbName = "bbs";
        private $host   = "localhost";
        private $user   = "root";
        private $pass   = "274366";
        private $db;
        private $dbData;

        function __construct(){
            // DBへアクセス
            $this->db = new PDO('mysql:dbname='.$this->dbName.';host='.$this->host, $this->user, $this->pass);

            // エラー時の処理
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        function __destruct(){
            $this->db = null;
        }

        function dataInsert($subName, $subCont){
            // 日付取得
            $inputDate = new DateTime();
            $inputDate = $inputDate->format('Y-m-d H:i:s');

            // テーブルへ値をインサート
            $sql = "INSERT INTO bbs_data (
                            date, name, data
                        ) VALUES (
                            '".$inputDate."','".$subName."','".$subCont."'
                        )";

            // SQL実行
            $this->db->query($sql);
        }

        function dataUpdate(){
            // テーブルの値を変更
            $sql = "";

            // SQL実行
            $res = $this->db->query($sql);
        }

        function dataSelect(){
            // テーブルから値を取得(参照)
            $sql = "SELECT * FROM bbs_data";

            // SQL実行
            $res = $this->db->query($sql);

           // 実行結果がある場合は真
           if($res){
                // テーブル件数
                if($res->rowCount() > 0){
                    foreach($res->fetchAll() as $row){
                        print("-------------------------------------<br/>");
                        print("no : ".$row['no']."<br/>");
                        print("date : ".$row['date']."<br/>");
                        print("name : ".$row['name']."<br/>");
                        print("text : ".$row['data']."<br/>");
                        print("<input type='submit' name='record' value='del".$row['no']."'/><br>");
                    }
                } else {
                    print("no data"."<br/>");
                }
            }
        }

        // テーブルデータ削除
        function dataDelete($recordNo){
            // テーブルの値を削除
            $sql = "Delete from bbs_data WHERE no =".$recordNo;

            // SQL実行
            $res = $this->db->query($sql);
        }

        // テーブルデータ削除
        function allDelete(){
            // テーブルの値を削除
            $sql = "truncate table bbs_data";

            // SQL実行
            $res = $this->db->query($sql);
        }
    }

    try {
        // データクラス生成
        $myBBS = new myBBS();

        if($_SERVER['REQUEST_METHOD'] === 'POST'){

            // 両データが入力されている場合
            if(isset($_POST["addText"]) != ""){
                $subName = $_POST["use_name"];
                $subCont = $_POST["contents"];
                if($subName != "" && $subCont != ""){
                    /* ------ */
                    /* INSERT */
                    /* ------ */
                    // テーブルへ値をインサート
                    $myBBS->dataInsert($subName, $subCont);
                }
            }elseif(isset($_POST["delText"]) != ""){
                /* ------ */
                /* DELETE */
                /* ------ */
                // レコード全削除
                $myBBS->allDelete();
            }elseif(isset($_POST["record"]) != ""){
                /* ------ */
                /* DELETE */
                /* ------ */
                // レコード削除
                $myBBS->dataDelete(trim($_POST["record"], "del"));
            }
        }
?>
<!DOCTYPE html>
<html>
 <head>
  <title>BBS</title>
 </head>
 <body>
    <h1>BBS</h1>
    <form action="" method="post">
        <h2>Name</h2><br>
        <input type="text" name="use_name"><br>
        <h2>Contents</h2><br>
        <textarea name="contents" rows="20" cols="100"></textarea><br>
        <input type="submit" name="addText" value="add"/>
        <input type="submit" name="delText" value="del"/>
        <h2>Message</h2>
<?php
        /* ------ */
        /* SELECT */
        /* ------ */
        // テーブル参照
        $myBBS->dataSelect();
?>
    </form>
 </body>
</html>
<?php
        $myBBS = null;


    } catch(PDOException $e) {
        print($e->getMessage());
        die();
    }
 ?>

コメント

タイトルとURLをコピーしました