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

YOUTUBEに特化した掲示板は予想通り失敗?しましたが

2022.03.13

Logging

YOUTUBEに特化した掲示板は予想通り失敗?しましたが作った意味はそれなりにあったのではないかと思っています。次なるサービスの為に2つ程、ドメインを取得しましたが今の所、全然手を付けていません。ひとつのドメインは1円で購入しもう一つのドメインは980円で購入したのです。

[Official Music Video] Perfume 「Flow」

ひとつのドメインは高知県の情報をまとめるサイトに、もう一つのドメインはある程度、客が付きそうなサービスを作ろうと思っています。客が付きそうなサービスから先に作ろうと思っていた矢先に自分のリアルが忙しくなり、今まで手を付けられませんでしたが徐々に休日を使用して作り込もうと思っています。

今回の2つのサービスもYOUTUBEに特化したサービスのように失敗する確率は非常に大きいと思っています。それは何もしなかったらの話です、広告宣伝やSNSで周知すればそれなりに軌道に乗せることは出来るのではないかと思っています。

ドメインは凄く大事で、長年使用されていたドメインを買い取るとそこに付いていたユーザーをそのまま取り入れることが出来るからです。今回は金銭的理由でそれをしなかったのですが、実際どれぐらいドメインに力があるか試してみたいなと思っています。

トイウコトで告知でした。

タグ

, 2, 980, SNS, youtube, こと, サービス, サイト, それ, それなり, ドメイン, ひとつ, もう一つ, リアル, 予想, , 今回, 休日, , 使用, 取得, 周知, 大事, 失敗, , 宣伝, 広告, 情報, 意味, , , 掲示, , , 特化, 矢先, 確率, , 自分, , 購入, 軌道, , 高知県,

WEBサービス(掲示板)をデプロイ(リリース)してから、数日経過するも。

2022.02.24

Logging

おはよう御座います。
今日の朝はかなりの冷え込みです😱。

さて、数日前、WEBサービス(YOUTUBE貼り付け掲示板)をデプロイしましたが、鳴かず飛ばずのまま放置しています。要するに作ったは良いが宣伝が全然していないので使用する人が全然いない状態が続いているわけです。これを回避する方法は2つぐらいあります、一つは広告やSNSで宣伝する、2つ目は集客があったドメインを購入してそのドメインで運用するということです。

この2つの方法はありますが、自分はSNSで少し宣伝して放置しています。もともと予想通りの状態なのでこのまま放置して見ることにします。一年ぐらい放置して何も変わらないならこのサービスは廃止します。使ってくれないならば置いとく意味ないですからね。

今、違うサービスを思いついたので、今度はそちらのサービスを作っていければなって思っています、有料サービスとして作るため個人事業主の届けが必要になるかもしれません。作ったものはTwitterで宣伝するつもりでいます。値段は月額費用500円という破格の値段でサービスを提供できればなって思っています。ただ作っている最中に仕事が決まればこのサービスは世に出ずに終わってしまう可能性があります。

ともあれ、YOUTUBE貼り付け掲示板広めて頂けると有り難いです。
どうぞ、よろしくお願いいたします🙇。

タグ

2, SNS, web, youtube, かなり, こと, このまま, これ, サービス, そちら, ため, デプロイ, ドメイン, まま, リリース, , 一つ, 予想, 事業主, , , 今度, 今日, , 使用, 個人, 回避, 宣伝, 少し, 広告, 廃止, 必要, 意味, 掲示, 放置, 数日, 方法, 有料, , 状態, 経過, 自分, 購入, 運用, 集客,

新サービスをいま作っています、お披露目はさくらレンタルサーバー、Newサーバ…。

2022.02.10

Logging

今日の朝は雨がシトシトと降っていますね☔。昼からは高知県、晴れるそうです。

新サービスをいま作っています、お披露目はさくらレンタルサーバー、新サーバーがリリース後になります、いま、大枠のデザインとHTMLコードを書いています、バックエンドの部分はこれからです。

【さくらのレンタルサーバ】Let's Encrypt(無料SSL)を設定してみよう

尚、このサービスはさくらレンタルサーバーのNewサーバーで出来れば運用したいと思っています、何故なら新サーバーでは、表示速度が今までと違いかなり早くなったそうです。そしてセキュリティ面もありますから、そこらへんを心配しないで良いというのは心配しないで開発だけに没頭出来ますからね。

因みにどんなサービスかといえば、掲示板なのですが2chなどと違って、今作っている掲示板では競合が少ない分野でこれからも伸びそうな分野の掲示板です。その掲示板を開発して3月頃から運用していきたいなって思っています。リリース後にこちらでもアナウンス(報告)したいなって思っていますので、ブログチェックしてみてください。よろしくお願い致します。

タグ

