例外処理をスローする奴(throw=飛ばす?) #php

2023.12.09

Logging

おはようございます、久しぶりにちょっとした技術のお話です。トライキャッチ(try-catch)した後にたまにスローしているコードとか見かけると思います。大体、エラーメッセージとか出力していると思いますが、これ独自のクラスなどに変更することが可能なんですよね。

なので、こんな事が出来るわけです、コケたら違う処理を行ってリカバリみたいな事やコケた値を拾ってバックアップするとか、いろいろな事が出来てしまいます。

PHPの公式でも例文を書いていますが、アレだとなんかわからない方もいると思いますので、もっと簡略化した例文コードを書いてみました。このコードを実行するとゼロによる除算エラーになりますが、トライキャッチ(try-catch)の中に書いているのでエラーにならずcatchへ処理は推移します。そしてスローでオリジナルのクラスを呼び出しているわけです。

<?php
    class errors{
        public function __construct($msg,$x) {
            print $msg;
            print $x;
        }
    }
    try {
        $x=5;
        $a = $x/0;
        //code...
    } catch (\Throwable $th) {
        throw new errors($th->getMessage(),$x);
    }

トライキャッチの良いところはエラーにならないところですが、エラーにならない事が困り物になる場合もあるので注意が必要です。そこは現場の諸先輩方の話を聞いて対応したほうが良さげかと思います。

明日へ続く。

タグ

$msg, $th, $th-&gt, catch, class errors, construct, getMessage, lt, php, print, public function, throw new errors, Throwable, try, try-catch, スロー, リカバリ, 例文, 除算エラー,

オーバーライドとは何なのか。それは。

2023.11.27

Logging

おはよう御座います、もう20年前になるのかな駆け出しのエンジニアだった頃の話。そのころ、オブジェクト指向が何なのかなんてことも知らないのに粋がっていました。その事を思い出すと恥ずかしいばかりです。その駆け出しのエンジニアの頃にオブジェクト指向のことをどうしても勉強しないといけなくて参考書を買ったのは良いのだけど専門用語が多くてついて行けなかった、そんな記憶があります。今ではchatGPTという何でも適当にだいたい正しそうな回答してくれる優しくてひねくれ者のツールがあるので、本当に良いなって思います。

さて、オーバーライドとは何なのかという事ですがchatGPTよりもっと要約した回答を書くと継承クラスの上書きです。これでもチンプンカンプンな人に例文を書いてみました。これで分からない方は何かを諦めた方が良いかも知れません。

<?php
//testClass.php
trait testClass {
    public function Hello(){
        return 'Hello';
    }
}
<?php
//test.php
require './testClass.php';
class test1{
    use testClass;
    public function run (){
        print $this->Hello().PHP_EOL;
    }
}
class test2{
    use testClass;
    protected function Hello(){
        return 'Good night';
    }
    public function run (){
        print $this->Hello().PHP_EOL;
    }
}

(new test1)->run();
(new test2)->run();

この2つのファイル(コード)を保存してtest.php実行してみてください。そうするとよく分かると思います。ちなみに実行結果はこの様になります。
https://zip358.com/tool/demo79/

明日へ続く。

タグ

ChatGPT, gt, gt;Hello, lt, php, PHP_EOL, print, return, run, test.php require, testClass, testClass.php trait, this, use testClass, オーバーライド, オブジェクト指向, チンプンカンプン, ひねくれ者, 上書き, 例文,

アイキャッチ画像を表示するように変更。PHPコード

2023.11.25

Logging

おはよう御座います、先日アイキャッチ画像を表示するように変更しました、PHPコードはこんな感じです。Bootstrapでレスポンシブ画像に対応しています。アイキャッチ画像を表示するようにした訳はデザインも変えたのでアイキャッチいれても変じゃないかなって思ったことです。そういう訳で先日の休みに対応しましたというのが経緯(いきさつ)です。

            <div>
              <?php
              print get_the_post_thumbnail_url() ? '<img src="' . get_the_post_thumbnail_url() . '" class="img-fluid">' : '';
              ?>
            </div>

そんな休みの日にこんなタイムラインが流れてきました、こんなのが浸透したら商売が破綻すると思う人がいると思うけれども、たぶん今の生成AIで凄いことが出来るのに殆んどの人が使えていない。これが浸透するのにかなり月日がかかると思います。一般の人に浸透するにはラグが存在するので、それまでにどうすれば良いか対処出来ると思います。ちなみにポストが消えてしまった時のために上のポストの内容を解説しておくと、画像(デザイン)からフロントエンドエンジニアやデザインナーが行うHTML作成作業を生成AIが変わって行ってくれる。今の所、完璧なコードが生成される訳ではないので手直しが必要ですが、いずれは必要なくなることは時間の問題という話なんだけど、実際ひとが思っている未来の斜め上を行くのが未来かと思います。なので落胆はせずに上手く取り入れていく方が賢明かなって自分は思います。

明日へ続く。

タグ

Bootstrap, class, div&gt, get_the_post_thumbnail_url, gt, img src, img-fluid&quot, lt, php, print get_the_post_thumbnail_url, quot, アイキャッチ, デザインナー, ラク, レスポンシブ画像, 商売, 手直し, 生成AI, 経緯, 落胆,

LaravelのAPIを作っていたので

2023.10.12

Logging

おはようございます。先日の休みにLaravelのAPIを作っていました。出来ること出来ないことが分かったので、メモとして残しときます。敢えていうと恐らくそうだろうという感じです。ではまずAPIを使用したい場合はweb.phpではなくてapi.phpを使用しないとAPIは機能しない。

APIにはcros.phpの設定は関係ないAPIをアクセス制御したい場合は、認証式にしないといけない。そうではない場合、どこからでも参照は可能になる

参照先サイトが分かれば何とかなると思っていたけれども、SSL化したサイトからAPI叩かれたら参照先、分からないよねって話。ミドルウェアでIPから制御する方法はあるので認証式にしたくない場合はそちらの方法で何とかしてください。

自分はphpのcrulで制御するので、基本、ワイヤーシャークとか入れてないとエンドポイントが分からないので、認証式にしないで運用する方向で調整中です。

基本的にAPI出来たので、VPSサーバーで動いているWEBサービスも今月中に移動します。まだVPSサーバーは一年契約なので起動していますが、延長契約は結ばずダウングレードしたVPSサーバーと新たに契約を結ぶつもりでいます。

タグ

API, api.php, cros.php, crul, Laravel, php, SSL化, VPSサーバー, web.php, Webサービス, エンドポイント, ミドルウェア, メモ, ワイヤーシャーク, 休み, 参照, 参照先, 延長契約, 方向, 認証式,

