Sqliteで作った簡易掲示板のコードを配布致します。#php #code

2022.09.20

Logging

おはようございます。台風は過ぎ去りましたがせっかくの三連休が残念です💦。

今日は先日、Sqliteを使用して簡易掲示板を作ってみましたのでコードを配布致します、尚、PHP8の環境下で動作させています(PHP7系でも動作すると思います)。

Sqliteってnow()関数がなかったりだとか、Deleteする時に、noカラムを昇順しlimitを使用して削除出来ないだとか、いろいろとMysqlとは違う所があり、面倒だなと思いながらコードを書きました、尚、SqliteはWebサーバーの階層に置かないように、置いても良いですが・・・。そのままの状態だと誰でもダウンロードが可能になってしまいますのでご注意ください。自分は地下に眠らしています😅。

一応、二重投稿防止の為に20秒経過しないと再投稿出来ないようにしています😌。トライしていない事は禁止ワード等がありません🤔。つけようと思ったのですがまぁ良いかなと、、、。

動作している環境のリンクはこちら。

https://reborn9.sakura.ne.jp/

軸となる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;
}

配布コードはこちらです。

タグ

20, 7, 8, Code, Delete, LIMIT, MYSQL, no, Now, php, Sqlite, web, いろいろ, カラム, コード, ご注意, サーバー, せっかく, そのまま, ダウンロード, トライ, ワード, 三連, , , 今日, , 使用, 先日, 削除, 動作, 可能, 台風, 地下, , 投稿, 掲示, 昇順, , 残念, , 状態, 環境, 禁止, 簡易, 経過, 自分, , , 配布, 関数, 防止, 階層, 面倒,

コードを見れば大体の技術レベルが分かるは本当?しかも、性格も分かる場合がある。

2022.02.07

Logging

おはようございます。今日の朝も寒いですね。。。

朝からcode.orgの動画を見ていたら日本もアメリカもITエンジニアの割合はあまり変わりないみたいな事を知りました、そしてアメリカでも子供たちのなりたい職業1位でもないみたいです。

さて、コードを見れば大体の技術レベルが分かるは本当?しかも性格も分かる場合があるですが、ソースコードを見ると其の人の技術がわかり、変数の名前付けとかで性格もある程度分かってしまったりします。そしてバージョン管理、ファイル管理で仕事に対する姿勢までもが分かってしまったりします。

Computer Science is Changing Everything

なので・・・日頃からご注意ください。自分の場合、Githubのコメントなどを見るとこの人は適当な人なんだなぁって事が分かってしまうかもしれません。唯、仕事に対する姿勢は少し違うかなっていうのはあります。

仕事になるとファイル管理やバージョン管理もこの頃はちゃんとするようになりました。やはり整理整頓は結構大事な要素です。ファイルがどこにいったんだろうとか検索しないでも良いように管理することは大切なことです。昔はごちゃごちゃなファイル管理をしていましたけど(反省)😣。

因みに私生活で使用するパソコンのフォルダ整理は全然ダメダメですね。整理しようと思っているのだけどフォルダやファイル数が多くて大変な感じです(負の遺産が多いです)。

タグ

, Code, github, IT, org, アメリカ, エンジニア, コード, コメント, ご注意, ソース, バージョン, ファイル, レベル, , , 今日, 仕事, 割合, 動画, 名前, 場合, 変数, 大体, 姿勢, 子供, 少し, 性格, 技術, 日本, 日頃, , 本当, 管理, 職業, 自分, 適当, ,

ビットコインで自動売買システム作っている人がいた、それもオープンソースで!?

2021.07.08

Logging

ビットコインで自動売買システム作っている人がいた、それもオープンソースで提供している人がいました。Qiitaというサイトでアルゴリズム(考え方)を公開していてますが、プログラミングが分かる中級者ぐらいの人は見ればtani まーきぃさんの書いている意図が理解出来ると思います。ただ、これで仮想通貨わらしべ長者になれるかどうか分かりません(この記事を書いているときはパート1の動画しかないので・・・・)。

【仮想通貨わらしべ長者大作戦】最高利益率120%超~pythonで自動売買システム構築~報告①β版始動

つい最近、ネットでイケハヤさんオススメの仮想通貨買ったら明くる日にどん底まで転落したユーザーが多くでてYahoo!のニュース記事になっていたみたいです(尚、イケハヤさんは逃げ切ったので損は出てないみたい)。投資や投機系は自己責任の分野ですので、そのお金はないものと思って運用しないと大変なことになります。特にリバレッジをかけて運用していると痛い目にあいますのでご注意を自分は現価で運用するのが、まだリスクは少ないと思います。

