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

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

あなたの作った画像アップローダー、投稿者の個人情報ダダ洩れだよ!

# 自前のアップローダーで起きる問題

## 開発者 ――
インフルエンサーとファンをつなぐコミュニティサイト「Qitter」を作ったぞ!
テキストと画像をPOSTするだけのシステムだから、全部自前の実装で作っちゃったぞ。

![job_programmer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/c22ba9e5-5df0-8906-6dbf-ca44cccc30b2.png)

## 投稿者 ――
今日もQitterに投稿しなくちゃ!
「晩ご飯なう!」

![photo_jidori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/be600a9a-44fa-5be4-6d0b-353de9dec033.png)

## 閲覧者 ――
「推しちゃんの投稿キター!」
「推しちゃんの投稿した画像は全部保存しちゃうぞ!」

![kanki.png](https://qiita-image-s

元記事を表示

ドメイン駆動設計(DDD)とクリーンアーキテクチャの違いについて覚え書き

[こちら](https://qiita.com/remi_ts/items/cf6d1b3b131db4cd1e79)の記事にも書いた事のおさらいと補足。
その後、サンプルプログラムによる差異を掲載。

# 二つの違い

:::note info
ドメイン駆動設計(DDD)
焦点
DDDは、複雑なビジネスロジックの専門知識をソフトウェア設計の中心に置き、ドメイン内での言語(ユビキタス言語)やモデルを重視

主要概念
* ドメインモデル
ビジネスドメインの概念とその関係をモデル化したもの。
* ユビキタス言語
ビジネスと開発チーム間のコミュニケーションギャップを埋める共通言語
* 集約
関連するオブジェクトの集まりで、一貫性のある変更単位を提供

メリットとデメリット

利点
ビジネス要件と密接に連携した設計が可能。

欠点
* 複雑性
ビジネスロジックが複雑なアプリケーションに適している分、小規模あるいは単純なアプリケーションでは過剰となる。
* 実装の難

【PHP8.3】ランディングページが日本語訳されてなかったので深い悲しみに包まれた

[PHP8.3のランディングページ](https://www.php.net/releases/8.3/)がありますね。

右上のChange languageに日本語がありませんね。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/86f5c968-9802-a18c-fabf-889824e4204f.png)

深い悲しみに包まれたので増やした。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/eb7a4ef4-3541-d577-3c91-d537afc638fa.png)

# fork

ランディングページの最下段、`View Source`ってところから[ドキュメントのソース](https://github.com/php/web-php)に進めます。
そこで右上の`Fork`ボタンを押せば、自分のスペースにforkされます。

# branch

作業用にブ

microCMS × PHP レンタルサーバーで構築

## お客さんのレンタルサーバー
クライアントが用意したレンタルサーバーへftp接続している状況でmicroCMSを使用したい、というパターンではJamstack構成を組めない。

PHPが使用できるなら、それが最も手っ取り早くmicroCMSを組むこめる方法かもしれない。

## microCMSが提供しているSDKを利用するべきか
microCMSでは、PHPを使用するためのSDKが用意されている。
しかし、このSDKを利用するためには、composerというPHPのバージョン管理アプリが必要となる。

このcomposerを、**人さまのサーバーに勝手にインストールしてよいはずがない。**

## SDKを利用せず、PHPのみの実装
SDKは使わないでPHPだけで書く方法はあって、それは簡単に実装できた。
一覧ページと個別ページだけなら、2ファイルだけで済む。
実際にはAPIキーの隠蔽は別途行うのでアクセス権限を設定したディレクトリに変数を格納しておく必要があるが、わかりやすく2ファイルだけにすると以下のようになる。

### 一覧ページ

“`archive.php

LaravelでAuth::attempt()には’password’を渡すこと

## 前書き
以下の環境で実行した内容となります。

– PHP 8.2
– Laravel 10.31.0

## 背景
Laravel10を使って開発中、認証機能を使いたいものの既存テーブルにあるユーザー情報を活用したいと思いました。
そのまま利用してもLaravelのusersテーブルを探しに行ってしまうので、既存テーブルに指定すればよいと楽観視していました。
ここでは例として以下のような構造とします。

テーブル名:login
| userID | pass |
|:-:|:-:|
|user1|\\$2y\\$..|

## 変更点

– Models\User のクラスにテーブルを指定
– テーブル構造が異なるのでその他設定を追加

“`
class User extends Authenticatable
{

//既存のログインテーブルを使う
protected $table = ‘login’;
protected $primaryKey = ‘userID’;
//remember_tokenはないためfal

【Laravel】「500エラー」時はDB接続を確認!

## 環境
Laravel v9.5.1 (PHP 8.1.2)
AWS
Fly.io(サーバー)
Supabase(データベース)

## 要約
500エラーはDB接続が上手くいっていないときに起こりやすいので、環境変数などをもう一度確認しよう

## 問題
PHPの練習がてら、Xのクローンアプリを作成。いざFly.ioでデプロイを試みる。
![a08be6b8c3ba304fd4b220099ac40d41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620668/0b2a43b0-85e5-adf8-189e-9b8684449d9f.png)
おっ、ローカル環境通り上手くいったのでは???
という淡い期待もつかの間、ログイン情報を入力後の画面で「***500 | SERVER ERROR***」が表示された。
![80ce346364a562718ad8ec21ffab3e8f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaw

PHP ファイルの内容をブラウザに表示し、意図的に文字化けさせたい場合

# PHP ファイルをあえて文字化けさせたかったのだが・・・
* PHP ファイルの文字コード:UTF-8
* PHP ファイル内の `` の charset:Shift_JIS

上の条件で、PHP ファイルを表示して文字化けを起こそうとした。しかし、結果は **文字化けせず**。「?」となったが、**原因は単純だった**。

![article4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3601609/6379344d-9326-d514-90e8-57252e82752a.png)

### ブラウザの表示
![article4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3601609/03e62ce4-fcf9-346d-21e8-8972c3eae71f.png)

### 使用環境
Windows + Apache + PHP
ブラウザ:Google Chrome

# 文字化け

Laravel(PHPのフレームワークの1つ)CSS罠 ※CSSは当たっていても反映されないときがある件

 昨年度前職で体調を崩したことをきっかけに、紆余曲折を経てなんやかんや、プログラミングを学び始め、数学がそこそこ得意だったこともあって(?)とりあえず、半年強は学習を継続できている、駆け出しエンジニア(できればデータサイエンティスト)か「第一の読者」になりたい離職中・転職活動中の32歳の未だに少年ジャンプ・マガジン・小学館を読んでるおっさんです。以下間違いあれば遠慮なくご指摘下さい m ( _ _ )m

(※今は、とあるプログラミングスクールの学習カリキュラムを修了し、某コミ二ティの現役エンジニアの方々に諸々教えてもらっています。ちなみにそこの代表の方は、勤労感謝の日が誕生らしいです。勤労に感謝m(_ _)m)

Laravelは個人的に一番CSSが沼でした。

 私は、Progateと↓の本から、HTML&CSSから、プログラミングを始めたのですが、その後、上記の某プログラミングスクールで、PHP、Laravelを中心にプログラミングの学習カリキュラムを受けました。そのときに感じたというか、個人的に沼にはまり溺れたLaravelでCSSで当てるときの注意点をいくつか挙げま

変数のスコープ JavaScriptとPHPの違い

## JavaScript(letとconst)
1. {}でエリアが形成される
1. 内のエリアで、外のエリアで宣言された変数を扱うことはできる
1. 外のエリアで、内のエリアで宣言された変数を扱うことはできない
1. 外の複数のエリアで同名の変数が宣言されているとき、最も近いものが扱われる
#### 3. 内のエリアで、外のエリアで宣言された変数を扱うことはできる
“`test.js
const a = ‘aaa’
{
console.log(a) // aaa
}
“`
#### 2. 外のエリアで、内のエリアで宣言された変数を扱うことはできない
“`test.js
{
const b = ‘bbb’
}
console.log(b) // ReferenceError: b is not defined
“`
##### 4. 外の複数のエリアで同名の変数が宣言されているとき、最も近いものが扱われる
“`test.js
const a = ‘a1’, b = ‘b1’
{
const a = ‘a2’
console.log(a, b)

【PHP】マイナーフレームワーク「Flow」を試してみる~DB接続&データ登録編~

# 初めに
前回は[こちら](https://qiita.com/nnhkrnk/items/2b9f647d6130a098345f)の記事でマイナフレームワークFlowを使った簡単なAPI作成を行いました。
今回はMySQLにデータを登録するAPIを作成していきます。

# FlowにおけるDB接続処理
Flowはdoctrineと呼ばれるORMを内包しています。
今回はこのライブラリを用いてTBL作成やDB接続を行っていきます。

https://www.doctrine-project.org/

## doctrineでできること
doctrineはORM形式でDB操作を行います。
具体的には以下のような特徴を持ちます。
* SELECTなどのDMLを記載する必要がなく、doctrineで用意されているメソッドを利用してDB操作を行う。
* 事前のテーブル作成が不要。1つのTBL対応するデータクラスを作成し、doctrine のmigrateコマンドを実行することでTBL作成を行う。

# DB接続試してみた
ということで、DB接続を行うAPIを作成していきましょう。
今回は

LaravelのEloquentでorderByを使うとメソッドチェーンの補完が効かなくなるわけについて備忘録

以下のようなページングを想定した一覧情報を返すAPIコントローラ処理を書いていた時のこと
“`php:ArticleController.php
private const PER_PAGE = 30;

public function index(IndexRequest $request): AnonymousResourceCollection
{
$query = Article::query();
// withとかwhereとかいろいろ省略
$articles = $query->paginate(self::PER_PAGE);

return ArticleResource::collection($articles);
}
“`

一覧について「作成日の降順で取得」という仕様が抜けてたので以下のように修正しました

“`diff_php:ArticleController.php
public function index(IndexRequest $reque

phpenv install で発生したエラーと解消方法

# はじめに
– 普段、PHPを書くことが多いのですがプロダクトによってPHPのバージョンが異なるので簡単にバージョンを切り替えられるようにphpenvのセットアップを行いました
– `phpenv install`でPHPをインストール時、`エラー → 解消 → エラー → 解消 → …`をひたすら繰り返しかなり疲弊しました…(特に7.x系)。ので、インストール成功までに実施したことをマシン交換時などに困らないようここに書き留めておきます

## 環境
– macOS Monterey 12.7
– Apple M1
– zsh 5.8.1 (x86_64-apple-darwin21.0)
– anyenv経由でphpenvインストール済み

## PHP7.3.33インストール時に発生したエラーと解決方法
– 環境変数のオプション指定について
– `~/.anyenv/envs/phpenv/plugins/php-build/share/php-build`配下にある`default_configure_options`というファイルに記述する方法もあるみたいな

【個人開発】マイクラの建築物配布サービスを作ったメモ

## きっかけ
今年9月から無職になったので、以前からあたためていたサービスをつくってやろうと思い立ちました。

## つくったもの
https://poscra.com/

マイクラ統合版のPC版では(統合版とはって感じですが)、ストラクチャーブロックによって作成した建築を外部ファイルとしてエクスポートできます。
また建築物の3Dモデルのエクスポートもでき、3Dviwerなどでぐりぐり観察することもできます。
それらをつかってマイクラ建築のカタログみたいなものをつくりたいと考えました。

## 技術スタック
### アプリケーションフレームワーク
当初はNextJSを使おうと思っていました。
しかし、まちがったイメージかもしれませんがNextJSはクラウドサービスの使用前提な印象で、
– ファイルアップロード
– ログイン認証

などを使いたい+構成はスリムにしたい(一つのサーバで完結)+ファイル操作など慣れているPHPでやりたい 
等で結局『Laravel』を使用することにしました。

### フロント周り
デザインはLaravelに最初からついてくる『TailwindCSS』とど

phpでのMQTT開発ガイド

![MQTTをPHPで使う方法](https://assets.emqx.com/images/c8bd6eeb524d0999ff879b95dbd10ba0.png?imageMogr2/thumbnail/1520×684)

英語ブログ:https://www.emqx.com/en/blog/how-to-use-mqtt-in-php

[PHP](https://www.php.net/)は、広く使われているオープンソースの多目的スクリプト言語で、HTMLに埋め込むことができ、特にWeb開発に適しています。

この記事では、PHPプロジェクトで`php-mqtt/client`クライアントライブラリを使って、[MQTTクライアント](https://www.emqx.com/en/blog/mqtt-client-tools)と[MQTTブローカー](https://www.emqx.io/)間の接続、サブスクライブ、サブスクライブ解除、メッセージの受信と送信の機能を実装する方法について主に紹介します。

## MQTTクライアントライブラリの選択

この記事では、Com

PHP v8.3.0 のリリースと変更点

# PHP v8.3.0 リリース

PHP v8.3.0 がリリースされました。 :tada:

https://www.php.net/releases/8.3/en.php

# 新機能や変更点

Qiita に投稿されている PHP 8.3 の新機能や変更点についての記事です。

https://qiita.com/rana_kualu/items/91111443105a75a55e2f

https://qiita.com/HaruKado777/items/54e74936406262b2b39c

https://qiita.com/HaruKado777/items/bd26322cf467ecf0dccd

# 詳細

詳細は以下をご覧ください。

https://www.php.net/ChangeLog-8.php#PHP_8_3

上記のページを機械翻訳したものを掲載しておきます。

> PHP 8.3.0、2023年11月23日リリースの変更点は以下の通りです:
>
> – Bcmath拡張で数値から末尾のゼロを取り除くバグを修正。
> – CLIに`p

Laravelでの日付処理: Call to a member function format() on string エラーの解決法

最近、Laravelのviewファイルで Call to a member function format() on string というエラーに直面しました。原因は、文字列として認識されているプロパティから format() メソッドを呼び出そうとしたためでした。

解決方法は複数存在するようですが、モデルで日付フィールドを明示的に指定する方法が一番簡単に思えたので採用しました。(Laravelでは、日付や時刻を扱う際にCarbonインスタンスの使用が一般的とのこと)

例として、以下のコードではBorrowモデルに$castsプロパティを追加し、borrowed_atフィールドをCarbonインスタンスとして扱うようにLaravelに指示しています。(型変換=キャスト)

“`Borrow.php

class Borrow extends Model
{
// …

protected $casts = [
‘borrowed_at’ => ‘datetime’,
];

// …
}
“`
この変更により、$borr

Laravel9 Eloquent 便利そうなリレーションまとめ

Laravel9の便利そうなクエリビルダをまとめました。

https://readouble.com/laravel/9.x/ja/eloquent-relationships.html

## has
リレーション先にレコードがあるレコードのみ取得
“`php
// commentが少なくとも1つ以上あるすべてのpostを取得
$posts = Post::has(‘comments’)->get();
“`
## whereRelation
リレーション先のテーブルでwhereをすることができます。
複数の条件を指定したい場合は`whereHas()`を使用します。
“`php
// users → companies.name === $name のユーザーのみ取得
$users = User::whereRelation(‘company’, ‘name’, $name)->get();
“`
## orWhereRelation
`orWhere`のRelation版です。
“`php
// users → companies.name === $name or

Macで brew を利用してPHP複数バージョンを切り替える方法

`brew` を使用して複数の PHP バージョンをインストールし、切り替える方法は、`brew` の `php` タップを使用することで簡単に行えます。以下に手順を示します。

### 1. Homebrew のアップデートとアップグレード:

まず、Homebrewを最新の状態にアップデートし、アップグレードします。

“`bash
brew update
brew upgrade
“`

### 2. PHP 7.4 のインストール:

次に、PHP 7.4をインストールします。

“`bash
brew install php@7.4
“`

### 3. PHP 8.1 のインストール:

同様に、PHP 8.1もインストールします。

“`bash
brew install php@8.1
“`

### 4. バージョンの切り替え:

#### a. PHP 7.4 を利用する場合:

“`bash
brew unlink php
brew link –force –overwrite php@7.4
“`

#### b. PHP 8.1 を利用する

Guzzleへの移行: PHP開発者が直接cURL関数を使うべきでない理由

## 導入

長い歴史を持つ[cURL関数](https://www.php.net/manual/ja/ref.curl.php#ref.curl)ですが、近年では[Guzzle](https://docs.guzzlephp.org/en/stable/)というHTTPクライアントライブラリが主流になっている気がします。
なので使えるならGuzzle使ったほうがいいんじゃないかな〜って話を書きたいと思います。

※ 外部へリクエストを送信する方法として`file_get_contents`,`file`などの関数も存在しますがこれらも使わないようにすると幸せになれます。

## cURL関数の欠点

cURL関数はHTTPリクエストを行うためのPHPの標準的な手段で、cURL拡張さえ入っていれば外部のライブラリを必要とすることなく動きます。
ただ設計自体がかなり前にされたものなので、ユニットテストや複雑な構文など色々と問題になってきます。
問題を洗い出してみましょう。

### 1. 複雑な構文と設定

cURL関数は多くのオプションと設定を抱えており、これらを正確に設定することは

【Mac/VSCODE】PHP intelephenseを使うために四苦八苦したメモ

## 概要
Mac OS 11とかの古めのMacでPHPにコード整形用にPHP intelephense (※1)を入れようとするも、
Macに入っているPHPのバージョンが古いと整形時にエラーが出てしまうため、いろいろ処理までに対応したぞというメモです。
既存のいろんな情報を寄せ集めての対応でしたが、この流れがどこかの誰かの助けになればと思い記録。

(※1 VScodeの拡張機能。割とメジャーですてき)
(※2 自分は7.3でした。)

## エラー詳細内容
すみません、忘れました。。初っ端から。。
具体的には忘れてしまいましたが、あんたのphpバージョンだと使えねーからエラーやで!
アップデートせえ!みたいなのがvs codeで出てたとおもいます。
結果、紆余曲折な旅に出ました。

## phpのバージョンが古いならアップデートしよう!
→ この辺の手順で行いました。
https://www.stub-create.com/blog/php/mamp-brew.html

が、mac osのバージョンが少し古くなってきているので落とせず。
ここもエラーは残してないので忘れた!