PHP関連のことを調べてみた2022年07月03日

PHP関連のことを調べてみた2022年07月03日

Chapter5 DBクラスの利用(5-2)

# DBクラスとは?

Laravelに用意されている、
最もシンプルなデータベースアクセス機能は「DB」クラスです。

中でも、最もシンプルなのは、SQLのクエリを直接実行するメソッドです。

# DBクラスを使用

## コントローラの修正

“`HelloController.php
use Illuminate\Support\Facades\DB;

class HelloController extends Controller
{

public function index(Request $request) {

$items = DB::select(‘select * from people’);

return view(‘hello.index’,[‘items’ => $items]);

}

}
“`

## テンプレートの修正

“`index.php
@section(‘content’)

Chapter5 データベースを用意する(5-1)

# モデルとデータベース

## モデルとは

でーたの管理を行うところ。
=「データベースの処理」を担当する部分です。

データを保管庫として使うことを想定しているアプリケーションであれば、
コントローラに数行記述すれば事足りるので、
モデルを作成して設定してだと返って大変になる。

逆に多数のテーブルを連携させて複雑なでーた処理を行っているような
アプリケーションであればコントローラで扱う処理の大半がデータベース関係では、
モデルに切り離してわかりやすく求めるべきです。

## Larabelの機能

### DBクラス(クエリビルダ)

最もシンプルなアプローチは「DB」クラスを利用する方法です。

この「DB」クラスでは、
データベースにアクセスするためのクエリを生成し、
送信することができます。
SQLクエリを直接実行するイメージに近い。

### Eloquent (ORM)

ORM(Object-Relational-Mapping)と呼ばれる機能をLarabelに実装したものです。
**ORM**は、
「データベースのデータとプログラミング言語のオブジェクト言語のオ

PHPでMySQLのデータを出力する

PHPでMySQL連携ができたので、忘れないようにメモを残します。

# MySQLの設定

MySQLに以下のような設定をしました。なおログインユーザは`root`で、パスワードは`password`にしています。

“`:MySQLのデータベース
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| shop |
| sys |
+——————–+
“`

“`:shopデータベース内のテーブル
+—————-+
| Tables_in_shop |
+—————-+
| member |
+—————-+
“`

“`:memberテーブル内のデータ
+——–+——+
|

プログラミング初学者がプログラミング言語と周辺知識の概要を知るための記事

# どのような人向けの記事か
私のような、【駆け出しエンジニアの方やプログラミングに関心のある方、初心者の方】向けにどんなプログラム言語があるのかをざっくりわかるようにゆる〜くまとめたものです。また、備忘録としても投稿しておこうと考えました!

※当方も未経験エンジニアの立場で実務未経験であるため、間違いはあると思いますので適宜ご指摘いただければ幸いです。

# なぜ、この記事を記述するに至ったのか
理由としては、3点あります。
・自分自身が今後フルスタックエンジニアを目指しており、さまざまな言語や技術を習得したいと考えているから
・各言語の特徴を知ることで今後の開発等で最適な言語やライブラリ・コンポーネントへの理解が必須であると考えたから
・自分の武器を増やす上で特徴をまずはざっくり理解したいと考えたから

# 本編
ここからが本番です!自分自身が記事等で学習したものをざっくばらんに言語化していきます。気になる言語があれば、ご自身でも深く調べてみることで、どんな言語なのか実感できるはずなので是非深掘りして見てくださいね!
### 【注意点】
・言語名の横に(マークアップ言語)と記載

Chapter4 その他のリクエスト・レスポンス処理(4-4)

# CSRF対策とVarifyCsrfToken

これまでフォームを作成した際には基本的にCSRF対策のための機能を組み込んでありました。
フォームの中にには`@csrf`という値が組み込んであり、
これによってCSRF対策用のトークンを出力する非表示フィールドが組み込まれました。

## `$except`に追記する

「Middleware」の中に、「VerifyCsrfToken.php」がCSRF対策を行うためのファイル。
VerifyCsrfTokenクラスには標準で`$except`という変数は用意されています。
そこにm CSRF対策を適用しないアクションを設定します。

