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

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

共有フォルダ上のCSVをサイトにtableタグで自動挿入させてみた

某事業会社さんでは、Excelで更新した表をHTMLの`

`タグに埋め込んでコーポレートサイトにアップロードする、という日次のルーティン業務がありました。

これを半自動化したので記事にします。

# 基本方針
長らく情シスで行っていた業務ですが、事務職で雇用しているパートさんに業務を移管したい。(というか自分はやりたくない)
かと言って、うっかりファイルを壊されたりすると情シスの仕事が増えてしまうので、サーバに専用のディレクトリを作成し、当該ディレクトリのみアクセス可能なFTPアカウントを作成、それをパートさんに渡します。
SFTP/SCPではありません。暗号化されていない従来のFTPです。
このご時世にFTPを使う理由は、Windowsの**ネットワークプレイス機能**でFTPサーバに接続するため。
エクスプローラでは普通の共有フォルダに見えるので難しいと感じさせず、運用をすんなりと受け入れてもらえます。
セキュリティ的にどうなのよ、という意見はあるのですが、そもそも公開データなので、暗号化する意味がありませんし、仮にパスワードが漏れても閉じたディレクトリにしかアクセス

PHP

# 大学で役立つアプリを作ろう(お茶会第1弾)
今回はとてもシンプルにwebアプリを作成しました。
xamppで気象庁のAPIから東京の天気を出力し、データベースを使用し掲示板的な用途を追加しました。

# 設定情報
データベース名はbbs-yt,テーブル名はgdsc-table,要素はcomment(Text型)とpostData(Data型)の2変数。
ユーザ名はrootでパスワードは無しで設定。

# デモ動画

無名クラス

## はじめに

無名クラスについてまとめる

### 無名クラス

その名の通り、名前を持たないクラス。
定義したクラスを後から利用しないことがわかっているクラスを定義するのに利用する。

#### メリット

・コードをシンプルに表現でき、見た目にも関連性を把握しやすい。
・式が許されている場所であれば、どこにでも記述できる。
・名前がないので、そもそも名前が競合する恐れがない。

#### 参考コード

`execute`メソッドでは、あらかじめ決められた前後の処理を挟んで、与えられた任意の処理を実行できるものとする。

“`php:class_anonymous.php
interface Runnable {
function run();
}

class MyClass {
public function execute(Runnable $rc) : void {
// ダミー処理(本来はなんらかの前処理を実装)
print ‘start…’;
// 利用者から指定された処理を実行
$

Laravelのメールをキュー投入してバックグラウンドで処理する

# はじめに
[前回の記事](ttps://qiita.com/fakefurcoronet/items/17323a2e11d3eb11c445)で2段階認証を実装したわけですが、[公式ドキュメント](https://readouble.com/laravel/9.x/ja/mail.html)にこんな記述がありました。

> 電子メールメッセージの送信はアプリケーションのレスポンス時間に悪影響を与える可能性があるため、多くの開発者はバックグラウンド送信のために電子メールメッセージをキューに投入することを選択します。

というわけで、2段階認証のコードを送信するメールをキュー投入してバックグラウンドで処理できるようにしたいと思います。

# databaseキュードライバの設定
今回、キュードライバはDBを選択します。
[公式ドキュメント](https://readouble.com/laravel/9.x/ja/queues.html)に従い、ジョブを保存するためのテーブルを追加します。

“`console
php artisan queue:table
“`
“`cons

Laravelで2段階認証(2FA)を実装する

# はじめに
現代において、もはやログイン認証の強化は必須と言っても過言ではないでしょう。

そこで今回は、サインイン時にユーザーのメールアドレス宛にコードを送信し、そのコードを入力しなければログインできない、2段階認証(2FA)の仕組みをLaravelで実装した際のコードを備忘録として記したいと思います。

## 前提条件
– メールアドレスの確認ロジックを導入済みであること
https://readouble.com/laravel/9.x/ja/verification.html

# DBカラムの追加
2段階認証時に使用するコードや、コードの有効期限、2段階認証の利用有無を管理するカラムをusersテーブルへ追加します。