laravelの技術ネタ。こういうのを有ることを。

2023.10.03

Logging

おはようございます、laravelの技術ネタです。Laravelにはこういうメソッドが用意されています。下記のリンクを参照ください。

https://readouble.com/laravel/8.x/ja/collections.html

こんな機能が有ることを覚えて置くと良いです。なので、わざわざ自分でコードを書かなくても便利な機能があります。覚えて置くと良いです。

この頃の学びはPHPに文字の置き換えする事。いやいや文字の置き換えなんて初歩の初歩でしょって思うかも知れません。自分もそう思っていましたけど、PHPにはいろいろな文字の置き換えができるメソッドがあります。その中でこれは便利だなっていう文字の置き換えはこれ!!

文字の位置を指定して、その部分だけを文字を置き換えることが出来るメソッドです。

substr_replace

明日へつづく

タグ

Laravel, php, substr_replace, いやいや文字, コード, メソッド, リンク, わざわざ自分, 下記, 位置, 初歩, 技術ネタ, 文字, 機能, 自分, 部分,

Laravelでユニットテストをする中Factoryは欠かせない。

2023.08.11

Logging

おはようございます、Laravelでユニットテストをする中Factoryは欠かせない存在だと思っています。毎回、データを初期化していると処理が重くなってしまいます。ユニットテストが多くなるに連れて時間がかかるのは仕方がないのかなって思いますが、極力時間短縮したいと思うのは普通のことだと思います(github上にpull requestしphpstan(静的解析ツール)やphpunit(ユニットテスト)を行っていく中で結構時間がかかるのはユニットテストだと思います。)。

恐らくユニットテストでデーターベースの初期化をしない事が良いだろうと思うようになってきました。そんな中で役に立つのがFactoryです。これを使用することで次のテストに影響を与えないみたいなんですね。なので、この頃はFactoryを使用しています。

Factoryは下記のCommandで生成することが出来ます。

php artisan make:factory filename

仕様の仕方はこんな感じになります💁

<?php
$user = User::factory()->make([
 'username'=>'test',
 'password'=>'testpass',
]);
print $user->username;

タグ

-Command, Factory, factory filename, github上, gt, gt;username, Laravel, lt, php, php artisan make, phpunit, print, pull requestしphpstan, user, この頃, データーベース, ユニットテスト, 中Factory,

DockerFileを作ってみたよ。Xdebug not Fund

2023.07.20

Logging

おはようございます、DockerFileを作ってみたよ。アパッチとPHP、Xdebugをインストール出来るDockerFileです。困ったちゃんになったのは「docker-php-ext-enable」という部分でCommandがないよって言って弾かれることでしたが、ここをググってググってを繰り返して答えが分かりました。

From が間違っていたのです。大体のサイトはDockerにXdebugをインストールする部分を強調してかいているので上手くインストールすることが出来なかったです。恐らくそんな事は当たり前に知っておく事なのかもしれませんがズブの素人には分かりづらかったです。

FROM almalinux:latest
RUN yum -y install httpd
RUN yum -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
RUN yum -y module switch-to php:8.1
RUN yum -y install php php-fpm php-gd php-mbstring php-mysqlnd php-pdo php-pear php-pgsql php-devel php-xdebug php-cli
FROM php:8.1-cli
RUN pecl install xdebug-3.2.1 && docker-php-ext-enable xdebug

下記のDockerFileを作りymalと結びつけ下記のCommandを打てばインストール可能になります。因みにPHPのモジュールはお好みに合わして追加してください。

 docker-compose up -d --build

タグ

-Command, d --build, docker, docker-compose up, docker-php-ext-enable, docker-php-ext-enable xdebug, dockerfile, from, FROM almalinux, latest RUN, php, RUN yum, xdebug, y install httpd RUN, y install php php-fpm php-gd php-mbstring php-mysqlnd php-pdo php-pear php-pgsql php-devel php-xdebug php-cli FROM php, yum, アパッチ, ズブ, モジュール, 作りymal,

I mutter using laravel’s schedule.

2023.06.23

Logging


Good morning! These days, I’ve been working on migrating the parts that used the twitteroauth library to Laravel. I think it was a good decision to migrate because it made it easier to incorporate new features. I wish I had initially started with Laravel for this.

Here are some technical hints, but you should be able to find more detailed methods by searching online:

  1. Install twitteroauth in Laravel’s vendor directory.
  2. Create a job using the command php artisan make:job YourPreferredName (e.g., ProcessPodcast).
  3. Register the job in the scheduler.
  4. Configure cron (in my case, * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1).

With this setup, it will tweet at the specified time. I used to be able to retweet, but it seems my Twitter bot has been flagged, and now I can only tweet. So I’m doing my best with just tweeting.

Concerns about Twitter: I can’t help but think that it’s only a matter of time before either Jack Dorsey leaves or Twitter gets acquired and disappears. Even with a new CEO, I don’t expect things to improve immediately, and as long as Jack Dorsey remains, I believe it will continue to be problematic. Twitter has lost some of its appeal for individual developers who can no longer enjoy developing on the platform. The various services that were created using Twitter’s API in the past were possible because Twitter was developer-friendly.

タグ

artisan schedule, CEO, Configure cron, created using Twitter, dev, gt, hints, I've been working, Install twitteroauth, job YourPreferredName, library to Laravel, past were possible because Twitter was developer-friendly, path, php, Platform, run, setup, that were, These days, vendor directory,

配列を連想配列に置き換えるPHPの関数。便利すぎる😌

2023.06.11

Logging

おはようございます。配列を連想配列に置き換えるPHPの関数。便利すぎます。この関数を知ったのはつい最近の話ですが、こんな関数があるのだと知っているのと知らないとではコードの書きようが違うわけです、実際、PHPの関数を全部知っているわけではないのですが公式のドキュメントを見るといろいろな関数が存在することが分かります。

自分はあまり関数を知っているわけではないので余計なコードを書いている可能性があります、なので余計なコードを書かずに純粋な関数を使用してシンプルなコードがかければなと思います。

<?php
    var_dump(array_combine([1,2,3],["one","two","three"]));

そんな自分もこの頃はPHP公式サイトのドキュメントを見ることも以前よりは増えてきています。昔は公式サイトで調べるよりググって調べることが多かったのですが、この頃は公式サイトと検索のパラメーターであるsite:URL+キーワードを使用して調べることを心がけています。あとはchatGPTを使用します。

調べるときの手順にchatGPTという選択肢があるのですが、正解ばかりの回答ではないのでやはり今の段階では補助ツールですね。いまのAIの役割は面倒くさいと思われる組み合わせのパータンを全て網羅してくれて思いがけない答えを導き出せるという所にあると自分は思っています。なので、現段階では人の回答に答えるのにはあまり向いていないのかもしれないですね。