タグ

, qiita, tani, Yahoo, アルゴリズム, イケハヤ, オープン, おすすめ, お金, こと, これ, ご注意, サイト, システム, ソース, それ, つい, とき, どん底, ニュース, ネット, パート, ビットコイン, プログラミング, もの, ユーザー, リス, リバレッジ, わらしべ, 中級者, , 仮想, 公開, 分野, 動画, 売買, 大変, 意図, 投機, 投資, 提供, , 明くる日, 最近, 現価, 理解, , 考え方, 自分, 自動, 自己, 記事, 責任, 転落, 通貨, 運用, 長者,

テストサーバーを適当に立ち上げる。

2020.06.02

Logging

テストサーバーを適当に立ち上げる方法を録画してみました。
最初の動画はselinux 無効などはしていませんが、それをしないと誤作動というか上手く動かなくなるのでご注意を!!

https://www.youtube.com/watch?v=Rn1ozwXa_eM

ちなみにファイヤーフォールの設定などはググりながらお勉強ください。動画ではそこらへんもググりながら設定しています。あんまりサーバー系のコマンド覚えていないだよね。サーバーの考え方がなんとなく頭に入っている程度です。

ちなみにこれをローカルサーバーじゃなくてVPSでサーバーとして公開するならばWAF(わふ)とかその他、いろいろな設定をすることをオススメします。尚、さくらレンタルサーバーのブログはいいよ!?

https://www.youtube.com/watch?v=TZeRZ7a3Jds

尚、cgi-binでPHPのバージョンを分ける動画は、ちょっと見るだけでは出来ないかもしれませんが・・・ヒントを2、3書いときますね、あとコマンドも例として記載します。