“`VerifyCsrfToken.php
class VerifyCsrfToken extends Middleware
{
protected $except = [
‘hello’,
];

}
“`

上記の記述により、「/hello」にPOST送信された際には、
CSRF対策が実行されなくなります。
これによりフォームから`@csrf`を削除し

Chapter4 バリデーションをカスタマイズする(4-3)

# バリデーションをカスタマイズする

## フォームリクエスト

コントローラはそれぞれのアクションで実行すべきビジネスロジックなどを実行することになるため、
「入力された値のチェック」などはできれば他に切り離したい。
(フォームの項目にバリデーション機能を実装する際に、各コントローラに書くのは面倒。)

そこでLarabelでは「フォームリクエスト」と呼ばれる機能を考えました。

## フォームリクエストの作成

フォームリクエストは「artisan make:request」というコマンドを使って作成します。

“`
% php artisan make:request HelloRequest
“`

### フォームリクエストの基本コード

“`HelloRequest.php

Chapter4 バリデーション(4-2)

# バリデーションとは?

バリデーションは「入力情報を検証するための仕組み」です。
Laravelではコントローラの「validate」メソッドを利用します。

ValidateRequestsというトレイと(メンバーをまとめてクラス追加するためのもの)に
利用されているクラスです。

“`sample.php
$this->validate($request,[***検証設定の配列*]);
“`
“`sample.php
[
‘**項目名**’ => ‘割り当てる検証ルール’,
‘**項目名**’ => ‘割り当てる検証ルール’,

];
“`

# バリデーションを利用する

“`index.php
@section(‘content’)

{{$msg}}

Name Mail
@csrf

name:

?【メモ】初学者がPHPの基礎まとめていく

# はじめに
1週間ほど前から、PHPの学習を始めたので理解した基礎部分をアウトプットしていく。
※未経験です。間違い等あれば指摘頂けましたら幸いです。

# PHPとは
動的にWebサービスを生成することができるサーバーサイドのスクリプト言語。
#### メリット
– シンプルな構文
– インターネット上に情報が多い
– 学習コストが低い
– 需要が高く案件が豊富
– 強力なフレームワークがある(Laravel)
#### デメリット
– Webアプリ以外の開発に不向き
– セキュリティが甘め
– 自由度が高すぎる