ともあれ、知らないより知っていたほうが良い業界なので勉強ですね。

タグ

AI, array_combine, ChatGPT, lt, php, quot;one&quot, quot;three&quot, quot;two&quot, site, var_dump, ドキュメント, パータン, パラメーター, 手順, 正解, 組み合わせ, 連想配列, 配列, 関数,

ContactForm7で現在ページのURLを送る方法。 #カスタマイズ

2023.05.27

Logging

おはようございます。ContactForm7で現在ページのURLを送る方法です、全ての記事の下にお問い合わせフォームを設置している人はあまりいないかもしれないけれど。そのあまりいない人の一人です😂。

記事の下にショートコードを設置するにはプラグインを自作するか、テンプレート内に埋め込むかどちらかだと思います。自分は前者のプラグインを自作してショートコードを埋め込んでいます。

ショートコードを埋め込むコードはこんなコードです。

<?php
do_shortcode('[contact-form-7 id="XXXX" title="comment"]')

これで全記事にショートコードを埋め込むことが可能ですがこれだけでは動きません。こんな感じのプラグインを作ってみてください。プラグインの設置方法などはググって下さい。

<?php
/*
  Plugin Name: comment-add
  Plugin URI:
  Description: 記事の下にアドセンス広告などを貼り付けるのに使用
  Version: 1.0.0
  Author: @zip358com
  Author URI: https://www.zip358.com
 */


function comment_add($content)
{
    if (is_single() && 'post' == get_post_type()) {
        $content = $content.do_shortcode('[contact-form-7 id="xxxx" title="comment"]');
        return $content;
    } else {
        return $content;
    }
}
add_filter('the_content', 'comment_add');
remove_filter('the_content', 'wpautop');

これだけでは、どのページから問い合わせしたのか分からないので、名前などの入力欄以外に入力欄を設置します。次に設置したそのNoを控えて下さい。

<script>
//Contact Form 7 現在ページのURL
if(document.querySelectorAll("[name='text-564']")){
    [...document.querySelectorAll("[name='text-564']")].forEach(elm=>{
        elm.setAttribute("type","hidden");
        elm.value = decodeURIComponent(location.href);
    });
}
</script>

上記のコードを</body>タグ直前に設置してください。設置後、text-564を控えたNoに変更シテクダサイこれで設置が完了です☹。

⚠ContactForm7のメール送信欄にも控えたNoを設置してください。これで完了です!!
最後に送信のご確認を忘れずに😐。

タグ

add_filter, body, comment-add, decodeURIComponent, description, document.querySelectorAll, elm, else, foreach, hidden&quot, lt, php, php do_shortcode, quot, remove_filter, return, setAttribute, title, Version, wpautop,

php:トレイトって言うよりclassの中でuseを使用。

2023.05.19

Logging

おはようございます、php:トレイトって言うよりclassの中でuseを使用する方法って言った方がわかり易いのかも知れません。詳しい説明は公式を参照して下さい。コード例とtraitの説明を書いときます。

トレイトは、PHPのようなプログラミング言語でコードを再利用するための仕組みのひとつです。通常、プログラムではクラスを使ってコードを組み立てますが、トレイトを使うことで、異なるクラスに属するメソッドのグループを独立したクラスとして再利用することができます。これにより、単一継承という制限を緩和することができます。トレイトを使うことで、多重継承やMixinといった問題を回避することもできます。

トレイトはクラスと似ていますが、トレイトは単に機能をまとめるためのものです。トレイト自体のインスタンスを作成することはできません。トレイトを使うことで、従来の継承に機能を追加するだけでなく、クラスのメンバーを水平方向に追加することもできます。つまり、継承しなくてもクラスに新しい機能を追加することができるようになります。

実行サンプル=>https://zip358.com/tool/demo75/

<?php
require_once "hello/hello_class.php";

use hello\Hello;

class Test
{
    use Hello;
    public function main()
    {
        print("-goodbye");
    }
}

(new Test())->main();
<?php

namespace hello;

trait Hello
{
    public function __construct()
    {
        print("Hello");
    }
}

タグ

class, construct, goodbye&quot, gt, lt, Mixin, namespace hello, php, php require_once, print, quot, quot;hello, quot;Hello&quot, trait, trait Hello, use, use helloHello, トレイト, トレイト自体, 単一継承,

ワードプレスのブロックテーマの位置づけと手順書リンク。

2023.05.11

Logging

おはようございます、ワードプレスのブロックテーマの位置づけは新たな選択肢の一つだろうと勝手に思っている。理由はWPの公式サイトの命名と位置づけにある、当初はこれからはブロックテーマ、フル編集だと謳っていたかもですが、テンプレート販売会社などから不満が出たのかも?

公式サイトの開発ドキュメントでもテーマベイシックはphpを使用した方法の手順が書かれている。ベイシック=基準がいきなりhtmlファイルに置き換わることは無さそうというのが自分の見解です。

ブロックテーマのドキュメントを見ていると、やはりベースのテンプレートを素人の人が作るのはいささか難しい感じがする。そしてフル編集になると編集した値はDBか独自ファイルに保存されるようになるのだろう、これを手直しするのは開発者側からすると面倒だし、デザイナーさんからするとあまり良い思いはしないだろうと思う。そういう事もあってテーマベイシックはこれからもphpだろうと思います。

タグ

db, htmlファイル, php, wp, テーマベイ, テーマベイシック, テンプレート, ドキュメント, ファイル, ブロックテーマ, ベース, ベイシック, ワードプレス, 命名, 当初, 手順, 素人, 見解, 選択肢, 開発ドキュメント,

laravel8系以降でのルート、web.phpの記載。 #laravel

2022.12.17

Logging

おはようございます、寒さ対策が必要になってきましたが未だに部屋のエアコンはつけていません🥺。

Laravel8以降でのルート、web.phpの記載は7系とは記述が違いますって思っていたのだけど同じような記述する方法で書く方が楽だなって思ったので、今はそうしています。7系は下記のような記述で大丈夫でしたが8系以降、名前空間の部分も記載してあげないといけなくなりましたって話。ただ、コレは7系から8系へ対応する時に対応し易いようにしたもので、今後、使用できなるかもしれないので標準で記載するほうが良いのかもしれない🙄。

Route::post('/{id}/cart',"Cart@add");
Route::post('/{id}/cart',"App\Http\Controllers\Cart@add");
use App\Http\Controllers\Cart;
Route::post('/{id}/cart',[Cart::class,'add']);

