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

PHP関連のことを調べてみた2020年03月22日
目次

暗号化って結局どれを選べば良いの?OWASP Cryptographic Storage Cheat Sheetまとめ

# はじめに
WEBアプリケーションを開発するときに、「個人情報は暗号化して保存すること」といった要件を見かけます。一口に暗号化といっても、共通鍵暗号、公開鍵暗号、AES、DES、RSA、SHA、暗号モード、ブロック暗号と色々なワードが出てきて、どれを選んだら良いかわからなくなります(した)。本記事では、その時に調べてわかったことを備忘録的に書きます。

本記事では、以下に2つを参考にしています。

– [OWASP Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html)
– [CRYPTREC暗号リスト
(電子政府推奨暗号リスト)](https://www.cryptrec.go.jp/method.html)

なお、パスワードは、本記事で紹介する暗号化して保存することはしないでください。パスワードはハッシュ化して保存します。詳しくは、[OWASP ASVS 4.0 V2.4 からパスワードの保存

元記事を表示

PHPの時間関連の関数について

PHPの時刻関連の処理でわからないことがあったので調べた。

## date関数
ローカルの日付・時間を書式化する。

指定された引数(timestamp)を与えられた文字列によってフォーマットし、日付文字列を返す。
タイムスタンプが与えられない場合は、現在の時刻が利用される。タイムスタンプのデフォルト値は現在のUnixタイムスタンプを返すtime関数となっている。

### 説明
“`php
date ( string $format [, int $timestamp = time() ] )
“`

#### 引数
##### format
一つ目の引数である`format`で出力される文字列の書式を決定する。
##### timestamp
Unixタイムスタンプを渡す。

#### 返り値
日付を表す文字列が返される。timestampに数字以外が使用された場合は、FALSEが返される。

### 利用例

“`php
echo date(“m.d.y”); // 3.21.20

echo date(“H:i:s”); // 12:40:22

echo date(

元記事を表示

LravelのDBテーブル作成&データ投入

##お約束事
本記事で発信される情報は、正確性、完全性、有用性、その他の事項について一切責任を負いかねます。自己判断にてご活用ください。

#全体の流れ

– Migrationを行いテーブルを作成する
1. migrationコマンドを実行するための空ファイルの作成
2. 作成されたmigrationファイルをテーブル構造通りに記述する
3. migrateコマンドで実際にテーブルを作成する
4. 型変更、カラム追加・削除等

– Sheederを用いてテーブルデータを投入する
1. seedを実行するための空ファイルの作成
2. 作成されたseedファイルを投入したいデータに合わせて記述する
3. seedコマンドで実際にテーブルにデータを投入する

##Migrationでテーブルを作成する

###1、migrationするための空ファイルの作成

“`:ターミナルでの作業
$php artisan make:migration {テーブル名}
Created Migration: {年}_{月}_{日}_{時間}_{テーブル名}
“`
{プロジェクトRoot

元記事を表示

【fullcalendar】Laravelとfullcalendar(v4)を使って予約管理システムを作った話【Laravel】

仮想案件
家庭教師予約システムをつくる

仕様概要
・家庭教師派遣会社は先生(学生バイト達)をAdmin管理画面からスケジューリング
・会員(生徒)は任意の先生を管理画面から予約
・派遣会社の画面と会員の画面はそれぞれ別の認証経路(マルチAuth)
・UIはGoogleカレンダー風を希望

前提
・fullcalendarメインの記事になります
・Laravelの基本を理解している方向けです
・非同期通信の基本も理解している方向けです
・データベース設計の基本も理解している方向けです
要はfullcalendarにポイントを置いてます。

目次

1. 完成イメージ
2. LaravelのマルチAuth対応
3. 管理画面の作成
4. fullcalendarの組み込み
5. ビジネスロジックの実装
6. 補足

1.完成イメージ

家庭教師派遣会社が使用するAdmin管理画面(週表示)
カレンダー左横の先生の箱をカレンダーにドロップしてイベントを作成
![スクリーンショット_2020-03-2

元記事を表示

echoとprintの違い

PHPの`echo`と`print`はどちらも関数ではなく言語構造です。どちらも文字列を出力バッファに書き出すという機能では同じですが、使われかたが異なります。

“`php
echo 1, 2, 3; // ← syntax error ではない
print 1, 2, 3; // ← これは syntax error

echo print 1; // ← syntax error ではない
print echo 1; // ← これは syntax error
“`

## 形式的に言うと

* `echo`と`print`はどちらも**出力バッファ**に書き込む機能です
* まれに「標準出力する」と言及されますが、それは間違いです
* `fwrite(STDOUT, $str)`の実行結果とは一致しないということです
* `echo`は文ですが`print`は式です
* `echo`は複数の引数をとりますが、`print`は1つの引数をとります
* 便宜上関数マニュアルに掲載されているが**関数ではありません**

## どれを使えばいいの?

好み

元記事を表示

Fuelを使ってパラメータ付きPOSTリクエストを送信した

なんとかHTTPリクエストをAndroidのエミュレーターからローカルホストのLaravelサーバーに送信することができたので投稿します。

# ライブラリのインストール
`app/build.gradle`にインストールするライブラリを書いていきます。

“`gradle:app/build.gradle
dependencies {
// Fuel for HTTP Connections
implementation ‘com.github.kittinunf.fuel:fuel:2.2.0’
implementation ‘com.github.kittinunf.fuel:fuel-gson:2.2.0’

implementation “com.squareup.moshi:moshi:1.5.0”
implementation “com.squareup.moshi:moshi-kotlin:1.5.0”
}
“`

HTTPリクエストを送信するための`Fuel`と,JSONのパラメータを作成するための`moshi`をインストー

元記事を表示

本日の学習内容part2

##参考記事
https://phpjp.com/sha1.php

##パスワードの暗号化(sha1)
あるパスワードをDBに登録時に暗号化した(ハッシュ計算)後、ログイン画面で入力したパスワードがDBのパスワード(暗号化済み)と合っているかどうかをチェックする時は暗号化を行う。
“`login.php
if ($_POST[‘password’] !== ”) {
$login = $db->prepare(‘SELECT * FROM members WHERE password=?’);
$login->execute(array(
sha1($_POST[‘password’])
));
$member = $login->fetch();
“`

##感想
学習した内容を上手く文章に出来なくててもどかしい(笑) これからそのスキルも磨いていきたい。

元記事を表示

配列で受け取ったRequestに対してのバリデーション

“`view

{{ csrf_field() }}

CircleCi2.0でphpunit実行時に Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate… が出たときの対処法

### やってもダメだったこと
“`php.ini
memory_limit = -1 // メモリの制限を無くす
“`
“`..circleci/config.yml
– image: circleci/mysql:5.7
command: [–max_allowed_packet=32M] // mysqlのパケット制限を増やす
“`

### 解決策
“`..circleci/config.yml
– run:
command: vendor/bin/phpunit -d memory_limit=512M
“`
phpunitの実行オプションに-d memory_limit=512Mをつけることで解決しました。

なかなか解決策が見つからなくて、かなりハマってしまいました(汗)
この記事が誰かのお役に立てたら何よりです。

### 参考にさせていただいた記事
https://qiita.com/pinekta/items/4ece0c88402610f874d0
↓こちらに解決策が載ってました。
https://discuss.circleci.c

Laravel ソースコードリーディング サービスコンテナ編 part.1 – bindとmake、buildとresolve –

いい加減サービスコンテナをよく知らずに使うのはよくないな〜ということでLaravelコアのコードを読みつつ、記事を書いて投げてみました。同じようなLaravel初心者の方の参考になれば幸い…

ただ、僕もまだまだ未熟ですので、意図の読み違いなどは普通にあり得ると思います。間違いなどありましたらご指摘くだされば幸いです:pray:

## 基礎知識: サービスコンテナ

DIコンテナとも。Dependency Injection パターンと併用して、依存性を1箇所に集める。
Laravelアプリケーション内における様々なインスタンスの生成を担う。Laravelでは文字通り、これがないとアプリケーションが始まらない。Laravelのコアと言って良い。
FQCNは `Illuminate\Foundation\Application`クラスで、Laravel中ではよく`$app`というプロパティとして現れる。
`Illuminate\Foundation\Application`クラスは`Illuminate\Container\Container`クラスを継承しており、コンテナの結合

Laravelのサーバレス用ライブラリbrefを使い、lambdaでhello world

プロジェクトを作ってから少し手を加えるだけで、Laravelのサーバレス化ができました。
AWS上のデプロイはServerless Frameworkが全てやってくれます。

[本家のドキュメントはこちら](https://bref.sh/docs/frameworks/laravel.html)
[Githubはこちら](https://github.com/umihico/laravel-demo)

“`bash
composer create-project –prefer-dist laravel/laravel laravel-demo #プロジェクト作成
cd laravel-demo
composer require bref/bref #肝のbrefインストール
“`

以下の編集を加えます。[b508b15](https://github.com/umihico/laravel-demo/commit/b508b15edf5d1f0a0a7b51e2360e4f390da3dac1)

“`diff:.env
– SESSION_DRIVER=file
+

Serverless Frameworkのアプリにカスタムドメインを付与する

[前回作成したLaravelのサーバレスアプリ](https://qiita.com/umihico/items/64fcf159f68ebd866170)にカスタムドメインでアクセスできるようにします。
ACMで証明書を取得します。Route53経由の方はDNS経由で簡単に取得できます。サブドメインはワイルドカードで申請するのみです。
**Lambda関数がEdgeの場合は、`us-east-1`(バージニア北部)のACMである必要があります。東京のACMは関係ありません。**

スクリーンショット 2020-03-21 10.54.52.png

発行済になったら`serverless-domain-manager`のインストールします。[a4e6e25d](https://github.com/umihi

XAMPP なしで、Windows の Visual Studio Code を使って PHP デバッグしてみる

XAMPPを入れれば簡単に実現できますが、タイトルとおり「Webサーバなしで」あえてローカル PHP だけインストールして Visual Studio Code(以下 VSCode)で PHP を実行&デバッグしてみます。※XAMPPが嫌いな訳ではない

お約束の微妙にはまる点があったので自分メモ用に残しておきます。

# 動作環境
– Windows 8/10
– Visual Studio Code 1.43.1 ※インストール済みであること
– [PHP 7.4.4](https://windows.php.net/download#php-7.4) (VC15 x64 Thread Safe / php-7.4.4-Win32-vc15-x64.zip)

## PHP のインストール
https://windows.php.net/download#php-7.4 から Thread Safe 版をダウンロードして任意のディレクトリに展開しておく。(ここでは C:\php7 にインストールしてみてます)

Windowsの環境変数に `C:\php7` を追加して黒い画面で

Laravelでスコープ

##定義方法

scope名は必ず最初にscopeを名前の初めに付ける必要がある.
・scopeUserName
・scopeBookSerialNo
上記のようにスコープ名をつける。

“`php
public function scope+名前($query, 引数)
{
# 処理内容
return 絞り込んだビルダ(検索条件)
}
“`

##ローカルスコープ

定義したメソッドを呼び出す場合に実行することができるスコープ。
逆に定義していれば自動的にスコープメソッドが実行されるものはグローバルスコープ。

“`Person.php
# scopeの定義
public function scopeNameEqual($query, $str)
{
return $query->where(‘name’, $str);
}
“`

“`PersonController.php
public function search(Request $request){
$input_val = $request->input;

WordPressのカスタマイザーで設定できるオプションタイプとサンプルコードまとめ

カスタマイザーで使えるオプションのタイプ一覧とサンプルコードまとめ。

## カスタマイザーの基本構造
カスタマイザーはfunctions.phpに書く。

セクション、設定、コントロール(フォーム)の3つを定義する必要がある。

セクションはグループなので1つでもOK。設定とコントロールは対になってるのでオプションごとに両方とも必要。

“`php
function mytheme_customize_register( $wp_customize ) {
// セクション(グループ)を作成
$wp_customize->add_section( ‘your_section_id’ , array(
‘title’ => __( ‘Theme Color’, ‘theme_name’ ),
‘priority’ => 21,
) );
// データベースに新しい設定項目を登録
$wp_customize->add_setting( ‘your_setting_id’ , array(
‘default’ => ‘Dark’,

Laravel ベースレイアウトを使って表示するページのheaderやfooterのデザインを統一しよう

# 目的

– ベースレイアウトの定義と継承を行いデザインの統一化やコーディングの簡略化の方法を学んだので忘れない様にまとめる
– 主に下記の本に記載されていたことを筆者なりに解釈してまとめる(筆者の文章が稚拙なため、深く勉強したい方は書籍を購入した方が良いかも知れない)
– [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/dp/4798060992/ref=sspa_dk_detail_0?psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExUTc5NThMOVcyWktBJmVuY3J5cHRlZElkPUEwNDAxMzQ1RERTNjJFM1YzMVZEJmVuY3J5cHRlZEFkSWQ9QTNIVjdNMEVMTFNYOEomd2lkZ2V0TmFtZT1zcF9kZXRhaWwmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

# ベースレイアウトとは?

– 文字通りビューファイルのベースとなるレイアウトである。
– アプ

【Laravel】配列取り出し方パターン

##単純配列

“`PHP:単純配列
$memo[] = array();
$memo = [100,200,300,400,500];
$data = $memo[2];

echo $data;
//300
“`

“`PHP:連想配列
$memo[] = array();
$memo = [
‘counry’ => ‘Japan’,
‘capital’ => ‘Tokyo’,
‘population’ => 120000000
];
$data = $memo[‘capital’];

echo $data;
//Tokyo
“`

“`PHP:連想配列(value値が複数)
$memo[] = array();
$memo = [
‘country’ => [‘Japan’, ‘China’, ‘Korea’],
‘capital’ => [‘Tokyo’, ‘Beigin’, ‘Sore’]
];
$data = $memo[‘capital’][1];

echo $data;
//Beigin
“`

“`PHP:多次元配列
$mem

Laravel 検索機能サンプル

searchアクションで検索結果があれば表示するサンプル

“`routes.php
Route::get(‘/person/{id}’, ‘PersonController@find’);
Route::post(‘/person/{id}’, ‘PersonController@search’);
“`

“`controller.php

public function find(Request $request){
return view(‘person.find’, [‘input’ => ”, ‘id’ => $request->id]);
}

public function search(Request $request){
$input_val = $request->input;
$item = Person::find($input_val);
return view(‘person.find’, [‘input’ => $input_val, ‘id’ => $request->id, ‘item’ => $

PHPのisset()と等価な条件式を書いてisset()への理解を深めたい

# 問い

`$hoge` を変数とする。 `$hoge` は定義されていて、かつ配列型であるとする。

このとき、 `isset($hoge[‘fuga’][‘piyo’])` と等価な条件式を書け。

ここで「2つの条件式が等価である」とは、「条件を満たすどのような `$hoge` に対しても2つの条件式の真偽が一致する」ことを意味することとする。

また、条件式を書くにあたっては論理演算子と以下の関数のみを用いることとする。

– `array_key_exists()`
– `is_array`
– `is_null`

# 答えの例

“`php
array_key_exists(‘fuga’, $hoge)
&& !is_null($hoge[‘fuga’])
&& is_array($hoge[‘fuga’])
&& array_key_exists(‘piyo’, $hoge[‘fuga’])
&& !is_null($hoge[‘fuga’][‘piyo’])
“`

# 証明

省略

モデルメソッドの使い方

メソッドを定義してuseして使うだけ

“`php
# 使い方(Personモデルでの例)
use App\Person; #コントローラでuse

$person = Person::all(); #インスタンス取得
$Person->モデルメソッド(); #メソッドを使用
“`

####viewで表示する例:

“`Person.php
# メソッド定義
public function getData()
{
return $this->id . ‘:’ . $this->name . ‘(‘ . $this->age . ‘)’;
}
“`

“`PersonController.php

use App\Person;
use Illuminate\Http\Request;

class PersonController extends Controller
{
public function index(){
$people = Person::all();
return view(‘person.index’, [‘

name:
email:
age: