- 1. 【PHP】宇宙船演算子のやり方
- 2. EC2にadminerを入れる手順
- 3. PHPでCookieにSameSite属性を付ける方法
- 4. Laravel 5.5 MultiAuth 実装(userとadminをわけてログイン)
- 5. laravelのwhere()で複数のカラムを指定したい
- 6. MySQLへのつなぎ方
- 7. composer-bin-pluginを導入してDeveloperツールを管理する
- 8. プリミティブ値をオブジェクトで置き換える
- 9. 【第二回】コロナ禍だから何かできることをー 自宅療養者連絡ツール ー
- 10. 【PHP】多次元配列のソート
- 11. 上手にできたPHP
- 12. 【PHP】多次元配列を指定したキーと値にする方法
- 13. PHPでお手軽にサーバリソースをモニタリング
- 14. 【Laravel】 Selectフォームでdisableを使用するとバリデーションに引っ掛かる
- 15. 【PHP】SimpleXMLオブジェクトの不思議な挙動
- 16. “SQLSTATE[HY093]: Invalid parameter number”あるある
- 17. laravelでPostgreSQLのbyteaに画像を格納したときのメモ
- 18. 【第一回】コロナ禍だから何かできることをー 自宅療養者連絡ツール ー
- 19. 【Laravel】動的プロパティとリレーションメソッド。そしてN+1問題を真剣に調べてみた
- 20. DockerでMailHogを使ってPHPのメール送信確認をする
【PHP】宇宙船演算子のやり方
“`PHP
$value) {
switch ($value <=> $expense) { // ⇐ これが宇宙船演算子
case -1:
echo ‘赤字:’; // 赤字
break;
case 0:
echo ‘変化なし:’; // 利益なし
break;
case 1:
echo ‘黒字:’; // 黒字
break;
default:
break;
}
echo $value-$expense.PHP_EOL;
}“`
#結果
“`
赤字:-5000
変化なし:0
EC2にadminerを入れる手順
#はじめに
題名通りで、EC2にDB管理ツールのAdminerを設置します。
#前提
・EC2とRDSを事前に設置
インターネットゲートウェイやサブネットも作成済み
[こちらを参考にしました](https://qiita.com/MayForBlue/items/c96674fb6aac5852a978)
・RDSはMYSQL
・EC2のインバウンドのセキュリティーグループはこちらの設定にしてください。
#流れ
①EC2にapacheをインストール
②PHPとM
PHPでCookieにSameSite属性を付ける方法
# PHP7.2以前の`setcookie`関数には`SameSite`属性をつけるための引数がない!
`header`関数で生の`Set-Cookie`ヘッダを書くのも手ですが・・・
裏技として、Path属性用の引数を利用して`SameSite`属性をつけることができます。
“`php:7.2以前の方法(裏技)
/* 関数のインターフェース
setcookie(
string $name,
string $value = “”,
int $expires = 0,
string $path = “”,
string $domain = “”,
bool $secure = false,
bool $httponly = false
): bool
*/# pathにわたす文字列内に`;`をいれることで、無理やりSameSite属性を指定する!!!
setcookie(‘cookie_name’, ‘cookie_value’, 0, ‘/; SameSite=strict’, ”, true, true);#
Laravel 5.5 MultiAuth 実装(userとadminをわけてログイン)
## はじめに
今回初めてqiitaを書くため、読みにくい点が多いかと思いますがご容赦ください。
laravel5.5を使用しており、最新のバージョンではありません。## MultiAuth(マルチログイン)とは
MultiAuth(マルチログイン)は、『ユーザと管理者の2つに分けてログインが行える機能である』という想定をしています。
アプリを使用するゲストユーザ → user
アプリを管理する管理者 → admin## 前提
– laravelの環境構築を終えている
– MAMPを使用
– DBとの接続を終えている
– 管理者側はログインのみの実装(管理者は1人と想定しSeederでデータを入れる)
– ゲストユーザは新規登録、ログインが行える## 実装手順
[1.ゲストユーザ側の認証機能の実装](#1-ゲストユーザ側の認証機能の実装)
[2.モデルのディレクトリを変更](#2-モデルのディレクトリを変更)
[3.管理者側のモデル作成](#3-管理者側のモデル作成)
[4.管理者側のモデル編集](#4-管理者側のモデル編集)
[5.管理者側のマイグレーションファイル編集]
laravelのwhere()で複数のカラムを指定したい
laravelのwhere()で複数のカラムを指定したいと思いましたがやり方がわからずに調べました。
##夢
“`php
where([‘login_id’, ‘ToUserId’],Auth::id())
“`
どちらかのカラムに自分のIDが入っていたら取得する。
しかし、whereの第一引数には配列が指定できませんでした。##解決策
“`php
whereRaw(‘`login_id` = ? OR ToUserId = ?’, [Auth::id(), Auth::id()])
“`綺麗ではないですが上記であれば取得可能です。
?の部分に第二引数で指定した配列が入ります。##参考記事
https://www.ritolab.com/entry/93##感想
むずい
MySQLへのつなぎ方
##データベースを作成する
“`
mysql -u root -p
“`
-u ユーザー名
-p パスワード認証MySQLにログイン完了後、kakekomi(私が作成したいデータベース名)というデータベースを作成します
“`
mysql> CREATE DATABASE `kakekomi`;
“`作成したデータベースを確認するには
“`
mysql>show databases;
“`下記のような表示されます。
“`
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| easywms |
| kakekomi |
| mysql |
| performance_schema |
| sys |
+——————–+
6 rows in set (0.01
composer-bin-pluginを導入してDeveloperツールを管理する
# 概要
コードをフォーマット通りに整形するため、[PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)を導入したいと思いました。
ドキュメントを確認したところ、専用のディレクトリを切ってそこにインストールするやり方が推奨されていた。どうしたものかと[ツイート](https://twitter.com/juve534/status/1443015965579440131?s=20)したところ、[composer-bin-plugin](https://github.com/bamarni/composer-bin-plugin)を教えてもらったので、そちらを使って管理する方向とし、やったことをメモしておきます。# 本文
## [composer-bin-plugin](https://github.com/bamarni/composer-bin-plugin)とは
説明は下記のスライドに詳しく載っています。Developerツールをこのプラグインを使って管理することで、依存パッケージのver.によるコンフリクトを軽
プリミティブ値をオブジェクトで置き換える
オブジェクト指向を使っていて、ひとついいなと思ったことです。
[リファクタリング 既存のコードを安全に改善する(第2版)](https://tatsu-zine.com/books/refactoring-2ed)という書籍では、「オブジェクトによるプリミティブの置き換え」と命名されていました。
todo アプリを例に説明します。
# `int` での引き渡し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/988b1a50-a6fa-218d-768f-09c93c4742fa.png)
`int` で引き渡していると、各コンポーネントは「`$task_id` <= 0 のときに次に渡すとバグるかもしれないな...」ということを考える必要が生じます。 【第二回】コロナ禍だから何かできることをー 自宅療養者連絡ツール ー
#前回までのあらすじ
[【第一回】コロナ禍だから何かできることを](https://qiita.com/STYLE-D/items/743bbecae1c52be15505)
####実装イメージ図
LINEを利用して保健所の担当者の負担を軽減するとともに、自宅療養者はいつでもつながっている安心感を持たせるためのツールイメージです。
![メイン.00_00_51_12.Still002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/cf85391e-aef8-5a59-0a1d-63d8e15412ce.jpeg)##まずはLINEからデータを取得して返すまでの流れを考えよう
![システム構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/ac5262ba-5db6-bdc3-d7f1-6c007182fce8.jpeg)###今回はLINEbotの設定部分の説明
まずは、LINEb
【PHP】多次元配列のソート
“`PHP
‘田中’, ‘japanese’ => 83, ‘math’ => 57, ‘science’ => 43, ‘social’ => 72, ‘english’ => 78],
[‘name’ => ‘渡部’, ‘japanese’ => 62, ‘math’ => 88, ‘science’ => 70, ‘social’ => 66, ‘english’ => 38],
[‘name’ => ‘品川’, ‘japanese’ => 23, ‘math’ => 33, ‘science’ => 53, ‘social’ => 17, ‘english’ => 7],
[‘name’ => ‘滝谷’, ‘japanese’ => 93, ‘math’ => 89, ‘science’ => 79, ‘social’ => 96, ‘english’ => 91],
[‘name’ => ‘川原田’,’japanese’ => 55, ‘math’ => 5
上手にできたPHP
“`PHP
‘田中’, ‘japanese’ => 83, ‘math’ => 57, ‘science’ => 43, ‘social’ => 72, ‘english’ => 78],
[‘name’ => ‘渡部’, ‘japanese’ => 62, ‘math’ => 88, ‘science’ => 70, ‘social’ => 66, ‘english’ => 38],
[‘name’ => ‘品川’, ‘japanese’ => 23, ‘math’ => 33, ‘science’ => 53, ‘social’ => 17, ‘english’ => 7],
[‘name’ => ‘滝谷’, ‘japanese’ => 93, ‘math’ => 89, ‘science’ => 79, ‘social’ => 96, ‘english’ => 91],
[‘name’ => ‘川原田’,’japanese’ => 55, ‘math’ => 5
【PHP】多次元配列を指定したキーと値にする方法
“`PHP
“10”,”menu_name” => “カレー”,”submenu_name” => “ライス”,”drink” => “烏龍茶”],
[“menu_id” => “20”,”menu_name” => “パスタ”,”submenu_name” => “タバスコ”,”drink” => “ビール”],
[“menu_id” => “30”,”menu_name” => “焼き肉”,”submenu_name” => “ソース”,”drink” => “ジンジャエール”]
];$menu = array_column($cooking, ‘menu_name’, ‘menu_id’);
//$menu = array_reduce($cooking, function($accumulator, $item){
// $index = $item[‘menu_id’];
// $accumulator[$index] = $item[‘menu_name’];
// ret
PHPでお手軽にサーバリソースをモニタリング
Webサービスなどを運用するにあたり、障害発生を未然に防ぐためにサーバ監視ツールを導入している方も多いかと思います。
検索すると多様なツールがあって選定に悩むところですが、高性能である必要性がなければ自作でいいじゃん!
ということで、PHPでお手軽にサーバリソースのモニタリングをやってみます。## 環境
– CentOS 8
– PHP 8
– Apache(prefork MPM)
– MySQL## ロードアベレージ
“`php
// 過去1分間のロードアベレージを取得
$loadAverage = sys_getloadavg()[0];
if ($loadAverage > 1) {
// ロードアベレージが1を超えてたらアラートを飛ばす処理
}
“`## ディスク
“`php
$diskFree = (int) disk_free_space(‘/’) / 1024 / 1024; // 空き(MB)
$diskTotal = (int) disk_total_space(‘/’) / 1024 / 1024; // 合計(MB)
if ($diskFre
【Laravel】 Selectフォームでdisableを使用するとバリデーションに引っ掛かる
###Selectフォームでdisableを使用するとバリデーションに引っ掛かる
####問題となったコード
edit状態の際にdisableが有効になると思ってほしい“`PHP.○○Blade.php
{{Form::select(‘fruits’, [‘apple’, ‘banana’, ‘kiuwi’]),
[$is_edit ? ‘disable’ : ”,
]}}
“`
Requestで必須としてバリデーションしている“`PHP.○○Request.php
‘fruits’ => [
‘required’,
],
“`
####具体的な問題点
disableするとPOSTされないので必須のバリデーションに引っ掛かる参考記事
https://lightgauge.net/language/html/2525/####解決策
インプットタグにtype=hiddenとvalueを指定して記述する“`PHP.○○Blade.php
{{Form::select(‘fruits’, [‘apple’, ‘banana’, ‘ki
【PHP】SimpleXMLオブジェクトの不思議な挙動
PHPのSimpleXMLオブジェクトに対してエラー処理をしようとしたところ、改めてこのオブジェクトの仕組みが分からなくなり、理解するのにだいぶかかった。「あれっ」となるところがあり一筋縄ではいかなかったので、まとめておきます。
※ 以下のコードの実行環境は、PHP 7.4 です# 存在しないプロパティを参照すると「空のSimpleXMLオブジェクト」が返る
次の処理は、XMLから、ユーザ名を取得し配列にしています。
“`PHP
001
Yamada
002
Tanaka
003
Sato
“SQLSTATE[HY093]: Invalid parameter number”あるある
PHPからPDOのPrepared Statementを使ってMariaDBを操作してると、たまに遭遇するのが表題のエラー。
何がどうあかんのか具体的に教えてくれないので、意外とハマりがちでして。以下、筆者が経験的にマスターしたエラーの原因あるあるを。
***
**1.パラメータ名が間違っている**
今一度、落ち着いて確認しましょう:sweat_smile:***
**2.SQLの指定が間違っている**
これ、意外と分かりにくいんですよね。
MariaDBは、下記の方法で再起動することなくクエリーログを取得できます。
ここで実際にPrepareされたSQLの内容が分かるので、実際の値を当てはめて指定内容が正しいか確かめるとよいでしょう。①Mariadbにrootでログインして、以下のコマンドを実行します。
“`
SET GLOBAL general_log = ‘ON’
“`
:::note warn
該当のMariaDBエンジンを使ってる全データベースでクエリーログを取得する(=オーバーヘッドが増える)ので、テストサーバーなどを用い、ほかのプログラムに影響を与えな
laravelでPostgreSQLのbyteaに画像を格納したときのメモ
<<環境>>
・PHP 7.4
・laravel8
・PostgreSQL12PostgreSQLのbytea型に画像データを保存する必要が出て、
クエリービルダでうまく行かずにPDOを使用して実装した際の処理内容です。
テーブルには
・ID
・バイナリデータ(img_bin)
・MimeType(mimetype)
・ファイル名
のカラムを持つ前提で、データの挿入を行います。$id = レコードのID
$file = $request->file('file'); // リクエストのファイルを取得
$org_logo_filename = $file->getClientOriginalName(); // アップされたオリジナルのロゴファイル名取得(デバッグ等で使用)
$mimetype = $file->getClientMimeType(); // 画像を表示する際のmimetypeとして使用
$tmp_path = $file->getRealPath(); // 実画像のパスを取得
$fp = fopen($tmp_path
【第一回】コロナ禍だから何かできることをー 自宅療養者連絡ツール ー
#まえがき
###お前の力はこんなもんじゃないだろう!
>「 国を変えるのは、政治家じゃない、サラリーマンだ!」(エンゼルバンク)
まだまだ技術力不足で自分一人では実現不可能だったので公開します。
こんな時代だからこそ人を豊かにする道具をもっと作っていけたらいいなって思ってます。#実装イメージ図
LINEを利用して保健所の担当者の負担を軽減するとともに、自宅療養者はいつでもつながっている安心感を持たせるためのツールイメージです。![2021_09_03 7_27 Office Lens.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/c70538e9-0267-d49d-e0c9-66493779a7ca.jpeg)
#実装イメージ図
担当者と自宅療養者とのLINEの連携部分は完成しました。
次回、第二回で設定方法を説明します。それに合わせて、担当者が操作するPC画面も併せて開発していきます。
DockerでMailHogを使ってPHPのメール送信確認をする
Dockerでメール送信確認をする時に、sendmailの設定をしないといけなかったり、うまく外に出ていかなかったり面倒な場合がありますが、[MailHog](https://github.com/mailhog/MailHog)を使うと簡単にできます。
また、メールは実際には送信されないので、テストのつもりが間違ってメールを送ってしまった!という心配もないので安心です。
(PHPのアプリケーションでメール送信する場合について書きます。)# 設定
## MailHogを導入MailHogを`docker-compose.yml`のサービスに追加します。
```yml:docker-compose.yml
services:
mailhog:
image: mailhog/mailhog
ports:
- 8025:8025
```## アプリケーションの設定
### 1. PHPのmailをMailHogに変更する場合フレームワークの設定(後述)で設定してもいいですが、ローカルと本番で設定を変えたくない等