フレームワークってのは自社開発する方が良いなって思うこともあります、理由はルールを自分で創ることが出来るということです、オープンソースのフレームワークは、PHPのバージョンアップする時にどうしてもバージョンアップ対応が必要になってきます。そこが厄介だなって思うですね。

動けばバージョンアップする必要はないのですがね、そうもいかないのが、開発現場の現状だったりするのかもしれない🤔?

タグ

Cart, ID, laravel8以降, php, POST, quot;AppHttpControllersCart@add&quot, quot;Cart@add&quot, Route, use AppHttpControllersCart, web.php, エアコン, コレ, フレームワーク, ルート, ルール, 未だに部屋, 標準, 現状, 自社, 記述,

全国各地の漁港データをJSONデータ化したお話🦾。#php #map

2022.12.07

Logging

おはようございます、昨日は晴れていましたね☼。

そんなお天気な日に漁港座標データXMLをJSONデータ化しておりました。国土交通省のデータを加工しJSONデータに加工するのはそんな難しい問題じゃないかなって思っていたのですが、データが重たい、中身のXMLデータは名前空間使っているなどという面倒くさい仕様になっておりました。名前空間の対応は、こちらのQiitaの記事を参照してほぼコピペで自分のコードに追加しました。

だた追加しただけでは、あんなツイートしたJSON構造にならないので細工しています。自分が必要なのは漁港名と座標軸だけなので、これだけで良い感じです。

preg_grep("/".$val->{"@attributes"}->id."/",$name);

因みにXMLファイルが重いので自分はデータを分割しました(エラーが出力されるので)。php.iniの設定は変えたくなかったので分割と加工をしたわけです。座標データと漁港名に分割して上記のコード等を使用しJSONファイルを出力。このJSONコードを元にオープンストリートマップ(OpenStreetMap)とかでサービスを作ることが出来ますが、このデータは非商用なので使い物にならないかな…🤔。データの販売等や二次配布は禁止だけど、データ活用は禁止していないように取れるので詳しく調べてみます🙄。

追記:都道府県を追加してみました

タグ

attributes, grep, gt, ID, json, map, name, php, preg, qiita, quot, val, xml, お話, コード, こちら, コピペ, これだけ, ツイート, データ, ファイル, 中身, 仕様, 全国, 分割, 加工, 参照, 各地, 名前, 問題, 国土交通省, 天気, 対応, 座標, 座標軸, 必要, 感じ, , 昨日, 構造, 漁港, 空間, 細工, 自分, 記事, 追加,

お天気APIを試してみました。#超簡単コード

2022.11.21

Logging

おはようございます、今日は天気APIの話なので天気のお話はしませんが…。

さて、超簡単コードを記載しています。下記のソースコードとオープンウェザーマップのAPIKEYがあれば、誰でもプログラマーです。という事を言えば後ろから蹴られそうですが…。先ずは簡単なコードを見て勉強するのが大事かなって思います。

お天気APIを試してみました。#超簡単コード
API

いきなり難しいことを身に着けようと思っても、三日坊主になって先に進まないのが世の常ですw。なので、簡単なコードで楽しんで勉強するほうが大事かなって。

<?php
require "./assets/config.php";
$lat = "33.55972";
$lon = "133.53111";
$lang = "ja";
$url = "https://api.openweathermap.org/data/2.5/weather?units=metric&lang={$lang}&lat={$lat}&lon={$lon}&appid=".APIKEY;
$hasWeatherdata = json_decode(@file_get_contents($url));
print($hasWeatherdata->weather[0]->description);
print("<img src='./assets/images/". $hasWeatherdata->weather[0]->icon .".png'>");
print((int)($hasWeatherdata->main->temp) . "℃");

タグ

0, 133.53111, 33.55972, API, APIKEY, assets, com, config, ea, https, ja, lang, lat, lon, lt, php, quot, require, url, , watch, www, Xn-VCyGQ, youtube, ウェザー, お話, コード, こと, ソース, プログラマー, マップ, 三日坊主, 下記, 世の常, , 今日, 勉強, 大事, 天気, 後ろ, 簡単, 記載, , , 超簡単,

md5でいいのかそれで?。 #wp #phpcode

2022.11.17

Logging

おはようございます、いきなり寒くなりましたね。朝起きるのに勢いが必要になってきました😆。

今日はワードプレスでもパスワードの暗号化に使用されているmd5に関して思うことがあります。そもそもmd5は強固な暗号なのか?、答えはnoだと思いますよ。md5を使用すると32文字の暗号化された文字列が返却されます。確かに暗号化されているですけど・・・。同じ文字をもう一度、暗号化すると同じ文字列が返却されます、なので暗号化された文字列になるかどうかで、元の文字が割り出せてしまいます。

総当たりすれば時間はかかりますがパスワードが分かちゃうので、パスワードを保存する方法としては△な感じかと思います。じゃ何が良いかといえばphpの場合、password_hashと言う関数があるので、そちらを使用した方が得策かと思います。Eメールなどはmd5でも良いかも知れませんが微妙。

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

因みに、パスワードなどやメールアドレスを平文で扱っている開発会社はよく見かけます。何故、平文を放置しているかと言えば直す暇がないなどの理由からだと思います。また、クライアント様がそうして欲しいなどの理由もあります。そういう事から個人情報が保護されていないデータベースはあります。

尚、自分が使用しているWEBサービスも個人情報にあたる部分は暗号化しています。なので、データーが流出しても直ぐに情報が漏れるということはないと思っています🫠。

タグ

32, 5, echo, hash, md, no, password, php, PHPCODE, quot, rasmusl, wp, こと, そちら, パスワード, プレス, メール, ワード, 一度, 今日, , 使用, 保存, , 勢い, 場合, 得策, 微妙, 必要, 文字, 文字列, , 方法, 時間, 暗号, 暗号化, , 答え, 総当たり, 返却, 関数,

htmlとcssとphp-初学非同期処理とおまけ-No.3

2022.11.14

Logging

おはようございます。月曜日の朝ですね‥お仕事探しは続いています。

さて、非同期処理とは何かと問われると詰まりますが・・・。いつ結果を返してくれない処理といえば良いのでしょうか。じゃ同期処理はといえば仕事が終わるまで次の仕事を進めない事といえば良いのかな🤔、教えるのが下手なのでぐぐってみてください。