“`console
php artisan make:migration add_two_factor_auth_fields_to_users_table –table=users
“`

“`php:database/migrations/2024_01_01_000000_add_two_factor_auth_fields_to_users_

PDO接続の2002:対象のコンピューターによって拒否されたための対処法

# エラー内容
PHPでのPDOを用いたDB接続において下記で接続できますが、つまずいたので残しときます。
“`
$dbh = new PDO(‘mysql:dbname=”データベース名”;localhost’, ‘ユーザ名’, ‘パスワード’);
“`
上記で接続を行うことができるはずですが画像の通り2002エラーがでました。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776357/43069d1c-7e03-e5e8-3226-b884ee854527.png)

# 対処法
“`
xmapp\phpMyAdmin\config.inc.php
“`
上記の場所にconfig.inc.phpというファイルがあるので探してください。
このファイルにポート番号があるので確認していきます。
“`
$cfg[‘Servers’][$i][‘host’] = ‘localhost:3305’;
“`
このように記述された点を探すと、ポート番号が”3305″になっていること

【CakePHP】MissingViewExceptionの対応方法

## はじめに
CakePHPでAPIを作成していてMissingViewExceptionが発生するため調べてみました。

## 結論
下記のコードを対象のメソッドに追加すると解決しました!
“`PHP
$this->autoRender = false;
$this->autoLayout = false;
“`

## ChatGPT曰く
>ビューの自動レンダリングが有効な場合: $this->autoRender がデフォルトの値である true のままだと、アクションメソッドがビューファイルを自動的にレンダリングしようとします。そのため、アクションメソッドに対応するビューファイルが存在しない場合、ファイルが見つからないというエラーが発生します。

>レイアウトの自動適用が有効な場合: $this->autoLayout がデフォルトの値である true のままだと、アクションメソッドがレイアウトを自動的に適用しようとします。そのため、レイアウトファイルが存在しない場合、またはレイアウトの設定に問題がある場合、レイアウトが見つからないというエラーが発生します。

とのことで

ゼロからまなぶプログラミング原理 (副題: 初期値はnullか空の値か?)

## はじめに

クラスのメンバー変数にタイプヒントを使用しなかった過去のphpには、メンバー変数に直接初期化値を入れない限り、デフォルトでnullが初期値になりました。この傾向から、変数の初期値を空の値ではなくnullに設定するケースが多かったです。

“`php
class DefaultMember { public $variable; }
var_dump((new DefaultMember)->variable); // Null
“`

タイプヒントが導入される以前の過去のphpでは、多くの場合、変数は単に値を保存するために使用されました。変数を宣言する前に、変数をどのように使用するかについての意図を考えて作成されるべきですが、タイプに対する意識なしに何かを作成する必要があるから変数には適当な値が入って、意図なしで変数が宣言されたので多くの場合初期値としてnullを使用するケースが多かったです。このような昔の慣行で、現在でもnullを初期値として使用するケースがあります。

phpでタイプヒントが登場し、変数にnullを使用するために`?T`や`null | T`な

OpenAIをAPI利用するPHPとjavascript

# OpenAI Assistants

ChatGPTをはじめとするAIっておもしろいですよね。
MyGPTsも良いですが、エンジニアとしてはAPI利用したいケースの方が多いと思います。
APIからGPTsを利用するために、AssistantsでInstructionsを作りますが
いざAPIを使おうとするとthreadとかmessagesとかrunsとか・・・色々クセを理解しないと
API利用するのも一苦労です。

ってことで、簡単にAPIを利用できるように**ライブラリ化**しました。
しかも、バックエンドとフロントエンドがたった1つのファイルで使えるお手軽さ(!)
リポジトリを公開しましたので、即利用したい方は以下からどうぞ。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 https://github.com/tri-comma/OpenAI_PHP_JS
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

## 解説

1つのファイルでPHPとjavascript??:thinking:
はい、そうです。GETとPOSTでレスポンスを切り替え

Laravel Duskでブラウザテストを行う

### 開発環境
– Windows 10 Pro(64bit)
– PHP 8.1.9
– Laravel 10.10
– Laravel Dusk 8.2

Laravel Duskとは、ブラウザテストを自動化するためのLaravelのパッケージです。今回は、インストールしてから、簡単なテストをするまで記事に書きます。

1.[Google Chrome](https://www.google.co.jp/intl/ja/chrome/browser/welcomeback.html)の最新版をダウンロードして、バージョンを確認してください。確認方法として、僕の開発環境では、**C:\Program Files (x86)\Google\Chrome\Application** ディレクトリ内の**124.0.6367.119**ディレクトリがありますので、これがバージョンとなります。

2.以下のコマンドをプロジェクトのルートディレクトリで実行
“`bash
composer require laravel/dusk –dev
“`
3.ChromeDriverをインストー

【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善

大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。

## プロダクト使用技術
– AWS EC2 (t3.medium)
– AWS S3
– PHP (Laravel)
– poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
– Golang ⇒ 改善のために使用

## 開発機能詳細

ピッチ資料を生成する機能です。

https://www.hear.co.jp/recruit/saiyoupitch-100sen

機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画

PhpModbus を使う

[PhpModbus](https://code.google.com/archive/p/phpmodbus/)

https://code.google.com/archive/p/phpmodbus/

PHPからModbusをアクセスする場合に便利なPhpModbusですが、2013年7月以後、エンハンスがされていない様子。まあ枯れた分野なので、ユーザ・サイドからしてもエンハンスしていただく必要はありません。
ただし、最終リリース版 0.8.r106 でも、そのままでは現在のPHPバージョンでは動きません。クラス ModbusMaster だけを使う限りでは、1ステップだけ修正する必要があります。他のクラスを使ったことはないので、他のクラスではどうなるのかは知りません。
1ステップだけの修正なので、エラーになっても臆せずに修正して使用してみてください。

## なにが問題なのか
最終リリース版 0.8.r106 しか使用したことがありませんが、コンストラクタ名称に起因するエラーが発生します。
PHP4までは当然であった「コンストラクタの名称はクラスの名称と同じ」は、現在のPHP

シンボリックリンクに悩まされた

Laravelで画像を表示させるところで詰まったのでシンボリックリンクの学習も兼ねて忘備録

シンボリックリンクにハマる人は多いみたいでたくさんの方が記事をあげてくれていて、本当にありがたい。
その足しにでもなれば。

Laravelでは画像を表示させる際に必要なシンボリックリンクというものがある。
[【Laravel】画像を保存して表示する方法](https://inouelog.com/laravel-image-display/)


[【Laravel】”storage/app/public”に配置した画像へアクセスしてみる](https://tektektech.com/laravel-storage-app-public/#google_vignette)



# シンボリックリンクとは
>オペレーティングシステム(OS)のファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。
[シンボリックリンク 【symbolic link】 ](https

インターフェイス

## はじめに

インターフェイスについてまとめる

### インターフェイスとは

配下のメソッドが全て実装を期待/強制するメソッドであるクラスのこと。
中身を持つメソッドやプロパティを定義できず、アクセス修飾子の指定もできない。

#### インターフェイスと抽象クラスとの違い

インターフェイスでは多重継承ができる。
抽象クラスでは多重継承はできない。

多重継承が可能なことで、メソッドを目的に応じて様々なインターフェイスに振り分け、サブクラス側では必要なメソッドを含むインターフェイスだけを選択的に継承(正しくは実装)する、ということができる。

#### インターフェイスの役割

インターフェイスの利用者に契約内容を約束し、裏側の実装を隠す。
そして、実装者にはその契約を守ることを求める。

#### 参考コード

`Triangle`クラスで`IFigure`インターフェイスを実装している。

“`php:IFigure.php
interface IFigure
{
function getArea(): float;
}
“`

“`php:Triang

