- 1. php で csv を読み込む上での備忘録
- 2. 【PHP】期間を指定すると、月初と月末を返してくれる関数を作ったよ
- 3. 【PHP基礎⑭】ループ処理-4.カウントダウン
- 4. 【PHP基礎⑬】ループ処理-3.カウントアップ
- 5. 【PHP基礎⑫】ループ処理-2
- 6. dockerを使ってサクッとPHPとMySQL環境を手に入れる
- 7. 【Laravel】Mailable jsonを受け取りメールを送信するAPIを作る
- 8. オリジナルアプリ作成進捗(スクレイピング処理記述もあと少し)
- 9. サブドメインを使ってPHPを動作させる方法
- 10. LaravelのMigrationで外部キーを使用したら、エラー発生
- 11. PDOで「Packets out of order. Expected 1 received 0」のワーニングが出る
- 12. LINEで送るのタグの改行をする
- 13. 【Laravel】Middleware は設定する場所によって実行される順番が異なる
- 14. 【PHP基礎⑪】ループ処理-1.for文とwhile文
- 15. PHP Goutte\Client でPOST JSON(application/json)するには
- 16. Laravel のコレクションでちょっと面白かったこと
- 17. PHP開発で使うVisual Studio Codeの拡張機能[随時更新]
- 18. Laravel で Google 認証
- 19. 【PHP8.2】readonlyなクラスが作れるようになる
- 20. Laravel環境構築編【開発メモ】【コマンド】
php で csv を読み込む上での備忘録
# はじめに
仕事で Laravel 内でcsv を読み込むコードを作成したのでその上で知ったことに関して備忘録代わりにこちらで記載しておきます。
# Shift-JIS な CSV を読み込む
windows 向けを前提とした CSV の場合、 **Shift-JIS** の CSV を扱うことになるかと思います。
その際、php 側は utf-8 で動いているような状態であるなら、当然ながら文字コードの変換が必要になります。
php において文字コードの変換の手法はいくつか存在しますが、保存されているファイルを読み込むような場合においては、以下の様に書くことで一行で文字コードの変換フィルターをかけたうえで読み込むことができます。
“`php
$path = ‘(本来のCSVファイルのパス)’;
$file = new \SplFileObject(‘php://filter/read=convert.iconv.cp932.utf-8/resource=’ . $path);
“`“`php://filter“` については **php 入出力ストリーム*
【PHP】期間を指定すると、月初と月末を返してくれる関数を作ったよ
# 環境
php 8.0
# この記事の内容
開始年月YYYY-mmと終了年月YYYY-mmを渡すと、月初日と月末日を配列で返す関数をPHPで作りました。
“`php:例
//例えばこんな値を渡すと
$from = ‘2021-04’;
$to = ‘2022-03’;//こんな配列が返ってきます
[
[‘2021-04-01′,’2021-04-30’],
[‘2021-05-01′,’2021-05-31’],
[‘2021-06-01′,’2021-06-30’],
[‘2021-07-01′,’2021-07-31’],
[‘2021-08-01′,’2021-08-31’],
[‘2021-09-01′,’2021-09-30’],
[‘2021-10-01′,’2021-10-31’],
[‘2021-11-01′,’2021-11-30’],
[‘2021-12-01′,’2021-12-31’],
[‘2022-01-01′,’2022-01-31’],
[‘2022-02-0
【PHP基礎⑭】ループ処理-4.カウントダウン
[問題]
整数値を入力させ、入力値から0まで数を1ずつ減らして表示するプログラムを作成しなさい。
なお、入力値に0以下の値を入力した場合は考慮しなくてもよい。# コード
“`php
$a = intval(fgets(STDIN));
for($m = $a; $m >= 0; $m–){
echo “$m \n”;
}
“`↓「7」と入力
# 結果
“`
7
6
5
4
3
2
1
0
“`☆1ずつ減らす→ $m–
【PHP基礎⑬】ループ処理-3.カウントアップ
[問題]
整数値を入力させ、0から入力値まで数を1ずつ増やして表示するプログラムを作成しなさい。
なお、入力値に0以下の値を入力した場合は考慮しなくてもよい。# コード
“`php
$a = intval(fgets(STDIN));
for($m = 0; $m <= $a; $m++){ echo "$m \n"; } ``` ↓「7」と入力 # 結果 ``` 0 1 2 3 4 5 6 7 ```
【PHP基礎⑫】ループ処理-2
[問題]
整数値を入力させ、その値の回数だけHello Ruki!を繰り返して表示するプログラムを作成しなさい。# コード
“`php
$a = intval(fgets(STDIN));
for($m = 1; $m <= $a; $m++){ echo 'Hello Ruki!',PHP_EOL; } ``` ↓「5」と入力 # 結果 ``` Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! ``` ☆$m++は$m=$m+1と同じなので、 2ずつ増やしたい時は$m = $m+2とする。 または、$m+=2 でもOK。 ↓ 2ずつ増やした場合(入力値は「5」) ```php $a = intval(fgets(STDIN)); for($m = 1; $m <= $a; $m = $m+2){ echo 'Hello Ruki!',PHP_EOL; } ``` 結果 ``` Hello Ruki! Hello Ruki! Hello Ruki! ```
dockerを使ってサクッとPHPとMySQL環境を手に入れる
ちょっと何かを試したいときdockerは便利です。
環境構築と破棄を気軽にできるからです。
というわけで今回は、dockerでサクッと作れるPHPとMySQL環境を作ってみようと思います。
何かを検証したいときにこういった環境を手軽に作れると時短になるので便利です。# ディレクトリ構成
“`
./
│ docker-compose.yml
│
├─app
│ └─htdocs
│ index.php
│
└─docker
├─db
│ │ Dockerfile
│ │ my.cnf
│ │
│ └─init
│ 1.create-db.sql
│ 2.grant-user.sql
│ 3.create-table.sql
│ 4.insert-data.sql
│
└─web
Dockerfile
php.ini
“`# 各ファイルの説
【Laravel】Mailable jsonを受け取りメールを送信するAPIを作る
Mailableを使ったメール送信方法を試してみました。
今回は外部から以下に記述するJSONをPOSTで受け取り、JSONに記述されているメールアドレス(email)宛に内容(name, body)をメール本文に記述して送信するというAPIを作成します。GmailのSMTPサーバーを使用します。#### 受け取るJSONファイル
“`json:json
{
“name”:”example name”,
“email”:”target@xxxxxx.com”, //送り先のアドレス
“body”:”test body”
}
“`## .env の編集
.envファイルにGmailのSMTPサーバーを使う設定を行います。
事前にGmailのアプリパスワードを生成する必要があります。
参考: https://pc-karuma.net/google-account-generate-app-password/“`
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxx
オリジナルアプリ作成進捗(スクレイピング処理記述もあと少し)
オリジナルアプリ作成も終盤に入り、スクレイピング処理の記述ももう少しのところまで来ています。
# スクレイピング処理のコードはこんな感じです。
“`ScrapingController.php
request(‘GET’, ‘https://baseball.yahoo.co.jp/npb/teams/3/memberlist?kind=p’);
$info = $crawler->filter(‘.bb-playerTable__row’)->eac
サブドメインを使ってPHPを動作させる方法
|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|—|既存のサーバー、既存のドメインで httpd + Tomcat が動作している環境で、テスト的にPHPを試してみたい場合の最も簡単な方法は、サブドメインを使う方法かなと思う。例えば、既に kankeri.com で httpd + Tomcatが動作している場合、Tomcatに干渉しないでPHPをテストしたいときは、php.kankeri.com のようなサブドメインを使うと非常に簡単である。
ただし、委任先のDNSサーバにサブドメインを追加する作業が必要であり、反映されるまで若干待つかもしれない。CNAMEを1行追加するだけである。以下の感じである。
“`
php CNAME kankeri.com.
“`そして、httpdのVirtualHostに php.kankeri.com:80 を追加する。以下の感じである。例えば、vhost-php.conf を作成して記述する。phpのコードは、/opt/php74/webap
LaravelのMigrationで外部キーを使用したら、エラー発生
Laravelのmigrationをしようとした際、
“`
SQLSTATE[42000]: Syntax error or access violation: 1702 Key column ‘categoryId’ doesn’t exist in table
“`
というエラーにハマってました。## 解決方法
unsignedBigIntegerを外部キー参照している前の行に記入!
“`php:unsignedBigInteger.php
$table->unsignedBigInteger(‘categoryId’); //ここ
$table->foreign(‘categoryId’)->references(‘categoryId’)->on(‘category’)->on
PDOで「Packets out of order. Expected 1 received 0」のワーニングが出る
|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|—|CentOS Stream 8でPHP7.4からPDOでMySQL8.0に接続する際に「Packets out of order. Expected 1 received 0」のワーニングが出る時がある。毎回確実に出る訳でもなく、どのような状況の時に出るのかは判明できていない。心当たりのある原因を後述しておく。
“`
PHP message: @@ enter getUsers(‘admin’,false)
PHP message: @@ new UserManager()
PHP message: @@ new UserDataAccessor()
PHP message: @@ PersistenceBase::__construct()
PHP message: @@ PersistenceBase::pdo = null
PHP message:
PHP Warning: Packets out of order. Expect
LINEで送るのタグの改行をする
aタグでlineで送るボタンをカスタムしたボタンで実装したい。
しかもメッセージは長めなので改行する必要性がある。
と言う時に、\nの改行コードではダメだった。## 前段として
LINEで送るをリンクで実装する場合の事なので
“`php
リンク先
“`
のような書き方になり、$hensu部分にエンコードした文字列を入れる。
しかし改行コードが\nだと動かない。“`php:解決策
$kaigyou = utf8_encode(“%0d%0a”);
$hensu = “こんにちは”.$kaigyou.”改行します”;
“`
とした場合にLINEメッセージで得られる出力は
“`
こんにちは
改行します
“`
と言う事になる。改行コードを明示的にutf8でエンコードしたら解決出来たと。
【Laravel】Middleware は設定する場所によって実行される順番が異なる
# はじめに
以前Laravelのミドルウェアを用いてLaravel内部で作成したAPIのレスポンスを返す前にログをDBへ記録しようとした際に、ミドルウェアの順番の問題によってかなり手間取ってしまったことがありました。
そのため一度Laravelのミドルウェアの順番に関して把握しておくべきだと考え、調べてみました。
# 環境
OS: Ubuntu-20.04 (Windows 10 の WSL2 上に設置)
PHP: 8.0.10
Laravel: 8.61.0
# 検証に使用するミドルウェアの中身
Laravelのミドルウェアは、リクエストがアプリケーションによって処理される**前**にタスクを実行するものと、リクエストがアプリケーションによって処理された**後**にタスクを実行するものの2種類があります。今回はミドルウェアの順番を調べるため、storage/logs/laravel.logにデバッグログを出力するミドルウェアを作成します。ログの内容はミドルウェア名とします。
## リクエストがアプリケーションによって処理される前にログを記録するミドルウェアの例
“`app/
【PHP基礎⑪】ループ処理-1.for文とwhile文
[問題]
Hello Ruki!を10回繰り返して表示するプログラムを作成しなさい。1.for文の場合
# コード
“`php
for($a = 1; $a <= 10; $a++){ echo "Hello Ruki! \n"; } ``` # 結果 ``` Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! ``` 2.while文の場合 # コード ```php $a = 0; while($a < 10){ echo 'Hello Ruki!',PHP_EOL; $a++; } ``` # 結果 ``` Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello Ruki! Hello
PHP Goutte\Client でPOST JSON(application/json)するには
Goutte\Clientでスクレイピングというより自動化をしていたんですが、
FormではなくonclickでAJAX的にPOSTしている画面があって
Goutteは基本“`php
$cli = new Client();
$top = $cli->request(‘GET’, “https://admin.abcd.efg/aaa”);
$loginForm = $top->filter(‘form’)->form();
$loginForm[‘text’] = ‘hello’;
$cli->submit($loginForm);
“`
てな感じでFormありきじゃないといけないっぽいので、
“formじゃないinput”に別途入れる方法ないかな?って探しまくって
途方に暮れていたら
いっそうのことPOSTを投げればいいんじゃないか!とひらめき
ブラウザのDevToolでネットワークを覗き、cURLで取得してみたら
POSTでJSONを送ってる感じだった。とはいえ、POSTでJSON送りつ
Laravel のコレクションでちょっと面白かったこと
# はじめに
本当にちょっとしたことです。
忘れそうなのでメモ書き程度に。# 環境
– Laravel 6.x
# コレクションからランダムに要素を取得できる
“`php:
random());
“`# おわりに
Laravel のコレクションってけっこう色々なことができて面白いのでこれからも面白いことあったら記録していこうと思います。
PHP開発で使うVisual Studio Codeの拡張機能[随時更新]
# GitLens — Git supercharged
https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens
# PHP Debug
https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug
# PHP DocBlocker
https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker
# PHP Intelephense
https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client
Laravel で Google 認証
# はじめに
Google 認証の実装方法をメモレベルではありますが備忘録として記載します。
# 環境
– Laravel 6.x
# パッケージインストール
以下コマンドで必要なパッケージをインストールします。
“`sh:
$ composer require laravel/socialite
“`# 設定
以下の様に設定ファイルを更新します。
“`php:config/services.php
[
‘client_id’ => env(‘GOOGLE_CLIENT_ID’),
‘client_secret’ => env(‘GOOGLE_CLIENT_SECRET’),
‘redirect’ => env(‘APP_URL’) . ‘/login/google/callback’,
],
];
“`合わせて`.env`に`GOOGLE_CLIENT_ID`と`GOOGLE_CLIENT_SECRET`を設定してお
【PHP8.2】readonlyなクラスが作れるようになる
[PHP8.1でreadonlyプロパティが実装されました](https://qiita.com/rana_kualu/items/ae96400a0a6981eca64a)が、このreadonly修飾子がクラスにも使えるようになります。
プロパティごとにreadonlyを設定するのではなく、クラス自体を厳格に運用することができるようになります。以下は該当のRFC、[Readonly classes](https://wiki.php.net/rfc/readonly_classes)の日本語訳です。
# PHP RFC: Readonly classes
## Introduction
PHP8.1で[readonlyプロパティがサポート](https://qiita.com/rana_kualu/items/ae96400a0a6981eca64a)されました。
しかしたとえば、多くのプロパティのある不変クラスの宣言は未だに面倒です。そこで、このRFCではreadonlyなクラスのサポートを提案します。
## Proposal
PHP8.1で追加されたreado
Laravel環境構築編【開発メモ】【コマンド】
## M1チップMacのもの
`% platform: linux/amd64`
といったコードをdocker-compose.ymlに入れないと動かない。
また、dockerデスクトップを起動してからじゃないとそもそもの
`% docker-compose up -d`
というものも動かないので注意が必要。
(他の方の記事も参考にしているのにやってしまっているのが現状・・・)
エラーが発生しているので書いておきます。
Encountered errors while bringing up the project.これはポートが他のもので埋まっているということらしい・・・
何してんだかw
## 結局コマンドを変更した。
後日某プログラミング学習サイトでLaravel開発の動画を見たところ・・・
もっと簡単なコマンドを発見したのでここに書いておきます
`% curl -s “https://laravel.build/プロジェクト名” | bash`
このコマンドを打つと、現在いるディレクトリ内に最新版をインストールしてくれます。
その後・・・sailコマンドを実行するのにdocker