document.querySelector(".btn").addEventListener("click", () => {
    let p = [document.querySelector("[name='name']").value, document.querySelector("[name='text']").value];
    [...document.querySelectorAll(".put")].forEach((elm, index) => {
        elm.innerText = p[index];
    });
    document.querySelector("#box2").style.display = "none";
    document.querySelector("#data").insertAdjacentHTML("beforeend", `<button class="btn2" type="button">非同期送信</button>`);
    document.querySelector(".btn2").addEventListener("click", async () => {
        //submit code
        let url = "./submit.php";
        let data = (() => {
            return ([...document.querySelectorAll(".put")].map((elm, index) => {
                return "test" + index + "=" + elm.innerText;
            })).join("&");
        })();
        const options = {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                "Content-Length": data.length,
                'Accept': 'application/json'
            },
            body: data //JSON.stringify(data)
        };
        await fetch(url, options).then(response =>
            response.json()
        ).then(resultdata => {
            document.getElementById("view").insertAdjacentHTML("beforeend", resultdata.test0 + "," + resultdata.test1);
        }).catch(error => {
            console.log(error);
        });
    });
});


function imgchg(imagename){
    document.body.setAttribute("style","background-image: url(./assets/images/" + imagename + ".jpg");
}

ぐぐると自分言っていた意味がなんとなく分かるかと思います。ちなみに非同期動画(youtube)のおまけとして、背景画像を変える処理のソースコードを書いています。プログラムコードとしては3行ですが、初学者の方はこの3行のソースコードの方が面白いのかもしれません。自分が書いたソースコードを所々、変更して動かしてみてください。そうすることで、徐々にコードの意味が理解してくると思います。

追伸:サンプルサイトの動画は少しお休みします()?

https://358tool.com/sample-site/

タグ

, 39, addEventListener, btn, click, css, document, gt, html, let, name, no, php, querySelector, querySelectorAl, quot, Text, value, いつ, おまけ, お仕事, , 仕事, , 処理, 初学, 同期, 月曜日, , , 結果,

POSTとGETの考え方について伝えている動画。 #以心伝心

2022.11.12

Logging

おはようございます、11月なのに寒くないって不思議です😗温暖化。

さて、POSTとGETの考え方について無音声(音楽あり)で伝えている動画です、以心伝心で意味が通じると良いですが、それではブログを書いている意味がないので要点だけ解説します。POSTとGETとは、インターネット上でデータの送信を行うのに使用します。POSTの利点はデータを隠して送れることと、比較的に重いデータも送れることにあります。ではGET送信の利点は、SEOに有利と言ったところでしょうか。

htmlとcssとphp-初学POSTとGETの考え方-No.2
htmlとcssとphp-初学POSTとGETの考え方-No.2

今回、POST送信とGET送信を行い、PHPのプログラムでPOSTとGETを受信する方法を動画で伝えています。次回は非同期処理を使用して送受信を行う方法をプログラムで書いていきます。

HTMLとPHPプログラムは下記のソースを参照下さいませ🙇。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>demo site</title>
    <style>
html {
    width: 100vw;
    height: 100vh;
}

body {
    background-color: rgb(0, 0, 0);
    color: aliceblue;
    background-image: url(./assets/images/aig-mid22910-120-xl_TP_V.jpg);
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center;
}

div.box {
    border-color: aliceblue;
    border-style: inset;
    position: absolute;
    width: 300px;
    height: 450px;
    color: white;
    border-radius: 1em;
    padding: 1em;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%);
    /* background-color: #ffffff80; */
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    overflow-wrap: break-word;
    text-align: center;
}

div>form>p {
    font-weight: bold;
    margin: 13px;
}

input {
    opacity: 0.5;
}

textarea {
    opacity: 0.5;
}

button {
    padding: 5px;
    border-radius: 1em;
    border-style: solid;
    border-color: aliceblue;
    background-color: aliceblue;
    color: rgb(0, 0, 0);
}
button:hover{
    border-color: rgb(255, 255, 255);
    border-style: inset;
    background-color: rgb(27, 76, 119);
    color: aliceblue;
}
.put:nth-child(2){
    overflow: auto;
    height: 120px;
}
    </style>
</head>
<body>
    <div class="box">
        <div id="box2">
            <form action="submit.php" method="post">
                <p>名前:<input type="text" name="name"></p>
                <p><textarea name="text" id="" cols="30" rows="10"></textarea></p>
                <p><button class="btn" type="submit">確認</button></p>
            </form>
        </div>
        <div id="data">
            <p class="put"></p>
            <p class="put"></p>
        </div>
    </div>
    <script src="./assets/js/main.js"></script>
</body>

</html>
<?php
var_dump(xss_d($_POST));
print(xss_d($_POST["name"])."<br>");
print(xss_d($_POST["text"])."<br>");

function xss_d(mixed $val){
    if(!isset($val))return false;

    if(is_array($val)){
        foreach ($val as $key => $value) {
            $val[$key] = strip_tags($value);
            $val[$key] = htmlspecialchars($val[$key],ENT_QUOTES);
        }
    }else{
        $val = strip_tags($val);
        $val = htmlspecialchars($val,ENT_QUOTES);
    }

    return $val;

}

タグ

11, 2, css, DOCTYPE, GET, html, lt, no, php, POST, SEO, インターネット, こと, ソース, データ, ところ, ブログ, プログラム, 下記, 不思議, 今回, 以心伝心, 使用, 処理, 初学, 利点, 動画, 参照, 受信, 同期, 意味, 方法, 有利, 次回, 温暖化, 考え方, 要点, 解説, 送信, 送受信, 音声, 音楽,

Qiitaのfeedを取得して表示するだけのコード。 #php

2022.11.05

Logging

おはようございます、土曜日の朝ですね😗。

今日は文化の日にQiitaにUPしたfeedを取得して表示するだけのコードを書きました。見た目はこんな感じでQiitaの雰囲気を取り入れたデザインにしています。デモ版として実際にサーバーで起動しているモノです、feedを取得しているユーザーは自分を入れて3人です。

表示する人数が多くなるとページを描画する時間が遅くなるので実質、10人が限度かも知れないです。もし何人ものユーザーを取得したいと考えている方は表示部分と処理部分を別けて、尚且つ処理部分は非同期処理で変更することを推奨します。

尚、明日には2つに別けたプログラムコードを別記事として記載しますので、しばしお待ち下さいませ🙇。

今回のソースコードはこんな感じになってます。

<?php
    function get_Qiitafeed(string $feedUrl){
        $xml = @simplexml_load_file($feedUrl);
        if(isset($xml->entry)){
            print("<ul class='qiita_feed-list'>");
            foreach($xml->entry as $key=>$val){
                print("<li><a href='{$val->url}'>".$val->title."</a></li>");
            }
            print("</ul>");
        }
    }