#### PHP公式サイト
[PHP](https://www.php.net/)

# PHPの基礎文法
## PHPの開始タグ・終了タグ
開始タグ``
PHPのファイルはHTMLも書けるが、PHPのコードしか書かない場合閉じタグを書くべきでないというルールになっている。
## メッセージの表示
メッセージは`echo`という命名を使用し、文字列は`”(シングルクォーテーション)`か`””(ダブルクォーテーション)`をで囲む
`

【Laravel 】専用サーバにデプロイした時のメモ

会社で契約してる専用サーバにLaravel × Vue のプロジェクトをデプロイした時のメモ。今までは共用のレンタルサーバにしかデプロイしたことがなく(!)、いくつか躓いた点があった。

環境 : Laravel8 MySQL CentOS

## ざっくり手順
SSHログイン

まだ入ってなければgitとcomposerとnvm(等のnodeバージョン管理ツール)とnode.js・npmをインストール

秘密鍵と公開鍵を作成

公開鍵をGitHub(もしくはBitBucket等)に登録

リモートリポジトリからgit clone

シンボリックリンクの設定

$ composer install コマンド

$ npm install コマンド

$ npm run prod コマンド

まだしてなければenvファイルの設定

DB作成

$ php artisan migrate コマンド

諸々の確認

公開

## シンボリックリンクの設定で躓く

ドメイン名直下の階層にhtdocs(環境によってはhtdocsではなくpublic_htmlやwwwとい

nl2brとは?何の略?

# よく見かけるnl2brとは?

改行文字を\
の前に挿入するPHPの組み込み関数みたいです

改行文字 = \r\n、 \n\r、\n、\r
これらの文字列の前に
をいれてくれる

# 何の略?
Newline to br
の略だそうです

***
仕事の中で最近よく見かけたのですが、あまり気にせずだったのでこの機会に調べてみました

ご参考になれば幸いです

Chapter4 ミドルウェアの利用(4-1)

# ミドルウェアとは

リクエストを受け取るとコントローラ処理の前後に割り込み、
独自の処理を追加する仕組みこと。

コントローラは、
「特定のアドレスにアクセスがあると、Larabelはルート情報をもとに、
指定のコントローラのアクションを呼び出す」役割がありますが、
全てのアクセス時に何かの処理をしておくとなると、
処理に負荷がかかったり何かと面倒。

そこで、「特定のアドレスに**リクエストが送られたら、**
自動的に何かしら処理を行う。」という仕組みを用意しました。

それが「ミドルウェア」です。
特徴として、コントローラの処理に影響されない。

# handleメソッド

Midllewareクラスには、1つだけメソッドが用意されています。
「handle」といういうクラスです。

“`Midelleware.php
public function handle(Request $request, Closure $next)
{
return $next($request);
}
“`
第一引数の「`$request`」はリクエスト情報を

【PHP】PHPのuseの使い方

useとはスコープ外の変数を関数内で使用できる。

“`PHP
‘太郎’, ‘age’ => 19],
[‘name’ => ‘洋子’, ‘age’ => 37],
[‘name’ => ‘美玖’, ‘age’ => 21],
[‘name’ => ‘信也’, ‘age’ => 15],
[‘name’ => ‘裕次郎’,’age’ => 45],
[‘name’ => ‘魁’, ‘age’ => 8],
[‘name’ => ‘達郎’, ‘age’ => 55],
[‘name’ => ‘真治’, ‘age’ => 29]
];

$low = ’20歳未満だから子供’;
$over = ‘大人’;
$age = 20;

$value = array_map(function($num)use($low,$over,$age){
return ($num[‘age’] < $age ?$low:$over); }, $people)

Mac VScode Xdebug v3 でデバッグ

# この記事について
下記環境でのデバッグ設定でハマった部分を記載
・MacOS Bin Sur 11.3.1
・Vscode 1.68.1
・php 8.0.20
・Xdebug 3.1.5
・XAMPP 8.0.19-0

# Xdebug 2 から 3にかけてphp.iniの記法が変わっている
ver2の時

xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_port = 9000

ver3の時

xdebug.mode = debug
xdebug.start_with_request = yes

まあ、めちゃめちゃ公式に書いているんですが、、、(英語苦手)
https://xdebug.org/docs/upgrade_guide

# Mac M1チップ特有の対応

file `which php`

で確認してからの

・arm64eの時

arch -arm64 sudo pecl install xdebug

・x86_6

PHPでランダムな時間を生成

**PHP Ver8.1.3**

DBにぶっこんだら0埋めしてくれそうだけど、これの出力値は0埋めされていません。

