@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。
webpushのLaravelを使用しないパターンを箇条書き、フロントエンド側は
2024.11.14
おはようございます.webpushのLaravelを使用しないパターンを箇条書き、フロントエンドは過去記事を参照ください.まずwebpushを使用するにはパブリックキーとシークレットキーが必要になります.下記のURLより発行してみてください.
https://web-push-codelab.glitch.me
フロントエンド側でサービスワーカーの登録された識別データをバックエンドに送信.
// db.php: データベース接続の設定
function getDbConnection() {
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch (PDOException $e) {
die("DB接続エラー: " . $e->getMessage());
}
}
// endpoint_register.php: エンドポイントをデータベースに登録
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$endpoint = $_POST['endpoint'];
$auth = $_POST['auth'];
$p256dh = $_POST['p256dh'];
if ($endpoint && $auth && $p256dh) {
$pdo = getDbConnection();
$stmt = $pdo->prepare("INSERT INTO push_subscriptions (endpoint, auth, p256dh) VALUES (?, ?, ?)");
$stmt->execute([$endpoint, $auth, $p256dh]);
echo "登録成功";
} else {
echo "エンドポイントデータが不完全です";
}
}
バックエンド側で下記のようなコードでデータを保存します.
次にminishlink/web-pushというライブラリを使用し登録されたデータを元に送信処理を行います.
composer require minishlink/web-push
// message_send.php: データベースからエンドポイントを取得し、プッシュ通知を送信
require 'db.php';
require 'vendor/autoload.php';
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
// VAPIDキーの設定
$auth = [
'VAPID' => [
'subject' => 'https://example.com',
'publicKey' => 'YOUR_PUBLIC_VAPID_KEY',
'privateKey' => 'YOUR_PRIVATE_VAPID_KEY',
],
];
$webPush = new WebPush($auth);
// データベースからサブスクリプション情報を取得
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT endpoint, auth, p256dh FROM push_subscriptions");
$subscriptions = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($subscriptions as $sub) {
$subscription = Subscription::create([
'endpoint' => $sub['endpoint'],
'publicKey' => $sub['p256dh'],
'authToken' => $sub['auth'],
]);
// 送信するメッセージ
$message = json_encode(['title' => '通知タイトル', 'body' => 'メッセージ内容']);
// プッシュ通知の送信
$webPush->sendNotification($subscription, $message);
}
// 送信キューの実行
foreach ($webPush->flush() as $report) {
$endpoint = $report->getRequest()->getUri()->__toString();
if ($report->isSuccess()) {
echo "成功: {$endpoint}\n";
} else {
echo "失敗: {$endpoint}: {$report->getReason()}\n";
}
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$stmt, catch, endpoint, FETCH_ASSOC, foreach, getDbConnection, getMessage, Laravel, minishlink, MYSQL, PDO, PDOException, prepare, query, setAttribute, subscription, VALUES, vendor, Webpush, シークレットキー,
githubのworkflowsを
2024.03.05
おはようございます、個人用に初めてgithubのAction用のymlを作ったって話です。githubで個人でactionを使う場合、公開設定、非公開設定ともに使えるようですね、使えないみたいな記述の記事を見かけましたが…。因みに静的解析ツールは導入していません。PHPStanみたいなものは導入していません。仕事では静的解析ツールも導入していますが個人で今回のように雛🐣レベルの開発には必要ないかなって。後々、追加するかもしれませんが?
自分が作ったYmlファイルはこちらでも公開しときますね。actionが成功するまでにかなりの失敗(エラー)を繰り返しましたところが(泣)ですね~。一回では上手く動作してくれず試行錯誤しました良い学びにはなりましたが👍。
name: testing
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
defaults:
run:
working-directory: ./turi-map-app
jobs:
laravel-test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.7
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: turi
MYSQL_DATABASE: turi
MYSQL_USER: turi
MYSQL_PASSWORD: turi
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
options: --health-cmd "mysqladmin ping -h 127.0.0.1" --health-interval 20s --health-timeout 10s --health-retries 10
strategy:
matrix:
node-version: [21.x]
steps:
- uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
with:
php-version: '8.2'
extensions: mbstring, dom, fileinfo, pdo_mysql, PDO, zip
- uses: actions/checkout@v4
- name: Copy .env
run: php -r "file_exists('.env') || copy('.env.testing', '.env');"
- name: Install Dependencies
run: composer install -n --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: storage link
run: php artisan storage:link
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: npm install
run: npm i
- name: Build Assets
run: npm run build
- name: migrate
run: php artisan migrate
- name: Execute tests (Unit and Feature tests) via PHPUnit
run: php artisan test
明日へ続く。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
actions, chmod, defaults, dom, env, extensions, generate, health-cmd, health-timeout, matrix, migrate, MYSQL, password, PDO, ports, services, steps, strategy, Testing, working-directory,
PHPでトランザクションを久々に使用した。サンプルコード
2023.03.08
おはようございます。
先日、PHPでトランザクションを久々に使用した。サンプルコードは以下になります。トランザクションやロールバックとかいう言葉は聞いても実際に使用してみないとその役割りや良さはわからないものかなって思います。
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$username = 'myusername';
$password = 'mypassword';
try {
$dbh = new PDO($dsn, $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// トランザクションを開始する
$dbh->beginTransaction();
// データベース操作1を実行する
$stmt1 = $dbh->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt1->execute(array('John Doe', 'john.doe@example.com'));
// データベース操作2を実行する
$stmt2 = $dbh->prepare('UPDATE accounts SET balance = balance - 100 WHERE user_id = ?');
$stmt2->execute(array(1));
// データベース操作3を実行する(エラーが起きることをシミュレートする)
$stmt3 = $dbh->prepare('INSERT INTO orders (user_id, total_amount) VALUES (?, ?)');
$stmt3->execute(array(1, 'abc')); // 'total_amount'カラムに文字列を挿入しているため、エラーが発生する
// コミットする
$dbh->commit();
} catch (PDOException $e) {
// エラーが発生した場合はロールバックする
$dbh->rollBack();
echo 'Transaction failed: ' . $e->getMessage();
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
array, beginTransaction, catch, commit, dbh, dbname, echo, execute, getMessage, host, john.doe@example.com, localhost, mydatabase, MYSQL, PDO, PDOException, prepare, rollBack, setAttribute, VALUES,
phpのPDOでバインドする時、こうすれば楽。
2020.02.28
phpのPDOでバインドする時、こうすれば楽ですよね(・(ェ)・)という記述です。前の職場ではsqliでDB接続していたのですが、バインドして作られていたかは忘れてしまいました。ちなみに前の職場のPDOに改修するのは面倒くさいだろうなと感じます。何がめんどくさいかと言えば、今まで導入していたもの全てに対応するというのは、超面倒くさいと思います。
余談:
前の職場を何故辞めたかのお話します。突発的に辞めたと思う人もいるかもしれませんが、基本的に突発的辞めることはないです。突発的に辞めたかのように見えて前々から考えてきっかけを理由に辞めました。具体的な理由に関してはここでは書きません。突発的に辞めたかのように見せかけて計画的です(・(ェ)・)
ソースコードは下記になります。
<?php
ini_set("display_errors",1);
class mysql {
static $dbh = Null;
static $host = "localhost";
static $id = "あいーでぃー";
static $pass= "パスワード";
static $dbname = "test";
static $sql = array(
"id"=>array("data"=>PDO::PARAM_INT,"val"=>""),
"name"=>array("data"=>PDO::PARAM_STR,"val"=>"")
);
static function connect()
{
/* 接続状況をチェックします */
try {
static::$dbh = new PDO('mysql:host='.static::$host.';dbname='.static::$dbname.';', static::$id, static::$pass);
static::$dbh->query('SET NAMES utf8');
} catch (Exception $e) {
echo "Failed: " . $e->getMessage();
}
}
static function insert_query(){
//プリペアドステートメント
$stmt = static::$dbh->prepare("insert into test1 (id,Name) values(:id,:name);");
//バインド
foreach(static::$sql as $key=>&$val){
$stmt->bindParam(":$key",$val["val"],$val["data"]);
}
$stmt->execute();
$stmt = null;
}
static function update_query(){
//プリペアドステートメント
$stmt = static::$dbh->prepare("update test1 set Name= :name where id = :id;");
//バインド
foreach(static::$sql as $key=>&$val){
$stmt->bindParam(":$key",$val["val"],$val["data"]);
}
$stmt->execute();
$stmt = null;
}
static function select_query(){
//プリペアドステートメント
$stmt = static::$dbh->prepare("select * from test1 where id = :id;");
//バインド
foreach(static::$sql as $key=>&$val){
if($key==="id")$stmt->bindParam(":$key",$val["val"],$val["data"]);
}
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
printf ("%d (%s)<br>", $row["id"], $row["Name"]);
}
$stmt = null;
}
static function close(){
static::$dbh = null;
}
}
mysql::connect();
// for($i = 0 ;$i<=99;$i++){
// mysql::$sql["id"]["val"] = $i;
// mysql::$sql["name"]["val"] = "テスト$i";
// mysql::insert_query();
// }
for($i = 0 ;$i<=99;$i++){
mysql::$sql["id"]["val"] = $i;
mysql::$sql["name"]["val"] = "テスト<font color='red'>$i</font>";
mysql::update_query();
}
for($i = 0 ;$i<=99;$i++){
mysql::$sql["id"]["val"] = $i;
mysql::select_query();
}
mysql::close();
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, class, db, dbh, display, errors, ini, lt, MYSQL, PDO, php, quot, set, sqli, static, お話, きっかけ, コード, ここ, こと, ソース, バインド, もの, 下記, 人, 何, 余談, 全て, 前, 前々, 対応, 導入, 接続, 改修, 時, 理由, 職場, 記述,
PHPでバインドするこれでSQLの脆弱性が!?
2019.02.23
上記の画像では脆弱性がある。
PHPでバインドするこれでSQLの脆弱性が解決してくれる?
こういう記述すると良さげ。 おまけでSQLデバッグ方法を書いとります。
<?php
$sql =<<<SQL
select * from demo where id = :id and namae = :hoge;
SQL;
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$id = 123;
$hoge = "hoge";
$sth = $dbh->prepare($sql);
$sth->bindValue(':id', $id, PDO::PARAM_INT);
$sth->bindValue(':hoge', $hoge, PDO::PARAM_STR);
$sth->execute();
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$dbh->, dbh, dbname, execute, hoge, host, localhost, lt, MYSQL, PARAM_INT, PARAM_STR, PDO, php, prepare, SQL, SQL select, sth, test,