2, , ch, html, new, アナウンス, いま, エンド, お披露目, かなり, コード, こちら, これ, サーバ, サーバー, サービス, さくら, セキュリティ, そこら, デザイン, バック, べん, リリース, レンタル, , 今日, 分野, 大枠, 心配, 掲示, , , 没頭, 競合, 表示, 速度, 運用, 違い, 部分, 開発, , 高知県,

お金を手に入れたワンランクアップ。

2020.07.28

Logging

クラウドでお仕事をしてお金を手に入れた。『おいらでもお金を支払ってくれる人がいるだなぁ』としみじみした。初めてのクラウドです、クラウドで申し込んでを何回か繰り返して、初めてお金をいただきました。

クラウドで働くことは非効率的な感じだけど、単価は良いよね。自分がこんぐらい時間を使って出来る仕事に対して、『これぐらいで出来ますよ』という値段を掲示し、双方の折り合いがあえば仕事が出来るシステムは『まぁいい感じ』。

これは副業という面ではとても良いかなと思いますが、本業というのでは非効率的な所があるかなと思います。なぜならブッキングしないような感じで仕事を請け負うということが結構難しい。

あの仕事もこの仕事も出来るけど…全部、一斉に依頼が来ると大変かと思います。なので例えば失業手当がもらえなくなったけど、仕事が見つからない場合などはクラウドでお仕事をする場合は悪くはないかもなと思います。

但し、ある一定の技術者じゃないと稼げないと思います。おいらみたいな感じなら何とかなると思います。自分の技術はどんなものか知らないけれど・・・。

タグ

アップ, おいら, お仕事, お金, クラウド, こと, これ, これぐらい, こん, システム, ブッキング, ランク, ワン, 一定, , 仕事, 但し, 何回か, 依頼, 値段, 全部, 初めて, 副業, 単価, 双方, 場合, 大変, 失業, 感じ, , , 手当, 技術者, 掲示, 時間, 本業, 自分, ,

ワードプレス電光掲示板プラグインを作りました。

2019.12.05

Logging

電光掲示板(お知らせ)のプラグイン取扱に関して記載します。

プラグインに関してはワードプレス5.2以降を推奨としテーマファイル(外観)のheader.phpのbody直下に下記の記述が存在しない場合は追加記述を
お願いいたします。

<?php wp_body_open();?>

尚、プラグインのソースコードはご自由に変更頂き二次配布も構いませんが
ひとつ注意事項があります。参照した記事にリンクを貼ってください、
なお、事前の連絡等入りません。

電光掲示板(お知らせ)のソースコードは下記になります。
現在、テキストはHTMLタグを許していますので、いろいろと自由に
変更することが可能かと思います。

ちなみにこういった電光掲示板みたいな流れる仕様のコードは
インターネットの初期のころは多く見られましたが
このごろは全然、見なくなりましたね。。。

CSSの記述に関してはとくめいさんの記述を使用させて頂きました。
https://creatorclip.info/2014/06/css3-electric-bulletin-board/

とくめいさんも同じようなことを記事に記載しておりますが
自分もそのように感じました。

とくめいさんへ断りもなく使用してすみません、
Twitterで連絡しようかなと思ったのですが、それもなんだかと思い
勝手ながらこのような手段を取りました。

お知らせ(電光掲示板)のダウンロードは下記になります。
下記のファイルを解凍しワードプレスのプラグイン領域にフォルダごと
アップロードしプラグインを有効にするとご使用頂けます。

https://zip358.com/plugin/Z-Electric-bulletin-board.zip