“`php
for($i = 0; $i < 5; $i++){ $randomYmdhis = '2022' . '/' . '06' . '/' . rand(1, 30) . ' ' . rand(0, 23) . ':' . rand(0, 59) . ':' . rand(0, 59); echo $randomYmdhis . "\n"; } ``` ``` 2022/06/19 20:12:27 2022/06/26 4:45:48 2022/06/7 7:57:11 2022/06/28 4:36:49 2022/06/1 11:24:47 ``` 時間計測(1000件) ```php $start = microtime(true); for($i = 0; $i < 1000; $i++){ $randomYmdhis = '2022' . '/' . '06' . '/' . rand(1, 30) . ' '

array_multisort(): Array sizes are inconsistent

**array_multisort()のパラメータ1にnullが混ざった配列を渡すと駄目みたい。**

“`php:NG
$sortKeys = [“a”,”b”,”c”,”d”,null,”e”,”f”];
array_multisort($sortKeys, SORT_DESC, $arr);
“`

windowsにPHPを入れてみた

## PHPのインストールが難しかった
私は英語が大層苦手で、バージョンも沢山あってよく分からなかったのでやったことを残しておきます。
[PHPマニュアル](https://www.php.net/manual/ja/install.php)を読んでできる人は全く問題ないです。

# PHPのインストール方法

[PHP For Windows : Home](https://windows.php.net/index.php)にアクセスします。
タブの2つ目に`Downloads`があるのでクリックします。

[![Image from Gyazo](https://i.gyazo.com/4e17dc7117f9f4be7d1258ba97da4e37.png)](https://gyazo.com/4e17dc7117f9f4be7d1258ba97da4e37)

何を入れていいか分からないですが、グレー枠の上から2番目のZipファイルをダウンロードします。ApacheというWebサーバーを使いたいときにこっちの方がいいらしいという記事を見ただけなので、一番上のZipファイルで

【Laravel8】親子テーブル(1対多のリレーション)を結合させたcsvファイルのインポート機能

## 初めに
筆者はプログラミング初心者であり個人的な備忘録です。予めご了承ください。

内容
・1対多のリレーションのテーブルの結合処理(JOIN句)
・csvインポート(ダウンロード)機能
・大容量(10万件)のデータを処理するための分割機能chunk&タイムアウト時間の延長

## 環境
Windows 10
XAMMP
PHP 7.4.29
Laravel Framework 8.83.15

## 実装例
ECサイトの商品ページ内のオプション部分の管理画面を作る想定
【例1】Tシャツの色(レッド・ブルー・グリーン)の3通りの選択肢
【例2】Tシャツのサイズ(Sサイズ・Mサイズ・Lサイズ・LLサイズ)の4通りの選択肢
オプションのCSVデータのインポート(ダウンロード)機能を実装する

下記イラストのような関係を持つ2つのテーブルを用意します。
`options`が親で`child_options`が子の関係となります。
![1111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713225

【Laravel】Illuminate\Database\Eloquent\Collection::paginate does not exist.

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 状況
ページネーションを実装しようとしたらタイトルのエラー。

“`controller.php
public function show()
{
$readHistories = $request->user()->readHistories()->paginate(25);

return new ReadHistoryCollection($readHistories);
}
“`

“`Models/User.php
public function readHistories(): Collection
{
$hogeReadHistories = $this->hogeReadHistories()->get();
$fugaReadHistories = $this->fugaReadHistories()->get();

return $hogeReadHistories->merge($fugaReadHistories)->sortByDesc(‘c

【PHPUnit】よりベターなテストの仕方

## 環境

Laravel v9.5.1 (PHP v8.1.3)

## 前提条件

PostモデルにUserで検索する“`scopeByUser()“`を定義している。
Unitテストでこのメソッドをテストしたい。

“`php
public function scopeByUser($query, User $user): Builder
{
return $query->where(‘user_id’, $user->id);
}
“`

## Before

“`php
/**
* scopeByUser()のテスト
* UserでPostを検索することができる
*/
public function testScopeByUser()
{
$users = User::factory()->count(2)->create();
$posts = Post::factory()->for($users[0])->count(5)->create();
$otherPost = Post::factory()

【PHPUnit】例外のテストは$this->expectException()を先に書く

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 前提条件
“`UserRole“`が“`1~3“`までEnumで定義されてるところに、存在しない“`4“`を入れてエラーが起きることをテストしたい。

## テスト方法
**例外のテストは、テストしたいメソッドより先に書く。**

理由はテストしたいメソッドを先に書くと、そこで例外が発生しエラーで落ちるから。
少し考えれば当たり前なんだけど、普段テストを書きまくっているとつい最後に書くものと思い込んでしまっていた。
“`expectException“`「エラーを期待する」という命名からも先に書くことは予想できる。

“`php
public function testError()
{
$this->expectException(ValueError::class);

UserRole::from(4);
}
“`

## RailsのRSpecでは

“`expect“`のブロックの中にテストしたいメソッドを書くことで例外の発生をテストできる。

“`ruby
subj