PHP関連のことを調べてみた

PHP関連のことを調べてみた

【PHP】マイナーフレームワーク「Flow」を試してみる~キャッシュ編~

# 初めに
以前[こちら](https://qiita.com/nnhkrnk/items/3e3caab707a30314e6de)の記事を書いた際、Flowではリフレクションデータを実行時にキャッシュしていると知りました。今回はFlowにおけるキャッシュの扱い方について調べてみました。

# Flowにおけるキャッシュ処理

Flowには、キャッシュ処理を実現するために重要な要素が3つあります。
* **Cache Frontend Interface**
* **Cache Backend Interface**
* **Cache Manager**

それぞれの要素について説明する前に、この3つの関係性をなんとなく把握しておきましょう。
以下のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/59a7acac-57f5-9698-b96c-814412b26301.png)

それでは、重要な3つの要素について解説します。

## Fron

元記事を表示

QRコードを印刷 HTML+JavaScript on CakePHP5

CakePHP5 を只今使用中。

### QRコードはこちらのライブラリで。
https://davidshimjs.github.io/qrcodejs/

58㎜幅のレシートプリンタが接続されている想定です。

### 印刷ボタン(呼び出す側)
“`
Url->build(‘/kegs/qr/’ . $ledger->keg) ?>”
>

“`
単純に _blank でリンクを張ります。

### 印刷ページ(呼び出される側)
“`
disableAutoLayout();
?>


CakePHP5 WEHE句でのbind

## WHERE id NOT IN(SELECT id FROM xxx WHERE code=?) こんなクエリを作りたい

> https://book.cakephp.org/5/ja/orm/database-basics.html#id15
> ステートメントを準備する
あなたは execute() か prepare() でステートメントオブジェクトを生成できます。 execute() メソッドは引き継いだ値をバインドしたステートメントを返します。 それに対して prepare()
は不完全なステートメントを返します。

ConnectionManager::get(‘default’) して、prepare して bind して… とあれこれ試してみたもののシンプルに書けなかった。
## シンプルな方法
“`
$rows = $this->Xxx->find(‘all’)
->where(‘Xxx.id NOT IN (SELECT id FROM xxx WHERE code = :code)’)
->bind(‘:code’,$code,’integer’)

元記事を表示

CakePHP Form シンプルHTMLタグを出力して~~

$this->Form->create();
$this->Form->control();
$this->Form->submit();
大変ありがたい機能です。
…が、便利な反面おせっかいなHTMLタグに悩まされることも。
## シンプルな を出力したい!
“`
Form->setTemplates([‘inputContainer’=>'{{content}}’, ‘submitContainer’=>'{{content}}’]);
?>
“`

以上!

元記事を表示

CakePHP5 モデル の メソッド・定数 どこに書く?

CakePHPはモデルがTableとEntityに分かれています。別のフレームワークではモデルが1つのことが多かった。さて、どうしようか。

> テーブルオブジェクト がオブジェクトのコレクションへのアクセスを表し、提供するのに対し、 エンティティーは個々の行やドメインオブジェクトを表します。エンティティーは保持するデータにアクセスして 操作するための永続的なプロパティーとメソッドを保有しています。

https://book.cakephp.org/5/ja/orm/entities.html#namespace-Cake\ORM

、、となると、エンティティかな。定数はテーブルかな。

ただ、DB仕様変更が多いから、bin/cake bake model … で、チャチャっと更新したい。なので、エンティティに書くのは最小限にしたいなぁ。できれば1か所にまとめたいなぁ。

ということで、

### CRUD の R のみ ならエンティティ
「レコードの状態から判定する」とか「アラート表示をつくる」とかの「データ更新を伴わないもの」はエンティティ
1. コントローラーやビューで短いコー

元記事を表示

Stripe PHP SDK Custom子アカウントに紐づく外部口座の口座番号末尾4桁を取得

## 概要

Stripe PHP SDKにてCustom子アカウントに紐づく外部口座の口座番号末尾4桁を取得する方法をメモ的にまとめる。

## 方法