?>
<!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/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
    .qiita_feed-list > li{
        /* font-weight: bold; */
        color:aliceblue;
    }
    .qiita_feed-list > li > a{
        color:aliceblue;
    }
    body{
        background-color:#60b111;
    }
    .shadow-lg {
        box-shadow: 0 1rem 3rem rgba(255,255,255,.195)!important;
    }    
</style>
<title>Qiita-feed</title>
<?php
    require $_SERVER['DOCUMENT_ROOT'] ."/header_script.php";
?>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-12">
                <h1 class="text-light">Qiita-feed</h1>
            </div>
        </div>
    </div>
    <div class="container mt-2">
        <?php
            $Id_List = ["taoka-toshiaki","mpyw","suin"];
            foreach ($Id_List as $key => $id) {
            ?>
        <div class="row shadow-lg p-3 mb-5 bg-body rounded">
            <div class="col-12">
                🌿<span class="text-light">://qiita.com/<?=$id?>/feed :[引用]</span>
                <?=get_Qiitafeed("https://qiita.com/".$id."/feed")?>
            </div>
        </div>            
            <?php
            }
        ?>
        Copyright <?=date("Y")?>  <a href="https://358tool.com">358tool.com</a>
    </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
</body>
</html>

タグ

10, 2, , feed, feedUrl, function, GET, lt, php, qiita, Qiitafeed, string, UP, お待ち, コード, こと, サーバー, ソース, デザイン, デモ版, プログラム, ページ, もの, ユーザー, 人数, 今回, 今日, 何人, 処理, 別記事, 取得, 同期, 土曜日, 変更, 実質, 実際, 感じ, 推奨, 描画, 文化の日, , 明日, 時間, , 自分, 表示, 見た目, 記載, 起動, 部分, 限度, 雰囲気,

常時ディレクトリ監視を行う方法。 #CPU使用率 #炎上

2022.11.03

Logging

おはようございます。何だかアカウントを作ってまでコメントする人の考えがわからない🤔。

Qiitaに、このコードのsleep関数がないバージョンをアップしたら、何やらアカウントを作ってまでコメントする人が現れる、理由はCPU使用率がMax近くになるのが駄目だからです、そんな事は分かっているのが普通だと思っていたのだけども…例文として掲載するのも駄目だそうです、コピペで運用する人が結構いるのかもしれない。

正直なところ、そこまで叩かれるとは思っていなかったので、正直なところ驚きを隠せない。段々と世間の常識とズレていっている気がします😗。

昔はそういうコードは巷に溢れていたのにな・・・そんな事も出来なくなってきたのか・・・。

トイウコトデ、常時ディレクトリ監視を行い任意の画像ファイルだけ別のディレクトリへ移動するコードです。

nohup php File_Check.php &
├── File_Check.php
├── upload
└── data
<?php
while(true){
    if($result = is_scandir("./upload")){
        foreach($result as $key=>$value){
            rename("./upload/$value","./data/$value");
        }
    }
    sleep(3);
}

function is_scandir(string $dirname="",array $ext_list = ["png","jpg"]){
    $is_filelest = [];
    $result = scandir($dirname);
    foreach($result as $key=>$value){
        $ext = substr($value, strrpos($value, '.') + 1);
        if(in_array($ext,$ext_list,false)!== false){
            $is_filelest[] = $value;
        }
    }
    return count($is_filelest)>0 ? $is_filelest : false;
}

タグ

check, CPU, file, max, nohup, php, qiita, sleep, アカウント, アップ, コード, コピペ, コメント, そこ, ディレクトリ, トイウコトデ, ところ, バージョン, ファイル, 世間, , , 任意, 使用, 例文, , , 常時, 常識, 掲載, 方法, , 普通, 正直, 段々, , 炎上, 理由, 画像, 監視, 移動, 近く, 運用, 関数, 駄目,

staticかdynamicか、php-fpmの話。#php #apache

2022.11.01

Logging

おはようございます、メモリが肥大化して落ちました🤮。

先週の朝、メモリが肥大化して落ちてしまいました。今まではphp-fpmを1時間置きに再起動していましたが、それを変更した途端。メモリを食ってしまい落ちたわけです。

php-fpmの対応はこちらのサイトを参考にしました、尚、対応方法はそちらの記事を参照ください。その記事を読んでいて思ったことはやはりサーバーを増強したいということです。

でもVPSレンタルサーバーはサクサク表示させるには、結構お金がかかってしまいます、だったら固定IPを引いて自宅サーバーで運用した方が良いのかもしれないなってこの頃、思っています。

そうすればメモリはかなり詰めるし処理もそれなりに早くなります。恐らく瞬速で表示されるようになりますが、震災などが起きると忽ちダウンしてしまいますよね。

そう考えると・・・微妙ですね。

やはりVPSサーバーをもう一つ借りて調整するか、VPSサーバーと自宅サーバーを同期して運用するかだと…。

タグ

, Apache, dynamic, IP, php, php-fpm, static, VPS, お金, かなり, こちら, こと, サーバー, サイト, そちら, それ, それなり, ダウン, はり, メモリ, もう一つ, レンタル, わけ, , 先週, 再起動, 処理, 参照, 参考, 固定, 増強, 変更, 対応, 微妙, , 方法, , 瞬速, 自宅, 表示, 記事, , 途端, 運用, 震災, ,

phpでソケット受信をする事だけ覚えとけば良い。#php #code

2022.10.27

Logging

おはようございます。Socket.ioというサービスをご存知ですか。あれ良いですよね。

さて、Socketとはいう意味は割愛させて頂き、知っていることを前提に話しますとPHPでSocketサーバーは立てれないじゃないかなって今のところ思っています。localhostや0.0.0.0とかならSocketサーバーは立てれるけど、ドメイン有りきでは難しいような気がします。

なので、Socket.ioなんかを使用してnode.jsなんかでサーバーを立てるのが定石かと思います。尚、webSocketのサーバーに対してPHPで送受信は可能です。要するにクライアント側はPHPでも可能ですね。

自分もAPIサーバーに対して常時通信処理を行っています。

PHPライブラリの使用して接続を確立しています、ライブラリはratchetという有名所のライブラリを使用しています。

composer require ratchet/pawl
<?php

require __DIR__ . '/vendor/autoload.php';

