Sqliteで作った簡易掲示板のコードを配布致します。#php #code
2022.09.20
おはようございます。台風は過ぎ去りましたがせっかくの三連休が残念です💦。
今日は先日、Sqliteを使用して簡易掲示板を作ってみましたのでコードを配布致します、尚、PHP8の環境下で動作させています(PHP7系でも動作すると思います)。
Sqliteってnow()関数がなかったりだとか、Deleteする時に、noカラムを昇順しlimitを使用して削除出来ないだとか、いろいろとMysqlとは違う所があり、面倒だなと思いながらコードを書きました、尚、SqliteはWebサーバーの階層に置かないように、置いても良いですが・・・。そのままの状態だと誰でもダウンロードが可能になってしまいますのでご注意ください。自分は地下に眠らしています😅。
一応、二重投稿防止の為に20秒経過しないと再投稿出来ないようにしています😌。トライしていない事は禁止ワード等がありません🤔。つけようと思ったのですがまぁ良いかなと、、、。
動作している環境のリンクはこちら。
軸となるPHPのソースコードを2つ貼っときますね。
<?php
session_start();
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
$_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="Description" content="Enter your description here" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<link rel="stylesheet" href="assets/css/style.css?<?= time() ?>">
<title>掲示板</title>
</head>
<body class="p-3 text-white">
<div class="p-4 shadow rounded" style="background-color:#d6dbdf;">
<div class="container mt-5">
<div class="row">
<div class="col-12 text-center">
<h1 class="shadow" style="color:#195a57;">掲示板::version 2.5</h1>
</div>
<div class="col-12">
<div class="input-group shadow rounded">
<div class="input-group-append">
<span class="input-group-text bg-dark text-white" id="my-addon">ニックネーム</span>
</div>
<input class="form-control" type="text" name="name" placeholder="ニックネームを入力" aria-describedby="my-addon">
</div>
<div class="form-group shadow rounded">
<label for="my-textarea">コメント</label>
<textarea id="my-textarea" class="form-control" name="comment" rows="7"></textarea>
</div>
<button id="btn" class="mt-2 btn btn-info text-white shadow rounded" type="button">投稿する</button>
</div>
</div>
</div>
<div class="container mt-5">
<div class="row">
<div id="view" class="col-12"></div>
</div>
</div>
</div>
<footer>
<a href="/">TOP</a> :: © Reborn9.sakura.ne.jp <?=date("Y")?>
</footer>
<input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">
<script src="https://code.jquery.com/jquery-3.2.1.min.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.9.2/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.0/js/bootstrap.min.js"></script>
<script src="assets/js/main.js?<?= time() ?>"></script>
</body>
</html>
<?php
class db
{
var $pdo = null;
function __construct()
{
try {
$this->pdo = new PDO("sqlite:../../bbs.sqlite3");
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //code...
} catch (\Throwable $th) {
//throw $th;
print $th->getMessage();
}
}
function select_limit()
{
if($this->pdo){
$stmt = $this->pdo->prepare('select * from bbs order by no desc limit 0,5');
$stmt->execute();
$result = $stmt->fetchAll();
$stmt = null;
$this->pdo = null;
return new view($result);
}
}
function insert($name,$comment,$sns_cnt=0)
{
try {
$stmt = $this->pdo->prepare('INSERT INTO bbs (`time`,`name`,`comment`,sns_cnt)values(strftime(\'%Y年%m月%d日 %H時%M分%S秒\',CURRENT_TIMESTAMP, \'localtime\'),:name,:comment,:sns_cnt)');
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
$stmt->bindParam(':sns_cnt', $sns_cnt, PDO::PARAM_INT);
$stmt->execute();
$stmt = $this->pdo->prepare('DELETE FROM bbs WHERE bbs.no = (SELECT no from bbs ORDER BY no ASC LIMIT 1);');
$stmt->execute();
$stmt = null;
$this->pdo = null;
return true;
} catch (\Throwable $th) {
print $th->getMessage();
return false;
}
}
}
class view{
var $item = null;
function __construct($item)
{
$this->item = $item;
}
function view_item($item="")
{
try {
$item = $item?$item:$this->item;
ob_start();
?>
<?php
foreach($item as $key=>$value){
?>
<div class="mt-2 row txtbox shadow rounded">
<div class="col-3 name_<?=$value["no"]?> rounded-start fs-6">
ニックネーム::<?=$value["name"]?>さん
</div>
<div class="col-9 time_<?=$value["no"]?> fs-6">
投稿日時::<?=$value["time"]?>
</div>
<div class="col-12 comment_<?=$value["no"]?>">
<?= nl2br($value["comment"])?>
</div>
<div class="col-12 sns_cnt_<?=$value["no"]?>">
<!-- <?=$value["sns_cnt"]?> -->
</div>
</div>
<?php
}
?>
<?php
$ret["view"]= ob_get_clean();
$ret["msg"]= "done";
} catch (\Throwable $th) {
//throw $th;
$ret["msg"] = "error";
}
return $ret;
}
}
session_start();
$ret = null;
$mode = xss_defence($_POST["mode"]);
// $time = ;
$name = xss_defence($_POST["name"]);
$comment = xss_defence($_POST["comment"]);
$sns_cnt = (int)xss_defence($_POST["sns_cnt"]);
if (isset($_POST["csrf_token"])
&& $_POST["csrf_token"] === $_SESSION['csrf_token'] && (function($t){
return time() - $t > 20?true:false;
})($_SESSION["save"])) {
if($mode==="save"){
$name = !preg_replace("/[ | ]/","",$name)?"匿名":$name;
$comment = !preg_replace("/[ | ]/","",$comment)?"":$comment;
if($comment){
$db = new db();
$db->insert($name,$comment);
$_SESSION["save"] = time();
}
}
$db = null;
$db = new db();
$ret = $db->select_limit()->view_item();
print json_encode($ret);
}
function xss_defence($value){
if(is_array($value)){
foreach($value as $key=>$val){
$value["$key"] = strip_tags($val);
$value["$key"] = htmlspecialchars($value["$key"],ENT_QUOTES);
}
}else{
$value = strip_tags($value);
$value = htmlspecialchars($value);
}
return $value;
}
配布コードはこちらです。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
20, 7, 8, Code, Delete, LIMIT, MYSQL, no, Now, php, Sqlite, web, いろいろ, カラム, コード, ご注意, サーバー, せっかく, そのまま, ダウンロード, トライ, ワード, 三連, 事, 二, 今日, 休, 使用, 先日, 削除, 動作, 可能, 台風, 地下, 所, 投稿, 掲示, 昇順, 時, 残念, 為, 状態, 環境, 禁止, 簡易, 経過, 自分, 良, 誰, 配布, 関数, 防止, 階層, 面倒,
明けましておめでとうございます。
2017.01.01
明けましておめでとうございます。
新年、そうそうちょっと暗めの年賀状が届いている方、
申し訳ございません。うまく色合いを調整することが出来ませんでした。
ちなみに年賀状を送ったのは
数人、片手で数えることが可能な人数でございます。
あとはデジタル送信でLINEやらに送信されていると思います。
この記事は自動投稿機能によりカウントダウン後、
日付が変わって数秒で投稿されているはずです。
ちなみにこの記事はクリスマス・イブの日に書き上げています。
正月用の記事はこの三連休に予約しときます。
(それ以外にも記事は投稿するとは思いますが未定。)
ということで
今年もよろしくお願いします。
皆様にとって良い年になるように祈ってますので、
祈り返してください:D
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
line, nbsp, あと, イブ, お願い, カウントダウン, クリスマス, こと, それ, デジタル, パス, 三連, 予約, 人数, 今年, 休, 可能, 年, 年賀状, 投稿, 数人, 数秒, 新年, 方, 日, 日付, 未定, 機能, 正月, 片手, 申し訳, 皆様, 自動, 色合い, 記事, 調整, 送信,
大阪の観光地へ行ってきた!!
2016.10.12
先日、大阪の観光地を巡ってきました。
どこもコミコミなので人混みに酔うひとは要注意。
三連休の中休みともあって混み具合はまぁまぁ混んでいた方だと
思います。今回、巡った箇所は通天閣、道頓堀、心斎橋、かに道楽とかです。
この中で要注意があるとすれば、通天閣の展望台へいくことです。
女子同士とか男同士とかで行くと「まじでぇ?」って事になるので
必ず、男女混合かカップルで行くことをおすすめします。
まぁ行けばわかります。
ちなみにお気に入りの景色は、道頓堀だったりします。
なんか良かったです。
大阪は今回で3回目ぐらいしか足を運んでいないのですが
一つ気付いた事が・・・
電車が東京の電車に比べて横揺れが少ない・・・なっていう感じがしました。
なんか電車の乗り心地が良いなって思いました。
東京と高知の汽車を比べると断然、東京のほうが乗り心地は良いです。
東京は本数が多い分、時刻に合わすためガンガンいこうぜ!
って具合になっている感じがしますが、大阪は安全重視ぽっい気がしましたね。
最後にiPhoneで撮影した写真を載せときます。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
3, iPhone, おすすめ, お気に入り, カップル, かに道楽, こと, コミコミ, ため, どこ, ひと, まし, 一つ, 三連, 中, 中休み, 乗り心地, 事, 人混み, 今回, 休, 先日, 具合, 分, 同士, 大阪, 女子, 安全, 展望台, 心斎橋, 感じ, 方, 時刻, 景色, 最後, 本数, 東京, 横揺れ, 気, 汽車, 注意, 混合, 男同士, 男女, 箇所, 観光地, 足, 通天閣, 道頓堀, 重視, 電車, 高知,
…のように感じる、…のような手触りがする、…をしたい気がする、を欲しい気がする
2016.10.10
『…のように感じる、…のような手触りがする、…をしたい気がする、を欲しい気がする。』という意味をfeel likeは持っています。
月曜日なのに今日はお休みです。これがアップされている頃は県外にいると思います。
県外に行った話はそのうちアップします。秋になり「彼女を欲しい気がする。」この頃ですね。
三連休も終わり明日から仕事だという方も多いはず。という事で短文で失礼します。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, 2, 9, com, cZ, feel, https, like, qA, Sjq, watch, www, youtube, アップ, うち, お休み, これ, パス, 三連, 事, 今日, 仕事, 休, 失礼, 彼女, 意味, 手触り, 方, 明日, 月曜日, 気, 県外, 短文, 秋, 話, 頃,
三連休も過ぎ。
2015.07.21
三連休も過ぎて今日から、お仕事の方も多いと思います。暇ぽっいようでそんなに暇な時間が取れなかった連休だった自分です。7月ももう後半です、早いもので今年も折り返し地点を超えてしまいました。自分の誕生日までには体重を落としたい気がしますが、なかなか一回ついた贅肉を落とすのは思いのほか大変だったりします。会社まで自転車通勤はやめましたが、自転車は購入しました、いままで車で行っていた場所をなるべく自転車を移動手段として活用していきたいと思っています。ダイエットって中々、痩せだすまで時間がかかるので自分としては好きではないですね。でも、なんとか頑張って痩せようと考えています。
———————————————–
まだ、直ってない・・・。
とさのうとと言うサイトが有るのですが自分が辞める前に指摘したのに直ってません・・・。
大丈夫か?
httpsで見ると型崩れで表示されています。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, お仕事, サイト, ダイエット, 三連, 三連休, 中々, 会社, 体重, 型崩れ, 場所, 後半, 折り返し地点, 早いもの, 時間, 暇ぽっいよう, 気, 移動手段, 自転車, 自転車通勤, 誕生日, 贅肉,