下記のように記載することで取得できる。

“`php
$stripe = new \Stripe\StripeClient(‘sk_test_51OAW2lEwNfmSaNN2fe6Iq27lX3sopoE0LGTk0Uhu6m59eU7nXyQmsOHioJktPtxJRPZRkBCu5tURURmyZpKeI2ej00cFrSfeed’);
$account = $stripe->accounts->retrieve(‘acct_1OezMbImLSY2PRF5’, []);
$externalAccounts = $account->external_accounts->data;

foreach ($externalAccounts as $externalAccount) {
$last4 = null;
if ($externalAccount->default_for_currency && ($e

元記事を表示

PHP 型を知る

phpで変数の型を比較したい時などあると思います。

## gettype関数を使う
gettype関数は引数の型を文字列として返してくれます。
“`php
$number = 5;
$numberType = gettype($number);

var_dump($numberType);
“`
“`
string(7) “integer”
“`

if文とかで活躍しそうですね。

元記事を表示

PHP 変数の型変換

変数の型変換方法です。
“`php
$number = “580”;
var_dump($number);

$number = (int)$number;
var_dump($number);
“`
“`
string(3) “580”
int(580)
“`
以下のようにすることで入力される値に対しても型の指定が可能です。
“`php
$number = (int) trim(fgets(STDIN));
“`

簡単でしたね。

元記事を表示

PHP連想配列操作まとめ

便利だなと思った連想配列の関数をまとめてみました。
自分の備忘録的な感じで残しておきます。
良かったら参考にしてください。

## array_column
連想配列から特定の要素のみを取り出します。

第1引数に配列、第2引数に取り出したいキー名を指定します。

“`php
1, ‘name’ => ‘久保’, ‘hobby’ => ‘サッカー’],
[‘id’ => 2, ‘name’ => ‘佐藤’, ‘hobby’ => ‘野球’],
[‘id’ => 3, ‘name’ => ‘山田’, ‘hobby’ => ‘料理’],
];

var_dump(array_column($row, ‘name’));
// array(3) {
// [0]=>
// string(6) “久保”
// [1]=>
// string(6) “佐藤”
// [2]=>
// string(6) “山田”
// }

?>
“`

加えて第3引数を指定すると、あるフィールドをキー、あるフィ

元記事を表示

【Laravel9対応】LaravelのSMTPサーバを動的に設定する

# 何がやりたいのか
– ユーザーが設定したメールアドレスから自動送信を行うシステムを作っている。
– .envで設定したメール設定ではなくて、データベースに登録された各ユーザーのメールサーバー情報を使い動的に設定を変えて送信する。

Laravel9ではSwiftMailerが使えなくなったため、[こちらの方法](https://qiita.com/nakahara-d/items/9a4c870839741dde8f93)で実装できなりました。
そのため別のやり方を解説します。

# 代替案Symfony Mailerを使う。

“` ruby:DynamicMailService.php

元記事を表示

CSVファイルアップロードが上手くいかない時の解決策

## 起こったこと
PHP(laravel)でCSVアップロード機能を作成していたところ起こった事象。
CSVファイルのn行目のヘッダーの内容を確認しデータをDBに保存するという機能を作成していたのだが、ヘッダーの1列目を認識してくれないエラーが発生。
しかし、該当のCSVファイルはExcelから「名前を付けて保存」すると発生せず、正常にアップロードされるため困り果てていた。
CSVファイルの権限によるものではないかと考え調査していたが、めぼしい調査結果は得られずにいた。

## 原因
WinMergeで、元のファイルと「名前を付けて保存」し直したファイルを比較したところ、原因が発覚。
原因は「空行」だった。
実はCSVファイルデータのn-1行目には空行が入っており、それがSplFileObject::SKIP_EMPTYによって読み飛ばされていたことで、n行目のデータではなくn+1行目をヘッダーとして認識してしまい、それによりヘッダーが認識されずエラーが発生していたのだ。

“`php:修正前データ
$file->setFlags(
\SplFileObject

元記事を表示

miseを使って複数のPHPバージョンをインストールする

# やりたいこと
– Macで
– 簡単なインストールで
– php8.1とphp8.2をインストールし
– php8.1なプロジェクトにcdしたらphp8.1を使いたい
– php8.2なプロジェクトにcdしたらphp8.2を使いたい

# mise
– https://github.com/jdx/mise
– The front-end to your dev env.
– mise (pronounced “meez”)
– mise was formerly called rtx.

asdfとの比較

– asdfはランタイムを呼び出すときにオーバーヘッド(~120ms)かかるが、miseはプロンプトがロードされるときに少量のオーバーヘッド(~5ms)を追加する。
– [参考](https://mise.jdx.dev/dev-tools/comparison-to-asdf.html#:~:text=mise%20adds%20a%20small%20amount%20of%20overhead)

元記事を表示

xサーバーのsmtpサーバーを使ってlaravelからメール送信

やりたい事。
xサーバーのsmtpサーバーを使ってメールを送信したい。

## xサーバーでメールアドレス作成

![スクリーンショット 2024-02-02 133110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/f6ec7e02-378c-3406-b78c-c3f217eb7967.jpeg)

![スクリーンショット 2024-02-02 133415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/e99491ab-ec81-5909-9eb4-781496d04d35.jpeg)

## .env編集
“`
MAIL_MAILER=smtp
MAIL_HOST= ⓷ sv*****.xserver.jp
MAIL_PORT=465
MAIL_USERNAME= ⓶ ****@mail.com
MAIL_PASSWORD= ⓵ ****
MAIL_ENCRYPTIO

元記事を表示

【PHP/MySQL】データベースを組み込んだホームページを全世界に公開する。

こんばんは。

以前から、phpやSQLを使ってホームページを制作し、公開してみたいと思っていましたので、サーバーを借りてサンプルを作成しました。

Webプログラミングに関する書籍は多くあります。
書いてある内容通りに実装すると、ローカルでphpやsqlを使ったページを作成する事はできますが、公開する方法までは書いていない事が殆どです。
せっかくなので自分の作品を公開したいですよね。自分でプログラミングしたホームページだったら、思い入れも深そうです。

触発されたのは、地元の図書館のホームページです。毎週何気なく利用していますが、書名を入力するとDBから書誌の情報を参照して表示させています(たぶん)。
図書館のように膨大なデータはありませんが、こういう動きをするサイトを自分で作ってみたいと思ったのです。

https://www.tokorozawa-library.jp/

# 0.目的
・SQLを使ってDBを操作する。
・単純な仕組みで良いので、データベースを使った動的なページを作成する。
・それを本記事と全世界に公開する。

# 1.作るもの

まずは超簡単に、自分の体重を登

元記事を表示

素数判定関数を使って簡単なゲームを作った話⑤

ご覧いただきありがとうございます。
この内容は、複数に分けて投稿しています。全体をご覧になりたい方は、以下のリンク先よりご確認ください。

https://qiita.com/hitoki_univ/items/8e3feab0add17befc700

前回の内容は、こちらからどうぞ。

https://qiita.com/hitoki_univ/items/c47836e9f418af6b1eb8

# 今回やること
前回までで、ゲームの基本動作の部分はすべて完成しました。
今回は、ゲームプレイ時に集めたデータを集計し、過去のランキングを表示する機能を作成します。

# データベースの作成
ランキングを集計するためには、データベースを作成し、ゲーム実行ページと接続することが必要です。
今回は、phpMyAdminを使ってデータベースを作成していきます。

今回記録したい内容は

1.記録が残された日時(date)
2.そのゲームでの最大の素数(biggest_prime_num)
3.それを入力したプレイヤー名(player_name)

の3つです。2の素数はINT型の整数、プレ

元記事を表示

LaravelでGoogle Two-Factor Authentication(2FA)を導入する方法

# Google Two-Factor Authentication(2FA)の導入方法

Google Two-Factor Authentication(2FA)の導入をしたのでその備忘録

## Google2FAパッケージのインストール

まずは、Google2FAパッケージをインストール

“`bash
composer require pragmarx/google2fa-laravel
“`

こちらのライブラリ
https://github.com/antonioribeiro/google2fa-laravel

## 設定

Google2FAパッケージをインストールしたら、Laravelの設定ファイルを公開する

“`bash
php artisan vendor:publish –provider=”PragmaRX\Google2FALaravel\ServiceProvider”
“`

## middlewareの設定

app/Http/Kernel.php
上記のKernel.phpファイルに下記を追加

“`php
protected

元記事を表示

[PHP]xamppでmb_send_mail

# 概要
xamppでgmailからメールを送信する際の設定方法です。

# google
1.googleのアカウント設定の「セキュリティ」から2段階認証プロセスをオンにする。
2.2段階認証プロセス画面の一番したにある「アプリパスワード」を設定。
表示されたパスワードを再確認することはできないのでメモしておく。

# xampp
1.\php\php.iniの[mail function]で`sendmail_path`を編集。
php.iniは念のためにバックアップする。
自分はxamppをDドライブに入れているので`”\”D:\xampp\sendmail\sendmail.exe\” -t”`となる。
2.sendmail\sendmail.iniを編集。
“`:
smtp_server=smtp.gmail.com
smtp_port=587
auth_username=hoge@gmail.com
auth_password=**** **** **** ****
force_sender=hoge@gmail.com
“`

元記事を表示

withValidatorでいろいろできる

今回はLaravelのFormRequest内で使える`withValidator`メソッドについて紹介します。FormRequestはリクエストパラメータに対してバリデーションルールの定義などをできるクラスですが、今回紹介するwithValidatorを使用することで、より融通の効くカスタムバリデーションルールを定義できます。

## 基本的なバリデーションの定義

まず通常のFormRequestでバリデーションを定義するには`rules`メソッドを使い、必須項目か、一意とするか、最大何バイトかなどが設定できます。以下は単体レコードのinsertもしくはupdateを想定しています。

“`php
public function rules()
{
return [
‘title’ => ‘required|unique:posts|max:255’,
‘body’ => ‘required’,
];
}
“`
業務でのことですが、とあるapiでリクエストされたの中に以下のような構成のレコードが合わせて送られてきました。

“`

元記事を表示

mysqliを使ってmysqlに接続してみる

以前PDOクラスを使用してmysqlに接続してデータベースを操作する方法を書きました。今回はmysqliを使ってphpからmysqlに接続する方法を書きます。
よく考えたらPDOクラスの方が汎用性高いのでこっちの記事を先に書くべきだったかもですね。
自分用のまとめなので間違いや省略などあります。間違いに関しては指摘していただけると幸いです。

## データベースに接続
mysqli_connect関数を使用してデータベースに接続します。また、接続できたらtrue、できなかったらfalseが帰ってきます。
“`php
$link = mysqli_connect(‘host’,’user’,’password’,’DB’);
//引数はホストorIPアドレス、ユーザ名、パスワード、データベース名
“`
## 接続に失敗した時エラーを出力
なにかしら問題があってエラーが発生した時はmysqli_connect_error関数を使ってエラーを出力します。

“`php
if(!$link){
echo “エラー : データベースに接続できませんでした。” . PHP_EOL;

元記事を表示

WordPressコンテンツ内の画像をsrcsetを使った出し分けに書き換える

#はじめに
WordPressで表示している内容をRatinaに対応するようにしてほしいと依頼された。
ブロックエディタの画像やサムネイルであれば自動で出し分けされるようだが今回はまとめてHTMLで記述されている。
なんとかしてimgファイルを置換すればいいかな。

#解決方法
WPテーマ内のfunction.phpに以下のコードを追加
“`function img_to_multi($text){
//画像タグを抽出
$pattern = ‘//i’;
preg_match_all(‘‘, $text,$result);

$target = array();
$replace = array();
foreach($result[2] as $i=>$img_base){
$img = $img_base.$result[3][$i];
//画像

元記事を表示

OTHERカテゴリの最新記事