\Ratchet\Client\connect('wss://example.com')->then(function($conn) {
    $conn->on('message', function($msg) use ($conn) {
        echo "Received: {$msg}\n";
        $conn->close();
    });

    $conn->send('Hello World!');
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

上記のようなPHPのソースコードで送受信が可能です😋

タグ

0.0.0.0, API, Code, Composer, io, JS, localhost, node, php, ra, ratchet, require, Socket, webSocket, あれ, クライアント, こと, ご存知, サーバー, サービス, ソケット, ところ, ドメイン, なん, ライブラリ, , , 使用, 処理, 前提, 割愛, 受信, 可能, 名所, 定石, 常時, 意味, 接続, , , 確立, 自分, 送受信, 通信,

制限付きのクロンを無限寿限無にする方法。 #php #無限 #cron

2022.10.12

Logging

おはようございます🦏。昔の文章を読んでくれて今の記事を読まないユーザーさんがいます、凹む😖。

さて、今日はさくらレンタルサーバーでcronを制限以上に使う方法を数年前に書いた記事が未だに読まれたりするのでプログラムコードを直してタイトルも直してQiitaGithubにUPしました。

そのUPした記事があまりアクセスが跳ねなくて少しがっくりしたのがスポーツの日の朝の事です。Qiitaは何だか触りの記事かとても専門性の高い記事が人気を集めるだなって事を、この頃理解したのですが、自分は何方にも寄っていない記事なので跳ねないのかも知れません。

ソースコード貼り付けて置きます。尚、使い方などはQiitaGithubを参照してください。

<?php
date_default_timezone_set('Asia/Tokyo');
class cron
{
    public function __construct(mixed $filepath = "")
    {
        $val = @file_get_contents($this->pval($filepath));
        $obj_ = @json_decode($this->pval($val));
        $obj = (object)[];
        foreach ($obj_ as $key => $value) {
            $obj->name = "month";
            $obj->val = $value->m;
            if ($flg = $this->trigger_check($obj,"m",1,12)) {
                $obj->name = "day";
                $obj->val = $value->d;
                if ($flg = $this->trigger_check($obj,"d",1,31)) {
                    $obj->name = "hour";
                    $obj->val = $value->H;
                    if ($flg = $this->trigger_check($obj,"H",0,23)) {
                        $obj->name = "minutes";
                        $obj->val = $value->i;
                        if ($flg = $this->trigger_check($obj,"i",0,59)) {
                            $obj->name = "week";
                            $obj->val = implode(",", $value->w);
                            if ($flg = $this->trigger_check($obj,"w",0,0)) {
                                $this->command($value->command);
                            }
                        }
                    }
                }
            }
        }
    }
    public function command(mixed $command_val = "")
    {
        $command_val = $this->pval($command_val);
        exec($command_val . " > /dev/null &");
        // print "よろしくお願いします~~~!!".PHP_EOL;
        return true;
    }

    public function pval(mixed $val = "")
    {
        if (is_array($val)) {
            foreach ($val as $key => $value) {
                $val[$key] = strip_tags($value);
            }
        } else {
            $val = strip_tags($val);
        }
        return $val;
    }

    public function trigger_check(mixed $variable = "",mixed $d="",int $min=0 ,int $max=0)
    {
        if (!$variable) return false;
        if ($variable->val === "*") return true;
        switch ($variable->name) {
            case 'week':
                $value = @explode(",", $variable->val);
                return (int)$value[(int)date($d)] === 1 ? true : false;
                break;
            default:
                if (preg_match("/^(\*\/[0-9]{1,})$/", $variable->val)) {
                    $value = @explode("*/", $variable->val)[1];
                    if (is_numeric($value) && $value >= $min && $value <= $max) {
                        return (int)date($d) % $value === 0 ? true : false;
                    }
                }
                if (preg_match("/^([0-9]{1,}\,{1,})/", $variable->val)) {
                    $value = @explode(",", $variable->val);
                    $value = array_map('intval', $value);
                    return in_array((int)date($d), $value, true) === true ? true : false;
                }

                $value = (int)$variable->val;
                if (is_numeric($value) && $value >= $min && $value <= $max) {
                    return $value === (int)date($d) ? true : false;
                }
                return false;
                break;
        }
        return false;
    }
}

if($argv[1]){
    //argv
    new cron($argv[1]);
}


タグ

39, Asia, class, cron, date, default, github, lt, php, public, qiita, set, timezone, Tokyo, UP, アクセス, クロン, コード, サーバー, さくら, スポーツ, ソース, タイトル, プログラム, ユーザー, レンタル, , 人気, , 今日, 何方, 使い方, 制限, 参照, 寿限無, 専門性, 少し, , 文章, 方法, , , , 未だ, 無限, 理解, 自分, 記事, ,

WP予約投稿ツイートプラグイン作り方。#php言語 #code #v2

2022.10.11

Logging

おはようございます😤 お仕事に飢えてます…寒い季節ですね…。

さて、今日はWP予約投稿ツイートプラグイン作り方を記載していきます。ワードプレスでプラグインを作る場合はWordPressの下記の場所に任意のフォルダを作り、その中にディレクトリ名(任意名)と同じファイル名でphpファイルを作ります。※昔の名残なので今は命名が違っても動くかも知れませんが・・・。

cd /wp-content/plugins
mkdir mytweets
vi mytweets.php

そして、命名したファイル名を開き、ファイルの上部に下記のコメントを記載します。プラグイン名やプラグインの説明、プラグインバージョンをそれぞれ変更して頂き保存、その後サーバーサイドにアップロードします(フォルダごと)。

<?php
/*
Plugin Name: My tweets
Description: tweets
Version: 1.0
*/

これで何も動作しないプラグインが出来上がります。

後はコマンドラインからプラグインフォルダにcomposerをインストールしtwitteroauthのライブラリを入れます。

此処までが前手順です。此処までで挫折した人は結構いると思います🙄。

因みに此処までの事がすんなりと出来る人は、このブログの情報は必要ないものです。なのでココからはソースコードを記載します。WP予約投稿ツイートプラグインなんてオチャノコサイサイだと思います。

<?php
/*
Plugin Name: My tweets
Description: tweets
Version: 1.0
*/
if (!defined('ABSPATH')) exit;
require_once  "tw-v2-config.php";
require_once  "./vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

function mytweets($new_status, $old_status, $post)
{
    
    if ($new_status == 'publish' && $old_status != 'publish') {
        try {
            $connection = new TwitterOAuth(APIKEY, APIKEYSECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
            $connection->setApiVersion('2');
            $response = $connection->post('tweets', ['text' => get_the_title($post->ID) . "\n" . get_permalink($post->ID)], true);
        } catch (\Throwable $th) {
            //throw $th;
        }
    }
}
add_action('transition_post_status', 'mytweets', 10, 3);

上記のコードを記載した上で上書き保存&アップロードします。その後ワードプレスの管理画面よりプラグインを有効にして出来上がり、今回はtwitteroauthのライブラリを使用しましたがcrulなどのを理解している人はライブラリは特に必要ないのかなとも思います。ライブラリを使用すればお手軽ですが、万が一何かあった時に困るのでライブラリを使用せずにコードを書くという方もいらっしゃると思います。

自分も極力、公式のライブラリしか使わないようにしています🙇。

トイウコデ、ワードプレスのプラグインの作り方でした。

タグ

2, cd, Code, description, lt, mkdir, My, mytweets, name, php, plugin, plugins, Tweets, Vers, vI, WordPress, wp, wp-content, アップロード, お仕事, コメント, サーバー, それぞれ, ツイート, ディレクトリ, バージョン, ファイル, フォルダ, プラグイン, プレス, ワード, 上部, 下記, , 予約, , 今日, 任意, 作り方, 保存, 名残, 命名, 場合, 場所, 変更, 季節, , 投稿, , 言語, 記載, 説明,

数珠繋ぎのツイートシステムに予約機能を付けました😂 #php #code

2022.10.07

Logging

おはようございます、偏頭痛持ちは雨が降るが一番大変です☔。

先日、数珠繋ぎのツイートシステムを作ったのですが、そのシステムに予約機能を付けました。尚、TwitterAPIのバージョン2でスケジュールのパラメーターが今のところ無いですね。これから先、機能が付くかも知れないですが今のところ無いようです。因みにソースコードは近日中にQiitaGithubにUPします。此処ではソースコードの一部を掲載します(※記事を更新しました下へスクロール🫠)。

Twitter API v2 ツイート数珠繋ぎ

尚、crontabでPHPファイルを叩くようにしています、あと注意事項ですが予約を一度した投稿については変更等は出来ません、編集機能等の機能追加の予定はないです。また、予約管理はsqlite3を使用して管理しています。

<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors",0);
require_once "./data/tw-config-v2.php";
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class tw
{
    var $connection = null;
    var $pdo = null;
    function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }
    function db_connection()
    {
        try {
            //code...
            $res = $this->pdo = new PDO("sqlite:./data/tw-tweets-db.sqlite3");
        } catch (\Throwable $th) {
            //throw $th;
            //print $th->getMessage();
            $res = false;
        }
        return $res;
    }

    function timecheck($timeonoff, $times)
    {
        if (!$timeonoff) return true;
        $n = new DateTime();
        $t = new DateTime($times);
        return $t <= $n ? true : false;
    }

    function pickup_tweets(mixed $tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        if (!$times) return false;
        $obj = (object)[];
        $times = preg_replace("/\-/", "/", $times);
        $times = preg_replace("/T/", " ", $times);

        if ($this->timecheck($timeonoff, $times)) {
            if (isset($tw_text) && is_array($tw_text)) {
                foreach ($tw_text as $key => $value) {
                    if (preg_replace("/[ | ]/", "", $value)) {
                        $obj = !$key ? ($this->connection->post("tweets", ["text" => $value], true)
                        ) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $value], true)
                        );
                    }
                }
                return true;
            }
        } else {
            return $timeonoff ? $this->save_sqlite($tw_text, $timeonoff, $times, $id): true;
        }
    }

    function save_sqlite($tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        if ($this->db_connection()) {
            try {
                //code...
                if (isset($tw_text) && is_array($tw_text)) {
                    foreach ($tw_text as $key => &$value) {
                        if (preg_replace("/[ | ]/", "", $value)) {
                            $stmt = $this->pdo->prepare("insert into tweets (tw_id,user,times,tw_text)values(:tw_id,:user,:times,:tw_text)");
                            $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                            $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                            $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                            $stmt->bindValue(":tw_text", $value, PDO::PARAM_STR);
                            $stmt->execute();
                        }
                    }
                }
                $this->pdo = null;
                return true;
            } catch (\Throwable $th) {
                //throw $th;
                return false;
            }
        }
    }
    function tweets_load(string $id = "")
    {
        if (!$id) return false;
        try {
            //code...
            $value = null;
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("select * from tweets where user = :user order by times,tw_id asc;");
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $res = $stmt->execute();
                $value = $res ? $stmt->fetchAll() : false;
                $this->pdo = null;
            }
            return $value;            
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
    }
    function tweets_update(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "",mixed $tw_text="")
    {
        try {
            //code...
            if(!preg_replace("/[ | ]{0,}/","",$tw_text))return false;
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("update tweets set tw_text = :tw_text where tw_id = :tw_id and user = :user and times = :times");
                $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                $stmt->bindValue(":tw_text", $tw_text, PDO::PARAM_STR);
                $stmt->execute();
                $this->pdo = null;
            }
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
        return true;

    }

    function tweets_delete(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        try {
            //code...
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("delete from tweets where tw_id = :tw_id and user = :user and times = :times");
                $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                $stmt->execute();
                $this->pdo = null;
            }
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
        return true;
    }

    function bat_tweets(mixed $value = null)
    {
        if (!$value) return false;
        $obj = (object)[];
        $t = "";
        foreach ($value as $key => $val) {
            if ($this->timecheck(1, $val["times"])) {
                $obj = ($val["times"]<>$t)? ($this->connection->post("tweets", ["text" => $val["tw_text"]], true)
                ) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $val["tw_text"]], true)
                );
                $this->tweets_delete($val["tw_id"], 1, $val["times"], $val["user"]);
                $t = $val["times"];
            } else {
              //  var_dump($val);
              //  break;
            }
        }
    }
}

