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

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

プロジェクトのPHPライブラリの脆弱性をチェックするGithub Actionを作りました

# はじめに
こんにちは[@glassmonekey](https://twitter.com/glassmonekey)です。PHPを書く機会が増えそうなので、以前作って放置していた[php-audit-action](https://qiita.com/glassmonkey/items/ef49c91d597e684a7ae7)をcomposer.lockから脆弱性情報があればissueを立てるactionにしてみました。

この記事では、使い方や実装の紹介をします。

ソースコードなどは下記となります。バグ報告や要望などお待ちしております。よしよかったらStarください?
[ソースコード](https://github.com/glassmonkey/actions-php-audit)
[マーケットプレイス](https://github.com/marketplace/actions/php-audit-action)

# 使い方
Github Actionの使い方そのものはこの記事では解説をしません。公式の[Getting started with GitHub Ac

元記事を表示

PHPオブジェクト指向基礎まとめ(2)

『PHPオブジェクト指向基礎まとめ(1)』
https://qiita.com/imayasu/items/03bf73d1d844bef6a194
の続き

# $thisについて
メソッドの中でインスタンスのプロパティやメソッドにアクセスしたい時には$thisという特殊な変数を使う。

“`php
class Animal {
public $name;
public function hello() {
echo “私の名前は{$this->name}です”; //hello()の中でnameプロパティにアクセスしたい
}
}

$cat = new Animal();
$cat->name = ‘MIKE’;
$cat->hello();
“`
# コンストラクタ
__construct()という記述をするとインスタンスを生成した時に自動でメソッドが呼ばれる。
コンストラクタには引数をとることができ、コンストラクタメソッドの中で$thisを用いてプロパティに値をセットすることができる。
※コンストラクタの記述はアンダーバー2つから始まることに注意

元記事を表示

PHPオブジェクト指向基礎まとめ(1)

# オブジェクト指向
**もの(オブジェクト)を中心にした考え方**
サイトやWEBサービスはユーザー、アイテム、グループなど1つ1つのものを組み合わせて出来上がっていると考えることができる。
この考え方によって、コードをユーザーに関するコード、商品に関するコード・・・という具合に役割を明確に分けてプログラムを作り上げることができる。
# クラスの定義
クラスとはオブジェクトの設計図のようなもの。
**class クラス名**という形で定義し、{}の中に定義したクラスの内容を書いていく。
クラス名は大文字から始まる。(Dog、Cat、Car、Menu・・・)

“`php
class クラス名 { //クラス名は大文字から始まる。
//クラスの内容
}
“`
# インスタンス
クラスを元に作成された実体のこと。
**new インスタンス名()**という形で生成される。
**$変数名 = new クラス名();**
という感じに変数に代入し、クラスの外で生成する。

“`php
class クラス名{
}
$変数名1 = new インスタンス名1(); //クラスの外で生成
$変

元記事を表示

PHPでの数字系の関数

**学習記録**

#前提条件
・PHP version 5.4

#数字系の関数

|関数|概要         |
|:————– |:——————|
| ceil()          |切り上げ|
| floot()          |切り捨て|
| round()     |四捨五入|
| round(a, ‘○’)       |aを小数○桁になるように四捨五入|
| mt_rand(a, b) |aからbのランダム整数値を返す|
| max(a, b, c,…) |()内の最大値を返す|
| min(a, b, c,…) |()内の最小値を返す|
| M_PI |円周率|
| M_SQRT2 |2の平方根|

元記事を表示

PHPビルトイン関数~配列に関する関数~

**学習記録**

#前提条件
・PHP version 5.4

#配列に関するの関数
・array_unshift
・array_push
・array_shift
・array_pop
・array_slice
・array_splice

##array_unshift
配列の**先頭**に追加する

“`PHP:書式
$変数=array_unshift(配列, 追加したい要素);
//追加したい要素は何個でも可能
“`
“`builtin.php
$input = [30, 40, 50];
array_unshift($input, 10, 20);
print_r($input);
//結果 : Array ( [0] => 10
//        [1] => 20
//        [2] => 30
//        [3] => 40
//        [4] => 50)
“`

##array_push
配列の**末尾**に追加する

“`PHP:書式
$変数=array_push(配列, 追加したい要素);
//追加したい要素は何

元記事を表示

PHPのタイムスタンプについて

**学習記録**

#前提条件
・PHP version 5.4

#UNIXタイムスタンプ

|関数|概要         |
|:————– |:——————|
| ceil()          |切り上げ|
| floot()          |切り捨て|
| round()     |四捨五入|
| round(a, ‘○’)       |aを小数○桁になるように四捨五入|
| mt_rand(a, b) |aからbのランダム整数値を返す|
| max(a, b, c,…) |()内の最大値を返す|
| min(a, b, c,…) |()内の最小値を返す|
| M_PI |円周率|
| M_SQRT2 |2の平方根|

#日時を扱う関数

“`builtin.php
//現在の秒数を表示する
echo time() . PHP_EOL;
//結果:1587889548

//年-月-日 曜日の表示
ech

元記事を表示

文字列を配列に、配列を文字列にする

**学習記録**

#前提条件
・PHP version 5.4

#配列⇔文字列 
・implode
・explode

##implode
配列を文字列にする

“`PHP:書式
$変数=implode(‘配列の要素をつなげたい文字’, 配列);
“`
“`builtin.php
$input = [10, 20, 30];
echo implode(‘-‘, $input);
//結果 : 10-20-30
“`

##explode
文字列を配列にする

“`PHP:書式
$変数=explode(‘どの区切りで配列にするか’, 文字列);
“`
“`builtin.php
$input = ’10:20:30′;
print_r(implode(‘:’, $input));
//結果 : Array ( [0] => 10 [1] => 20 [2] => 30 )
“`

元記事を表示

PHPビルトイン関数~固定長のデータを扱う~

**学習記録**

#前提条件
・PHP version 5.4

#固定長データを扱う関数
・substr
・substr_replace
・preg_match
・preg_replace

##substr
文字列の一部分を切り返す

“`PHP:書式
$変数=substr(文字列, 抜き出したい最初の位置, 抜き出したい桁数);
//抜き出したい桁数を負にすると文字列の後ろから始まる
“`
“`builtin.php
$input = ‘20200422 Item-A 1200’;
$date = substr($input, 0, 8);
echo $data;
//結果 : 20200422
“`

##substr_replace
文字列の置換

“`PHP:書式
$変数=strpos(文字列, 置換文字列, 抜き出したい最初の位置, 抜き出したい桁数);
“`
“`builtin.php
$input = ‘20200422 Item-A 1200’;
echo substr_replace($input, ‘Item-B’, 8, 8);
//結果

元記事を表示

PHPで配列をソート、シャッフルする

**学習記録**

#前提条件
・PHP version 5.4

#配列のソートとシャッフル
・sort
・rsort
・shuffle
・array_rand

##sort
配列の要素を小さい順に並べる

“`php:built.php
$scores = [40, 50, 20, 30];

sort($scores);
print_r($scores);
//結果: Array(
// [0] => 20
// [1] => 30
// [2] => 40
// [3] => 50)
“`

##rsort
配列の要素を大きい順に並べる

“`php:built.php
$scores = [40, 50, 20, 30];

rsort($scores);
print_r($scores);
//結果: Array(
// [0] => 50
// [1] => 40
// [2] => 30
//

元記事を表示

配列の値を集計する

**学習記録**

#前提条件
・PHP version 5.4

#配列のソートとシャッフル

##array_fill
配列を作る

“`php:書式
array_fill(最初のインデックス, 要素の数, 要素の値)
“`
“`php:built.php
$scores = array_fill(0, 5, 10);
print_r($scores);
//Array(
// [0] => 10
// [1] => 10
// [2] => 10
// [3] => 10
// [4] => 10)
“`

##range
ある範囲の整数を有する配列を作成する

“`php:書式
range(最初の値, 終わりの値)
“`
“`php:built.php
$scores = range(1, 5);
print_r($scores);
//Array(
// [0] => 1
// [1] => 2
// [2] => 3
// [3] => 4
// [4] => 5)

//第三引数に数字を入れるとその数字分増加する
$scores = r

元記事を表示

PHP関数~文字列を扱う関数~

学習記録

#前提条件
・PHP version 5.4

#文字列を扱う関数
・strlen / mb_strlen
・strpos / mb_strpos
・str_replace
・trim

##strlen/mb_strlen
文字をバイト数調べる

“`PHP:書式
$変数=strlen(調べたい文字列);

//日本語対応
$変数=mb_strlen(調べたいの文字列);
“`
“`builtin.php
$input = ‘string’;
echo strlen($input);
//結果 : 6

$input = ‘こんにちは’;
echo mb_strlen($input);
//結果 : 5
“`

##strpos/mb_strpos
文字列からある文字を探す

“`PHP:書式
$変数=strpos(文字列,’探したい文字’);

//日本語対応
$変数=mb_strpos(文字列,’探したい文字’);
“`
“`builtin.php
$input = ‘string’;
echo strlen($input, ‘t’);
//結果 : 1

元記事を表示

Laravelのミドルウェアをテストする方法を考えてみた

テストするときにミドルウェアを無効化する記事はあっても、ミドルウェアそのものをテストする記事があまり無かったので、書いてみます。

# 前提
– Laravel 6.18.10
– PHP 7.3.15

# ミドルウェア

ここでは、リクエストに含まれるバージョンをチェックするミドルウェアを作ってみます。[^1] API という前提で書きますが、基本的な考え方は Web でも同じだと思います。

[^1]: ミドルウェアには、コントローラの **前** に動くタイプと、 **後** に動くタイプの2種類がありますが、ここでは **前** に動くタイプを作ります。

リクエストに含まれている `version` が `MIN_VERSION` [^2] 以上である場合は、許可します。

一方、そもそも `version` が送信されなかったり、 `version` が `MIN_VERSION` よりも小さい場合は、エラーの JSON レスポンスを返します。[^3]

[^2]: 本来、 `MIN_VERSION` は DB 等から取得するべきですが、ここでは簡略化します。
[^3]:

元記事を表示

Pterodactyl Panelで、2FAコードが取得できなくなってログインできなくなった時の処置

## パスワードを再発行しても、2FA認証は解除されない
2FA認証が出来ない状況でもパスワードの再発行はできましたが、新しいパスワードでログインを試行しても2FAコードが要求されてしまう。

## コントロールパネルには2FA設定を解除する項目が無かった
![screenshot_20200426_220354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620130/64e4903b-2ed0-b25f-d99e-9dc5891c6d9f.png)
![screenshot_20200426_220438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620130/860414e3-5107-8f67-04b6-9d7edfd6e5cf.png)

## 解決策
職人(artisan)に頼み込んで、強制的に2FA認証を取り消す

“`bash
php artisan p:user:disable2fa –ema

元記事を表示

MAMP環境にLarabelをインストールする方法

#①MAMPのhtdocsにディレクトリ移動

ターミナルを開き、下記コマンドを入力。

“`
$ cd /Applications/MAMP/htdocs
“`

#②Larabelプロジェクト作成

htdocs配下において、下記コマンドを入力。

“`
公文)
$ composer create-project laravel/laravel プロジェクト名 –prefer-dist “6.0.*”
例)
$ composer create-project laravel/laravel larabel_test –prefer-dist “6.0.*”
“`

#③対象プロジェクトのディレクトリに移動

htdocs配下において、下記コマンドを入力。

“`
公文)
$ cd プロジェクト名
例)
$ cd larabel_test
“`

#④サーバ起動

③で作成したディレクトリ配下において、下記コマンドを入力。

“`
$ php artisan serve
“`

#⑤サーバ起動確認

ブラウザを開き、下記にアクセス。
http://127.0.0.

元記事を表示

PHPの入力、送信フォームでファイルを送信するとPOSTが全部消える問題

PHPにて会員登録フォームを作り、ファイルも一緒に乗っけていざ送信をしようとすると、全てのPOSTデータが消えてしまう問題に直面しました。

具体的には、下記のようにinputタグで入力フォームを作ります。
その際にinput type=”file” としてファイルも送信できるようにします。
またファイル以外の各inputタグのvalueには、POSTのデータをリダイレクトされた場合でも表示できるようプログラム記入しています。

スクリーンショット 2020-04-26 17.49.17.png

ここで画像の拡張子以外を弾くプログラムを記入し、Zipなどは入れないように、下記のエラーメッセージが出るようにするのが目標です。

スクリーンショット 2020-04-26 1</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>PHP</div>
<div class='tag-cloud-link'>フォーム</div>
<div class='tag-cloud-link'>post</div>
<div class='tag-cloud-link'>送信</div>
<div class='tag-cloud-link'>消える</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/Taku_Matsu/items/5d5ecde318ad14d8ea24'>元記事を表示</a></div>
<h3 id=Laravel7 Bladeファイルのひな形を作成するmakeコマンドを自作する

## 概要

前回の記事[Laravel7 makeコマンドのひな形をカスタマイズする](https://qiita.com/ucan-lab/items/eab7d869359b5fa72ba0)でスタブのカスタマイズは行えましたが、makeコマンドを追加したい時の例をご紹介します。

## 環境

– Laravel 7.5.1

## make:blade コマンド

今回は `make:blade` コマンドを自作します。
他のmake系コマンドは`GeneratorCommand`クラスを継承しているのでそれに倣って作成します。

https://laravel.com/api/7.x/Illuminate/Console/GeneratorCommand.html

`app/Console/Commands/BladeMakeCommand.php` ファイルに以下の内容を記述します。

“`php:app/Console/Commands/BladeMakeCommand.php

元記事を表示

Laravel7 makeコマンドのひな形ファイルをカスタマイズする

## 概要

Laravel7以降からStubのカスタマイズを簡単に行える機能が追加されました。
makeコマンドで使用される元のひな形ファイルを簡単にカスタマイズできて便利なのでご紹介します。

## 環境

– Laravel 7.5.1

## モデルのひな形を生成するコマンド

“`
$ php artisan make:model Post
“`

“`php:app/Post.php

元記事を表示

phpアプリをherokuにデプロイ→エラー 私がハマったポイント。

「おいおいにもデプロイできないのかよ、、、」と自分に幻滅していましたが、粘ってエラー解決しました。
自分用で書き残します。

# sqlファイルの読み込み
docker環境で開発していた際に使っていたDBをsqlファイルとしてエクスポートし、これをherokuでも使いたいなーと思っていました。
herokuのDBはpostgreSQLしかないもんだと思っていたので、postgreSQLを使おうとしていたのですが、これではMySQLが使えないのですね。
DBに関する知識に疎く、ここで時間を食ってしまいました。

どうやらherokuにおいてMySQLを使うならclearDBらしい。というわけでこれを使いました。
clearDBをアドオンに追加したらば、

を参考にSequel Proと連携。sqlファイルもカンタンに読み込めましたし、DBの操作・閲覧がカンタンにできるようになりました。

# ログイン機能が使えない
ログイン機能を付したアプリケーションでしたが、ログインをするとエラーに。
???

元記事を表示

Laravelで ErrorException Creating default object from empty valueというエラー

### エラーの原因
色々なケースでこのエラーは起こり得ますが、Laravelでこのエラーが出た時に多いパターンのひとつに「Soft Delete = 論理削除したデータ」を取ってこようとしてnullを取ってきてしまい、エラーになっているというものがあります。

“`php:Product.php
// 実際のコード
// Productモデルにはソフトデリートが定義されている
namespace App\Models;

use Illuminate\Database\Eloquent\SoftDeletes;

class Product extends Model
{
use SoftDeletes;
}

// 加えてproductsテーブルにはdeleted_atのカラムに値が入っている
“`

“`php:ProductController.php
// id=1 のプロダクトが論理削除されている場合
// コントローラなどで該当のデータを取って来ようとすると…
$product = Product::find(1);
$product->name;

// 実行

元記事を表示

Mac Laravel 500 server errorが出た話

# 目的

– 環境構築直後にローカル開発環境で500 server errorが出た話をまとめる

# エラー概要

– `$ php artisan serve`を実行してブラウザで[http://127.0.0.1:8000/](http://127.0.0.1:8000/)を確認したところ500 server error(下記のもの)が出力された。

BC3D17BD-A681-4E81-A83F-B40391C770AA.png

# 解決法

1. アプリ名ディレクトリを確認すると.envが存在していないことがわかった。
1. 下記コマンドを実行して.envを作成する。

“`terminal
$ cd アプリ名ディレクトリ
$ cp .env.example .en

元記事を表示

OTHERカテゴリの最新記事