抽象クラス

## はじめに

抽象メソッド/クラスについてまとめる

### 抽象メソッドとは

サブクラスでオーバーライドされることを期待/強制したメソッド。
また、抽象メソッドを含んだクラスのことを抽象クラスという。

#### 参考コード

抽象メソッドを定義するには、`abstract`修飾子を使う
抽象メソッドはサブクラスで必ずオーバーライドされるべきメソッドなので、スーパークラスの側では中身を持つことはできない。

“`php:Figure.php
abstract class Figure
{
protected float $width;
protected float $height;

public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}

protected abstract function getArea(): float;
}

ポリモーフィズム

## はじめに

ポリモーフィズムについてまとめる

### ポリモーフィズムとは

同名のメソッドで異なる挙動を実現する。
多態性と訳される。

#### 参考コード

“`php:Figuer.php
class Figure
{
protected float $width;
protected float $height;

public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}

public function getArea(): float
{
return 0;
}
}

“`

“`php:Triangle.php
require_once ‘Figure.php’;

class Triangle extends Figure
{
public function getArea()

Laravelでページネーションを試したメモ

## はじめに
https://qiita.com/kenji123/items/a78e85ffc9309fad10bb
Laravelのコレクションに対し、ページネーションの使用を行っています。
今回のケースでは、データベースから直接ページネーションするのは断念し、Laravelのコレクションを使用してデータを処理し、その後でページネーションを適用しました。

## SQL vs コレクションベースのページネーション

通常、データを効率的にページネーションするためには、データベースクエリ自体で`paginate()`メソッドを使用するのが最も効率的です。これにより、必要なデータのみがデータベースから取得され、アプリケーションへの負荷が軽減されます。

しかし、データの加工が必要でクエリだけではページネーションが困難な場合は、データベースから全データを取得してからコレクションを使って加工し、`forPage()` メソッドや `slice()` メソッドなどを用いて手動でページネーションを行うことができます。

## コレクションベースでの対応

ID取得後、ページネーション適用に

【PHP】マイナーフレームワーク「Flow」を試してみる~テンプレートエンジン編~

# 初めに
Flowでフロントエンドを実装する場合、テンプレートエンジンを用いて動的なHTMLファイルを作成することができます。今回は、Flowのテンプレートエンジンである「Fluid」の基本的な使い方をまとめていきます。

# Flowのテンプレートエンジン”Fluid”

動的ページを作成する場合、Controllerで取得した値を画面に表示したいということがあるかと思います。
Flowでは、Fluidというテンプレートエンジンを利用することで、ControllerからHTMLに値を渡すことができます。

## イメージ

こちらは、あるブログ投稿サービスを例に、投稿した内容が表示されるようなHTMLファイルの例です。
([Flowの公式ドキュメント](https://flowframework.readthedocs.io/en/stable/TheDefinitiveGuide/PartIII/Templating.html#what-does-it-do)から拝借しました)

“`html
{namespace f=Neos\FluidAdaptor\ViewHelpers

【Laravel】Eloquentで更新をかけるとIllegal offset typeが発生する

# 発生した問題
以下でDBの更新、新規データ登録をしようとすると「Illegal offset type」が発生した。

“` php
public function updateSkillAction($datas,$skillId){
for($i=0; $i< count($datas->action_index); $i++){
if($datas->exist_action_flag[$i] === 1){
SkillAction::where([
‘skill_action_id’=>$datas->skill_id,
‘action_index’=>$datas->action_index[$i]
])->update([
‘skill_action_name’ => “スキルアクション名”,
‘skill

【Laravel】FormRequestでバリデーション前に入力値を加工

# 環境
Laravel10
Windows11

# 目的
Postmanでform-dataを使用し、Requestを送信。受け取った値を加工したい。

・string型をint型へ変換
・array配列の中身をint型へ変換

# 公式ドキュメント
https://readouble.com/laravel/8.x/ja/validation.html

# prepareForValidation()
prepareForValidation()を使用することで、バリデーション前にデータを加工できる。

“`php:TestRequest.php

protected function prepareForValidation()
{
$this->merge([
‘subject_id’ => (int) $this->subject,
‘class_ids’ => array_map(‘intval’, $this->class_ids),
‘public_scope’ => (bool) $this->public