if ($argv[0]) {
    $tw = new tw();
    $value = $tw->tweets_load(xss_d($argv[1]));
    $tw->bat_tweets($value);
}
function xss_d($val = false)
{
    if (is_array($val)) {
        foreach ($val as $key => $value) {
            $val[$key]  = strip_tags($value);
            $val[$key]  = htmlspecialchars($val[$key]);
        }
    } else {
        $val  = strip_tags($val);
        $val  = htmlspecialchars($val);
    }
    return $val;
}

追記:予約編集機能なども付けました🙄。

GithubとQittaのリンクはこちらです。
Github:https://github.com/taoka-toshiaki/tweets-system-box1
Qitta:https://qiita.com/taoka-toshiaki/items/5ef12b60b267742bf584

タグ

2, , 39, Asia, Code, crontab, date, default, github, ini, lt, php, qiita, Se, set, Sqlite, timezone, Tokyo, TwitterAPI, UP, コード, これ, システム, スクロール, スケジュール, ソース, ツイート, ところ, バージョン, パラメーター, ファイル, 一部, , 予定, 予約, 事項, , 使用, 偏頭痛, , 先日, 変更等, 大変, 投稿, 掲載, 数珠繋ぎ, 更新, 機能, 機能等, 此処, 注意, 管理, 編集, 記事, 近日, 追加, ,