PHP関連のことを調べてみた2021年10月22日

PHP関連のことを調べてみた2021年10月22日

Build your own PHP framework

![1619573470292.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1709868/ff70fa25-16b9-0166-dd9d-e79b5609a989.jpeg)
![1619573470292.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1709868/79bddbee-a242-d6ce-ce88-061a474420f4.jpeg)

Atom Framework: [https://github.com/cuongdinhngo/atom](https://github.com/cuongdinhngo/atom)

Ezycrazy Project is powered by Atom framework: [https://github.com/cuongdinhngo/ezycrazy](https://github.com/cuongdinhngo/ezycrazy)

# 1.F

元記事を表示

Execute SQL(1), which is created by SQL(2), which is created by script, with mysql command in that script.

改めてやめようと思った出来事でした。
とあるバッチ処理をメンテナンスしていて、もうやめてくれ、と思った事案です。

予め断っておくと、他にやりようがあるのはわかっています。
でも出会ってしまったんだもの。
あと説明のためにあえて他の手段を取ってないというのもあります。

要件としてはinformation_schemaを使って、SQLでSQLを作るというものです。
サンプルとしてWordPressのデータベースを使います。

賛否はあると思いますが、自分もこういうスクリプト書くことがあるので、責めることができません。
いい方法があれば、いいのですが。

順を追って説明します。

# スクリプトで作られた、SQLを作るSQLを、スクリプト内でCLI実行する

## 第1段階:SQLでSQLを作る

“`sql
SELECT
CONCAT(‘SELECT `’, COLUMN_NAME, ‘` AS \”, COLUMN_NAME, ‘\’ FROM \`wordpress\`;’) AS COLUMN_NAME
FROM
`information_schema`.`

元記事を表示

【Laravel】 キャッシュクライアントにRedisを使用する

## はじめに
Laravelで実装したアプリケーションでデータのキャッシュ化を取り入れるため、
Redisを採用しました。
キャッシュクライアントとしては、様々な選択肢(memcachedやMongoDBなどのNoSQL)がありますが、[公式](https://readouble.com/laravel/6.x/ja/redis.html)にも記載があり、導入がしやすそうだったので、Redisを採用しました。

## Redisについて
[AWS公式のRedisの説明](https://aws.amazon.com/jp/redis/)にもある通り、Redisはインメモリ上のkey-valueデータストアです。
メモリ内にデータを格納するため、RDBと比較し、高速にデータの読み書きをすることができるのが特徴です。
RDBよりもパフォーマンスに特化したデータストアをNoSQL呼びますが、Redisもその中に含まれます。

## 環境
– Laravel 6.5
– Redis 6.2.3

## Laravelへの導入
環境構築の方法については、[公式](https://rea

元記事を表示

Laravelのログレベルをカスタマイズする

### やりたいこと
**Laravelの標準で用意されているログレベルに、独自に作成したログレベルを追加したい**

Laravelで標準で使用可能なログライブラリについては公式サイトを参照。
https://readouble.com/laravel/8.x/ja/logging.html

ドキュメントを読めばわかりますが、Laravelでは以下の8つのログレベルが標準で用意されています。
**emergency、alert、critical、error、warning、notice、info、debug**
素直にこれら8つのログレベルをうまく使って開発すれば困ることはほぼないですが、まれにログレベルを独自で増やしたいとか、既存のログレベルを別の名前のログレベルに置き換えたといった要望が出る開発案件があります。
Laravelのログ出力は公式サイトを参考にすれば柔軟にカスタマイズできますが、ログレベルを増やしたり既存のログレベルを置き換える方法については載っていないので、その時の作業の備忘録です。

### 手順
1. MonologのLoggerを拡張したLoggerクラスを

元記事を表示

【DB移行】 Oracle→PostgreSQL移行によるカラムの型変更

## はじめに
PHP(Laravel)で実装したアプリケーションにおいて、OracleからPostgreSQLのデータベース移行案件に携わりました。
SQLの文法が異なるのは勿論ですが、データベースの移行時に思わぬところでカラムの型が変わってしまう箇所がありました。
ソースコードにできるだけ影響がないようにするために、PostgreSQLのカラムの型を適切に変更する必要があります。

## 環境
– Laravel 6.5
– Oracle 11g
– PostgreSQL 13.3

## char型のカラムをboolean型へ変更する
元々boolean型だったカラムが、移行によりchar型に変わってしまったケースです。
データが入っているテーブルでは、単純にデータ型を変えるだけではうまくcastができずにエラーが出てしまいます。
また、カラムによっては、default制約やnot null制約がついている場合もあり、そういったカラムについてはあらかじめ制約を外しておかないと、カラムのデータのキャスト時にエラーが発生します。

### 制約を外す
対象

元記事を表示

PHP strcmp関数のオレオレ補足

比較できるのはそのまま文字列に変換可能ものだけ。
オブジェクトとか配列を比較対象にすると怒られちゃいます(Fatal error)。
数値を比較対象にすると文字列にキャストしてから比較される。(String関数なので)
(なんかまだある気がする。。。)

####返り値
左辺が小さいと負数
同じだと0
左辺が大きいと整数

ようするに
返り値 = 左辺 – 右辺

使うとしたらこんな感じかなと(PHP8以上)

“`php:strcmp_sample.php
$a = 555555555;
$b = “55555555555555555555555555555555555555”;

$value = strcmp($a, $b);

if ($value !== 0) $value /= abs($value);

echo match ($value) {
-1 => ‘左辺がちっちゃいです。’,
0 => ‘ぴったんこ’,
1 => ‘左辺がおっきいです。’,
default => “なんかおかしいぞっ!!”
};
“`

[strcmp(PHPマニュアル)](ht

元記事を表示

ローカルのphpバージョンを設定

### Homebrewを使ってlocalのphpバージョンを設定する場合

#### 1. Homebrewに下記をインストール

“`
brew install php # 入れておかないと怒られるので追加しておく
brew install php@7.4
“`

#### 2. Homebrewにlocalのphpをphp@7.4へ切り替える

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

#### 3. 上記のcommandで出てきた案内通りに`~/.zshrc`へechoで指定のパスを追加

#### 4.下記コマンドで、`~/.zshrc`の内容を反映

“`
source ~/.zshrc
“`

元記事を表示

LaravelでCSVファイルをエクスポートする

### やりたいこと
**Laravelを使って、テーブルから取得したデータをCSVファイルとしてダウンロードする**

CSVファイルのエクスポート(アップロード)については別の記事にまとめたのでそちらを参照ください。
https://qiita.com/gohandesuyo/items/18ad77bad0b7e068d6f7

ここではテーブルを用意して、テーブルに格納されたレコードを取得する実装例とします。サンプルとなるテーブルの定義は以下の通りとします。
DBはMySQLを前提としています。

|カラム|型|PK|not null|unique|
|:–:|:–:|:–:|:–:|:–:|
|id|int|〇|〇|〇|
|login_id|varchar(20)||〇|〇|
|password|varchar(255)||〇||
|name|varchar(255)||〇||
|email|varchar(255)||〇||
|created_at|timestamp||〇||
|updated_at|timestamp||〇||

### 実装方法
CSVエクス

元記事を表示

管理者のみに新規ユーザー登録を許可する[laravel8.*, laravel/breeze]

社内システム的なものを作る場合、Laravel標準のユーザー登録では好ましくない動作をしてしまうのでそこをいい感じに修正します。
**Laravel標準の動作**
URLを知っていれば誰でもユーザー登録可能
ユーザー登録後、そのユーザーで自動的にログイン

**このように修正します。**
管理者のみユーザー登録できるようにする
ユーザー登録のみ行い、そのユーザーに切り替わらない

## version
“`
PHP 8.0.11
laravel/framework 8.65.0
laravel/breeze 1.4.2
“`

## guestの新規ユーザー登録をガードする
/routes/auth.php

“`
Route::get(‘/register’, [RegisteredUserController::class, ‘create’])
->middleware(‘guest’)
->name(‘register’);

Route::post(‘/register’, [RegisteredUser

元記事を表示

管理者のみに新規ユーザー登録を許可する[laravel6.*, laravel/ui]

**1年近く前に書いた記事が下書きに眠ったままでした…**

社内システム的なものを作る場合、Laravel標準のユーザー登録では好ましくない動作をしてしまうのでそこをいい感じに修正します。
**Laravel標準の動作**
URLを知っていれば誰でもユーザー登録可能
ユーザー登録後、そのユーザーで自動的にログイン

**このように修正します。**
管理者のみユーザー登録できるようにする
ユーザー登録のみ行い、そのユーザーに切り替わらない

## version
“`
laravel/framework 6.18.41
laravel/ui 1.2.0
“`

## 管理者のみユーザー登録できるようにする
参考サイト
[Laravel:管理者のみに新規ユーザー登録(register)を許可](https://qol-kk.com/wp2/blog/2019/01/18/post-1045/)
こちらを参考にファイルをいくつか修正しまし。
## ユーザー登録処理後の動作を変更する
ここからが本題です
vendor以下を変更すると後々大変ですので、それを避けつつユーザー登録処理後

元記事を表示

CodeIgniterでNamespace declaration statement has to be the very first statement or after any declare call in the script のエラー

# エラー画面

![Screenshot_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1969082/7ff550e7-bab6-2b51-6ab6-8177ee406dc6.png)

“`
Namespace declaration statement has to be the very first statement or after any declare call in the script
“`

最初に余計なもんを書き足すなと怒られた。

# 解決策
コメントアウトを上にしてあったのが原因でした…

元記事を表示

【Laravel】ルーティングで定義していないURLにアクセスしたときに自動的にリダイレクトさせる。

自分用のメモとして残します。

ルーティングで定義されていないページにアクセスした場合、404エラーを表示するのではなく自動的にリダイレクトさせる方法をメモ。

#やり方
Route::fallbackをルーティングに追記する。

“`routes\web.php

元記事を表示

【Laravel】SQLインジェクション対策(LIKE句)

# **問題**

派手なSQLインジェクションは一般的なWebフレームワークを使用すれば基本的に発生しません。
しかし、LIKE検索を行う場合はDoS攻撃が成立してしまうことがあります。
`LIKE “%a%b%c%d%e%e%f%g%@%.%”`
上記のようなクエリはSQLエンジンに大きな負荷をかけます。
LIKE句のメタ文字はエスケープする必要がありますが、

“`php
$query->where(‘hoge’, ‘LIKE’, ‘%’ . $value . ‘%’);
“`

と直に書いてしまうケースは多いと思います。

# **対策**

LaravelでのこのLIKE句のインジェクション対策はおそらく3通りほどあると思うので、
それぞれのソリューションをご紹介していこうと思います。

## **1. macroを用意する**
まずBlueprintのmacroを定義するために、
サービスプロバイダを新しく作ります。(AppServiceProvider.phpに書き込む方法もある。

“`shell
php artisan make:provider Bluepri

元記事を表示

laravel collective 間違いやすい箇所

# なんでもtokenを書くべきじゃない

“`php
Form::open([‘url’ => ‘home’])

//↓HTMLではこう書かれていることになる


“`

自動的にCSRFトークンが追加されて出力される。

そのためこの直後に

“`php
{{Form::token()}}
“`

は必要ない

重複していた
{{Form::token()}}を書くとf12で調べると↓ができてた(無駄に)

“`php

“`

# 意外に間違われているlabel

“`php

元記事を表示

転職活動管理アプリを作ろう⑦(各メニューの作成=完成)

前回の記事は [コチラ](https://qiita.com/soso555/items/1d355c30c176c2bc396a)

# 概要
– [テーブル定義した内容](https://qiita.com/soso555/items/89acdd45e88d0e0251f1) をもとに各メニューを作るだけだが、それぞれ特殊なことをやったので手順を記す

# 各テーブルごとの作成手順
## エージェント
– [以前実施した内容](https://qiita.com/soso555/items/5f69b0e159e1087a17ab#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E4%BD%9C%E6%88%90) を参照

## エージェント担当者
– マイグレーションファイル、モデル、コントローラの作成はエージェントと同じ
– マイグレーションファイル
– 外部キー(エージェント:エージェント担当者=1:多)の設定

“`php
Schema::create(‘agent_recruiters’, funct

元記事を表示

PHP 順列処理

・目的
順列の理解

①他の記事を参考にしたもの。

“`nPr.php
// r

$v){
// v を除いた配列
$arr_except_one = array_filter($arr, function($key) use($k) { return $key !== $k; }, ARRAY_FILTER

元記事を表示

FuelPHP – deleted_atの名前を変更した時のモデルの設定

論理削除の`deleted_at`から`leaved_at`に変更した場合にモデルを以下のように設定する。

“`php
protected static $_soft_delete = array(
‘deleted_field’ => ‘leaved’, // _atを含めない
‘mysql_timestamp’ => true,
);
“`

元記事を表示

Dotenv.phpのエラー

非常にレアケースですが、Dotenv.php でエラーが出る場合があります。

“`
PHP Fatal error:
Uncaught Symfony\Component\Dotenv\Exception\FormatException:
Invalid character in variable name in “/var/www/html/bin/../.env” at line 18.
“`
#原因
.env の書式に問題がある可能性が高いです。

“`
変数=値
#コメントアウト
“`
.envの中で許される書式はこの2つだけです。

#.envでよくやってしまうミス

“`
// コメントアウト
; コメントアウト
“`
上記のように、コメントアウトの記号を間違ってしまう。
Javascript と同じように `//` でコメントアウトしちゃったり
VSCode の `CMD+/` ショートカットキーを押すと `;` が入る事がある。

“`
変数:値
“`
`json` や `yaml` から環境変数のコピペをした時に `:` をそのままにしている場合が

元記事を表示

【Eloquent】条件に当てはまるもの・またはNULLであるものの抽出

便利なメソッドが見つからなかったので、単にorWhere条件で抽出する。

“`php
// 例:掲載終了日時が到来していない・もしくは掲載終了日時がNULLの記事を取得する場合
$articles = Article::whereDate(‘display_end_date’, ‘>’, now())->orWhereNull(‘display_end_date’)->get();
“`

他にも条件がある場合はA & (B or C)になるようにクロージャを使用する。

“`php
// 例:ID > 1000のうち、掲載終了日時が過ぎている・もしくは掲載終了日時がNULLの記事を取得する場合
$articles = Article::where(‘article_id’, ‘>’, 1000)
->where(function ($query) {
$query->whereDate(‘display_end_date’, ‘>’, now())

元記事を表示

Drupal のバックアップ

こちらの続きになります。

https://qiita.com/JQinglong/items/7ce6e09ef06950dcaf79

Backup and Migrate

https://www.drupal.org/project/backup_migrate

を使って、バックアップを取ろうとしましたが、

“`
Cannot connect to the database because the MySQLi extension is missing.
“`

というエラーが発生しているので、対応します。

## MySQLi

MySQLi エクステンションを有効にすれば良いのか?
そのためには、php.ini に、記述を追加する必要がありそうです。

https://stackoverflow.com/questions/10646655/the-mysqli-extension-is-missing-please-check-your-php-configuration

では、php.ini はどこにあるのか。

drupal では、管理画面から、phpinf

元記事を表示

OTHERカテゴリの最新記事