<?php
/*
Plugin Name: Z-Electric-bulletin-board
Plugin URI: https://zip358.com/plugin/Z-Electric-bulletin-board.zip
Description: お知らせ
Author: taoka toshiaki
Version: 1.0
Author URI: https://zip358.com/
*/
add_action( 'wp_head', function() {
    $color = get_option('ZEBB_color')?get_option('ZEBB_color'):"ffffff";
    $cssdata ="
    <style>
        /* =====================
            電光掲示板
        ======================= */
        .ledText {
            overflow: hidden;
            position: relative;
            padding:5px 0;
            color: #$color;
            font-size: 60px;
            font-weight: bold;
            background: #333333;
        }
        /* CSS3グラデーションでドット感を出す */
        .ledText:after {
            content: ' ';
            display: block;
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background-image: linear-gradient(#0a0600 1px, transparent 0px), linear-gradient(0, #0a0600 1px, transparent 1px);
            background-image: -webkit-linear-gradient(#0a0600 1px, transparent 0px), -webkit-linear-gradient(0, #0a0600 1px, transparent 1px);
            background-size: 2px 2px;
            z-index: 10;
        }
        /* CSS3アニメーションでスクロール */
        .ledText span {
            display: inline-block;
            white-space: nowrap;
            padding-left: 100%;
            -webkit-animation-name: marquee;
            -webkit-animation-timing-function: linear;
            -webkit-animation-iteration-count: infinite;
            -webkit-animation-duration: 15s;
            -moz-animation-name: marquee;
            -moz-animation-timing-function: linear;
            -moz-animation-iteration-count: infinite;
            -moz-animation-duration: 15s;
            animation-name: marquee;
            animation-timing-function: linear;
            animation-iteration-count: infinite;
            animation-duration: 15s;
        }
        @-webkit-keyframes marquee {
        from   { -webkit-transform: translate(0%);}
        99%,to { -webkit-transform: translate(-100%);}
        }
        @-moz-keyframes marquee {
        from   { -moz-transform: translate(0%);}
        99%,to { -moz-transform: translate(-100%);}
        }
        @keyframes marquee {
        from   { transform: translate(0%);}
        99%,to { transform: translate(-100%);}
        }
    </style>
    ";
    print $cssdata;
 });
add_action("wp_body_open",function(){
    $text = get_option('ZEBB_text')?get_option('ZEBB_text'):"";
    if($text)print '<p class="ledText"><span>'.$text.'</span></p>';
});
add_action('admin_menu','Z_Electric_bulletin_board_set');
function Z_Electric_bulletin_board_set(){
	add_options_page(
		'zip358.com:プラグイン',
		'電光掲示板設定',
		'administrator',
		'Z_Electric_bulletin_board',
		function(){
            if(isset($_POST["ZEBB_color"]) or isset($_POST["ZEBB_text"])){
                $color = preg_match("/[a-zA-Z0-9]*/",$_POST["ZEBB_color"])?$_POST["ZEBB_color"]:"ffffff";
                update_option('ZEBB_color', wp_unslash($color));
                $text = $_POST["ZEBB_text"];
                update_option('ZEBB_text', wp_unslash($text));
            }
            ?>
            <form method="post" action="">
                <h2>電光掲示板設定</h2>
                color code #<input type="text" style="width:350px" name="ZEBB_color" value="<?=get_option('ZEBB_color')?get_option('ZEBB_color'):""?>" placeholder="f7f7f7"><br>
                text <input type="text" style="width:350px" name="ZEBB_text" value="<?=get_option('ZEBB_text')?get_option('ZEBB_text'):""?>" placeholder="文字を記入してください"><br>
                テキスト文字を未入力にすると電光掲示板が表示されません
                <?php submit_button(); ?>
            </form>
            <?php
        }
	);
}

タグ

5.2, body, css, gt, header, html, lt, open, php, wp, いろいろ, インターネット, お知らせ, お願い, コード, こと, ころ, ごろ, ソース, タグ, テーマ, テキスト, トク, ひとつ, ファイル, プラグイン, プレス, メイ, リンク, ワード, 下記, 事前, 事項, , 仕様, 使用, 初期, 参照, 取扱, 可能, 場合, 変更, 外観, 存在, 推奨, 掲示, 注意, 現在, 直下, 自由, 記事, 記載, 記述, 追加, 連絡, 配布, 電光,

難しいの基準(プログラム初心者へ)

2019.11.15

Logging

難しいの基準、プログラムが難しいと思っている人がいますが
そんなに難しいものではないです。

つい最近、人工知能のさわりを試行錯誤しながら
行ってみました。Aという文章から新たな文章を生成するというものです。
機械学習の部分はあらかじめ学習済みのモデルを取ってきて
試してみたのです。なんとか文章を生成する流れまで出来ました。

プログラムが難しいひとは、参考書をみて何だか意味がわからないと
思っているひとが殆どだと思います。
まず、参考書を読むのをやめて作りたいもののプログラム言語が何か
そして作りたい機能はなにか考えて、ググりましょう。

例えば【PHP 掲示板 作り方】などと検索すると作り方の方法が
ヒットします。最初はそのソースコードをそのままコピーして
動作するところまで試してみましょう。

次に動作するところまで出来たら、そのソースコードを
編集してみましょう。そうすることでどういう処理なのか理解できます。

理解できるようになったら参考書を開いてみましょう。
何となく参考書の意味が理解できるようになるはずです。
最初から参考書を理解できるタイプと理解できないタイプがいると思います。
理解できないタイプはググって覚えるという方法で
プログラムを身につけるほうが効率的です。

タグ

php, コード, こと, コピー, さわり, ソース, つい, ところ, ヒット, ひと, ひとは, プログラム, モデル, もの, , 人工, 作り方, 処理, 初心者, 動作, 参考書, 基準, 学習, 意味, 掲示, 文章, 方法, 最初, 最近, 検索, 機械, 機能, , 殆ど, 理解, 生成, 知能, 編集, 言語, 試行錯誤, 部分,