まずcentOS8の最小インストールでPHP7.4系を使う場合は鬼車(おにぐるま)が入っていないので入れなければなりません。そんな具合にインストールしていないものはガンガン入れていこうぜという具合です(*´?`*)

dnf --enablerepo=PowerTools install oniguruma-devel

これを全部入れることができればPHPの違うバージョンでも何とかなりますよ。ちなみにPHP5系とかは下記のようなものを入れるのであって、同じじゃないよ。同じものも有るけれど記述が違うので注意してくださいね。過去のものはググれば結構表示されます。

./configure \
--prefix=/var/www/php-7.4.6  \
--with-config-file-path=/var/www/php-7.4.6 \
--with-config-file-scan-dir=/var/www/php-7.4.6 \
--with-zip \
--enable-gd \
--with-jpeg \
--with-xpm \
--with-zlib \
--with-gettext \
--enable-bcmath \
--enable-sockets \
--enable-opcache \
--enable-exif \
--with-curl \
--with-bz2 \
--enable-calendar \
--enable-inline-optimization \
--with-expat \
--enable-mbstring \
--enable-mbregex \
--with-freetype \
--with-openssl \
--with-mysqli \
--with-pdo-mysql \
--with-mysql-sock=/var/lib/mysql/mysql.sock

最後にcgi-binってインストールしたPHPのphp-cgiを参照しているだけです。シンボリックリンクで!!!

あとは・・・。
Apacheグールプにオリジナルのユーザーを追加してあげて!!。尚、最初の動画はrootで動かしているだけどね。基本的にrootではなくユーザー追加してそれをApacheグールプ追加するのさってヒントも書いときますね。

タグ

2, , 7.4, 8, centOS, cgi-bin, php, selinux, VPS, WAF, いろいろ, インストール, おすすめ, お勉強, こと, コマンド, これ, ご注意, サーバー, さくら, そこら, その他, それ, テスト, バージョン, ヒント, , ファイヤー, フォール, ブログ, べん, レンタル, ローカル, 使, , 公開, 動画, 方法, 最初, 最小, 無効, 程度, 考え方, 記載, 設定, 誤作動, 適当, 録画, ,

不老不死研究をしている機関

2020.05.15

Logging

たまには、こういうネタも?

キャラコという企業は老化やそれに伴う疾病を防止することに取り組んでいる。この企業、グーグルの機関であり、真剣に不老不死の研究を行っている。まずはアンチエイジングだけど、最終目標は不老不死だから・・・。

不老不死になるというのは、いまはまだ難しいかもしれないけれど、老化を遅らすのは可能かなと思っています。何故なら20代ではわからないだろうけど、30代、40代になるとよく分かるかと思います。同じ40代、30代を並べると老化している人とそうではない人とがよく分かるのです。これは生活習慣による老化や遺伝的に老化が早いひとがいるためです。みんな同じ様に老化すると思って20代を過ごしてしまうと30代、40代、50代になると差が広がっていきます。

いま、20代、30代の方、ご注意くださいね。ただ年相応に見られないと苦労することもありますが、若くいるということは最終的にはお得感があります。自分は若いまま長く生きたいと感じます。もしキャラコが老化防止する薬や若返りの薬を開発したのなら、間違いなくそれを購入します。

最後に興味がある方はどうぞ(リンクを貼っときます。)

https://www.calicolabs.com/

タグ

20, 30, 40, 50, いま, エイジング, お得感, キャラコ, グーグル, こと, これ, ご注意, それ, たま, ため, ネタ, ひと, まま, みんな, 不老不死, , 企業, 可能, , 年相応, , 最終, 機関, 生活, 疾病, 目標, 真剣, 研究, 習慣, 老化, 自分, 苦労, 防止,

プロバイダ料金が下がりますと言う甘い罠。

2015.07.24

Logging


プロバイダ料金が下がりますと言う甘い罠にはご注意を。以前も記載したと思いますが、またNTTを名乗る悪徳な業者が電話をかけてきましたので手口を公開します。
?まず、NTTを名乗りプロバイダ料金が安くなりますよという話をしてきます。
?プロバイダ契約の為、住所などを聞いてきます。
?契約が終わると別業者(プロバイダ)から電話がかかってきます。
?ネット上からあるソフトをダンロードしてくださいと求められますがしてはいけません。
(遠隔操作のためとか言いますがダウンロードしてはいけません。)
?後日、契約書が届きますがクーリングオフが可能なので契約破棄してください。
こういう怪しげな電話がかかってきたら、電話番号と担当の名前を控えてください。(録音できるとのちのち有利になります。)
 
 

タグ

NTT, クーリングオフ, ご注意, ダン, ネット上, のちのち, プロバイダ契約, プロバイダ料金, 住所, 別業者, 名前, 契約書, 後日, 手口, 担当, 甘い罠, 遠隔操作, 電話, 電話番号,

ご注意を:オレオレ詐欺勧誘{若者編}。

2014.11.22

Logging

本日、プロバイダ勧誘の電話がかかってきました。内容はこんな感じですプロバイダを変更すると中途解約なしに1200円で弊社のプロバイダに移行出来るというような内容でした。プロバイダの切り着替えもリモートを使用し簡単にできるというようなうたい文句通りで、10分後電話があり、リモート接続のためにリモート接続のためのソフトが必要だということで、DL(ダウンロード)してから初めてくさださいとのことでしたが、実際、サイトを訪問すると、なんだか怪しげなサイトになっていましたので結局、お断りしました。断った理由は、信用のできる会社だった場合、基本的にリモート接続(遠隔操作)は行いません。なので、こういうプロバイダ勧誘の会社から電話がかかってきた場合、お断りしたほうが良いです、尚、会社名と電話番号は聴いておくことが大事になります。

 
 

タグ

, うたい文句通り, オレオレ詐欺勧誘, ご注意, サイト, ダウンロード, プロバイダ, プロバイダ勧誘, リモート接続, 中途解約, 会社, 会社名, 信用, 内容, 切り着替え, 実際, 弊社, 理由, 若者編, 遠隔操作, 電話番号,

映画:エンターテイメント作の王道的な作品:パイレーツオブカリビアンシリーズ

2014.09.22

Logging

エンターテイメントの王道的な作品といえば、パイレーツオブカリビアンかなと思っています。このパイレーツオブカリビアンのシリーズは、ほぼ外れなしかなと思います。映画館でみると迫力があって一番楽しめるのですが、テレビで見ても迫力などは欠けるものの内容がしっかりしているので楽しめる映画だと思います。
ちなみに漫画、ワンピース好きなら確実にパイレーツオブカリビンアみるとハマること間違いなしかなと思います(海賊映画なので)。まだ、パイレーツオブカリビアン見たことない方は是非!!
※尚、この映画はエンターテイメントな作品なので感動などはあまりしませんご注意を。
追記:パイレーツオブカリビアン5は2017年7月7日に公開予定らしいです→全米公開予定(日本公開日未定)。

タグ

2017年7月7日, エンターテイメント, エンターテイメント作, ご注意, テレビ, パイレーツオブカリビアン, パイレーツオブカリビアン5, パイレーツオブカリビンア, ワンピース好き, 作品, 全米公開予定, 内容, 始末, 感動, 日本公開日未定, 映画館, 海賊映画, 漫画, 王道的, 迫力, 追記,