PHPの基礎を踏まえて、簡易掲示板を作ってみよう!
準備
仕様
掲示板の仕様は以下とする。
- ユーザー名の書き込み
- 文章の書き込み
- 日時、ユーザー名、文章の表示
- 全て削除機能
- 特定アイテムの削除
環境
環境 | version |
Rocky Linux | 8.4 |
PHP | 7.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();
}
?>