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

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

PHP 検索・置換系の引数の順番まとめ

\$needleと\$haystackどっちが先だったっけ?
といつも~~記憶喪失~~悩まされるのでメモ

| 関数 | 第1引数 | 第2引数 | 第3引数 | 第4引数 | 第5引数 |
|:–|:–|:–|:–|:–|:–|
| strpos | $haystack | $needle | $offset | | |
| substr_count | $haystack | $needle | $offset | $length | |
| str_replace | $search | $replace | $subject | $count | |
| preg_match | $pattern

Laravel触って1年経ったので過去の戒め(ソースコード)を改善してみた

# Laravelのリファクタ記事にしようと思ったが、ただただ間違ったコードを直すだけの記事でした。

久々に過去練習用として作成したサイトのソースコードを覗いたら無駄な処理書いてたり、
Laravelの機能活かせれてなかったり~~そもそもPHP使えてなかったり~~と散々だったので、
いい反面教師コードだと思って改善記事(改善というか修正レベル)書いてみました。

目に付いた部分しか改善しないので、一貫性はありませんし、
他の方が絶対やらないような事も多々ありますが、~~戒めとして~~どうか生温かい目で見守ってください。

## 環境

Laravel5.7
PHP7.1

## 注意

改善とはいえ、これがベストとは思ってません。
あくまで出来る時間で簡単な改善(修正)を行っただけです。
その辺り、ご容赦くださいm(._.)m

関係ないところは一部省略します。
例外処理等も省略します。

## フォームリクエストの謎の使い方

FormRequest便利ですよね。
Controllerにバリデーションを書かずに済むので良く使っています。
(他にもControllerで受け取る前の前

?【CakePHP2】js.mapファイルが存在しないエラーの解消法

## 環境
PHP 7.2.21
CakePHP 2.10.18

## やりたいこと
pnotifyを追加したところ、下記の様なJsControllerが無いエラーが多数吐かれていたが動作に問題はなかった
が、このまま放置は良くないので出ないように修正したい

“`error.log
2020-03-04 10:10:58 Error: [MissingControllerException] Controller class JsController could not be found.
Exception Attributes: array (
‘class’ => ‘JsController’,
‘plugin’ => NULL,
)
Request URL: /js/vendor/jquery-pnotify/pnotify.js.map
Stack Trace:
#0 /***/***/***/webroot/index.php(100): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse

fzf.vimでtagsを検索しながら色付きのpreviewを表示する

PHPでせめて定義元ぐらいは辿りたいんだけど、Language Serverが使えない、[phpcd](https://github.com/lvht/phpcd.vim)も使えない、けれど絶対Vim使うってときに、ctagsを使うことにした。他のプラグインとかで何とかなるかもしれないけど、何とかなるって情報が見つけられなかった。

仕方なくctagsでタグを作って[fzf.vim](https://github.com/junegunn/fzf.vim)でpreviewを表示させながら選びたい。

## どういうことか

こういうファイルがあって、test2()を辿りたい。

“`php:caller.php

Laravel の Policy ってどんな場合に使うの?

`特定のリソースに対するユーザーアクションを認可`する仕組みだそうです。
例えば、ブログの記事削除は本人にしかできないようにすることが可能になる仕組みのことです。

Policyを使わないで書くと以下のようになり、

“`php
public function delete(Article $article)
{
if (request()->article()->isNot($article->user)) {
return response([], 403);
}

$article->delete();
}
“`

`ArticlePolicy`を作成すると、

“`php:ArticlePlicy.php
public function delete(User $user, Article $article)
{
return $user->id == $article->user_id;
}
“`

以下のように書ける。

“`php
public function delete(Article $article)
{

PHPでフォームから投稿したテキスト文を表示する際に行ったこと

DBから情報を抜き出して掲示板に内容を出力しようとしたらこんなエラーが発生しました。
スクリーンショット 2020-04-08 18.45.15.png

なんだこれはと思い調べてみると配列関連のエラーだそうで(正直詳しくわかってない)
PHPのために購入したテキスト通りに進めているはずなのにエラーばっかり出るから不親切なテキストですね。

##どうやって解決したのか
そもそもの書き方の問題でした
エラーが起きていた時のコードをうっかりスクショしておくの忘れてしまっていました。申し訳ございません。

“`
//$postにDBに格納されている情報を格納
$post = $db->query(‘SELECT * FROM users JOIN posts ON posts.user_id = users.id’);

本当に初心者向けPHPの環境構築

本当に初心者向けのPHPの環境構築を解説していきたいと思います。

– 1, macOSならMAMPを、WindowsならXAMPPを入れる。
– 2, 起動してApacheをStartする。

以上です。

PHPとかを手動に入れてもいいですが、めんどくさくないですか?
つまづきませんか?それだったら一回、上のようなソフトで環境構築しちゃったほうが良いと思います。

【PHP】スクラッチでTwitterクローンを11日間で作成してみた

#このアプリについて
デモは以下をご覧ください。
[コードへのリンク](https://github.com/otake619/twitter_clone_app)
![でもんすとれーしょん.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427892/90851a98-7e24-30d7-55d2-0e67def3bb3e.gif)

#このアプリの機能について
・ログイン/ログアウト
・文章投稿
・投稿削除
・投稿編集
・通知機能(フォローされたアカウント名表示、リプライしたアカウント名表示)
・フォロー/フォロワー表示
・フォロー/フォロー解除

#データベースの仕組み

データベース名【twitter_clone】

テーブル名一覧
・tweets
・users
・followers
・reply
・notice

カラム名一覧【usersテーブル】
・id : 主キー
・name :アカウント名
・email :アカウントのメールアドレス
・password : アカウントのパスワード
・cre

CakePHPでSelect2を階層型のセレクトボックスで実現する方法【階層型】

## データベースの構成

■テーブル構成(placesテーブル)

|カラム|型|
| —- | —- |
|id|INT|
|parent_id|INT|
|name|VARCHAR|

■テーブルの中身

|id|parent_id|name|
| —- | —- | —- |
|1|NULL|関東|
|2|1|東京都|
|3|1|埼玉県|
|4|1|栃木県|
|5|NULL|関西|
|6|5|大阪府|
|7|5|京都府|
|8|5|兵庫県|

「parent_idがnullが親」、[parent_idがnullでないものが子」です。

– 関東
– 東京都
– 埼玉県
– 栃木県
– 関西
– 大阪府
– 京都府
– 兵庫県

## コントローラでplacesテーブルから欲しい形で取得

下記のような形で$optinosに配列を定義したいです。

“`php:PostsController.php

$optinos = [
‘関東’ => [
2 => ‘東京都’,

LambdaのオーソライザーでBASIC認証を追加する【言語不問】

[前回作成したサーバーレスLaravel](https://qiita.com/umihico/items/64fcf159f68ebd866170)ですが、BASIC認証を付与しようとしたら躓きました。
**API Gatewayを経由すると、`WWW-Authenticate`ヘッダーがx-amazn-remapped-www-authenticateに置き換えらます。その結果BASIC認証を求めるポップを表示できず無条件で`401 Unauthorized`エラーだけを表示するWEBになります。**

つまり問題はLambdaではなく、API Gatewayです。ALBでURLを設定すればこの問題はありません。ALB経由のLambdaを使ったサーバーレスLaravelのBASIC認証は通常のLaravelと同じです。[53eda06](https://github.com/umihico/laravel-demo/commit/53eda06)

API Gateway経由でもBASIC認証を導入するには以下のように変更します。

+ 別途新規のLambda関数を作成し、API

XSS SQLインジェクション

# 忘れがちなこと

– 出力側の対策と同じように入力側の対策も重要。
– 出力側の対策だけをしていると、サニタイズはできていても意図しない値が出力されてしまうことがある。
– 入力側の対策もしておけばフィルタリングに引っかかったら値を出力しない、ということもできる。

# Reflected XSS All Clients

– 入力側対策
– 取得した値に対して無害化、値チェック、値のホワイトリスト管理をする
– 以下のコードは**GETパラメータに「<」「>」が含まれなかったら**出力するという意味

“`php
if(preg_match(“/^[^\<\>]+$/”, $_GET[“keyword”])){
echo $_GET[“keyword”];
“`

– 出力側対策
– 出力時にサニタイズをする
– PHPはhtmlspecialchars
– JSはhtmlencoder.htmlEncode
– 出力時にサニタイズする意味
– 意図せぬところでデコードされる可能性がある

PHPで時刻(00:00:00)を秒に変換する方法

##はじめに

仕事柄、頻繁に時刻であったり記録(●●分●●秒など)を扱う機会が多いです。

PHPで時間(時刻)を計算するには、UNIXタイムスタンプの値を操作することで求めることができますが、「時刻じゃなくて記録(36時間24分56秒などもあり)なんだよな~」、「一度秒にしてから四則計算してこんなことをしたいんだよな~」と思うことが多々ありました。

大したことは全くしていませんが、誰かの参考になれば幸いです。

##時間(00:00:00)から秒へ変換
“`php:php
// 時間から秒へ変換(00:00:00→00000秒)
function hour_to_sec($str) {
$t = explode(“:”, $str);//配列($t[0](時間)、$t[1](分)、$t[2](秒))にする
$h = $t[0];
if (isset($t[1])) {//分の部分に値が入っているか確認
$m = $t[1];
}else{
$m = “0”;
}
if (isset($t[2])) {//

新人君向けの課題(うるう年判定プログラム)

フレッシャーズの皆さん、教育担当の皆さんジャンボ!!!!

有望な新人君がシステム開発部に入ってきたのでPHPの課題を出してみました。

Linux上でbash出来る、PHPを少しだけできるとのことだったので少し難しい課題にしてみました。

## 課題

“`php
/**************************************************
* 課題1: うるう年判定
*
* ・起動引数で入力した年がうるう年か平年か判定し結果を出力する
* ・起動引数が西暦でない場合は、エラー内容を出力する
* ・try-catch、throw Exceptionを使用する
**************************************************/
“`

## 模範解答(になってる?)

“`php

wordpress タクソノミー とカスタムフィールドのちょっと便利な話

__記事を書いた時の各バージョンです。__
wordprss 5.3.2
acf pro 5.8.9

# こんなシーン
wordpressカスタム投稿と一緒に、カスタムタクソノミーを設定する際に、それぞれのタームに連動したカスタムフィールドが欲しい・・・。

__例えば__
・タームごとにアイコンを出力したい。
・タームごとに独自の(slugとは別の)クラスを付与したい。
・日本語名に対する、他言語翻訳を同時に設定したい。

やりようはいくらでもあるかと思いますが、タームに連動したカスタムフィールドを追加することでよりスマートに実現できます。
しかし、値の取得は通常のカスタムフィールドとは手順が異なります。

# タクソノミー実装
ひとまずこんなかんじでしょうか。

“`php:tax.php
add_action(‘init’, ‘register_cf’);
function register_cf()
{
register_post_type(
news,
array(
‘labels’ => array(
‘name’ =>

?【CakePHP2】存在する値を消さずにカラム名変更のみをするマイグレーション

## 環境
PHP 7.2.21
CakePHP 2.10.18
MySQL 5.7.27

## やりたいこと

カラム名変更マイグレが見つからなかったのでメモ

## やったこと

❌Migrations.migration generateの自動生成だとこれができたが
これだとカラム削除&追加を行うマイグレなので存在する値が消去されてしまう

“`app/Config/migration/xxxxxxxxx_RenameColumnHogeToFuga.php
/**
* Actions to be performed
*
* @var array $migration
*/
public $migration = array(
‘up’ => array(
‘create_field’ => array(
‘test_table’ => array(
‘fuga’ => array(‘type’ => ‘integer’, ‘null’ => false, ‘default’ => null, ‘unsigned’ => false, ‘

LaravelでZipファイルに圧縮する実装をしてみた(Laravel6.0以降の対応)

やりたいこと

結論からいうと、Laravelのstorage/logsディレクトリ配下の**logファイルをzip形式に圧縮するよ**って話です。

業務で関わっているサービスでstorage/logsディレクトリ以下をS3に保存する処理があるのですが、如何せんlogファイルのサイズが大きくS3のボリュームがすぐにいっぱいになってしまいます。

そこで、s3に保存するファイルをzip形式に圧縮しようとなり、その時に実装を備忘録として残します。

*今回、あくまでzipファイルを作成するまでの処理で、s3に保存する処理は省略しています。

zipファイル作成にはZipArchiveを使えば楽

かつてはchumper/zipperをcomposerでインストールすれば簡単にzipファイルを作成できたらしいのですが、どうやらLaravel6.0以降ではchumper/zipperが使用できなくっていました。

ですので、Laravel6.0以降では**ZipArchive**を使いましょう!

以下のように書きました。
(開発の終わりでリファクタリングする

Laravel MySQL SQLSTATE[HY000] [1049] Unknown database が出た時に確認すること

# 目的

– 自分がよくやらかすミスなので確認する内容をまとめる

# 実施環境

# エラー内容

– Laravelアプリのマイグレート時やアプリからのDBアクセス時にターミナルやブラウザ情に下記エラーが表示される。
-「SQLSTATE[HY000] [1049] Unknown database ‘データベース名’」

# 解決方法その1 MySQLの再起動

1. 下記コマンドを実行してMySQLの再起動を実施する。

“`terminal
$ mysql.serve restart
“`

# 解決方法その2 データベース名の記載の確認

1. 下記コマンドを実行してMySQLのターミナルを開く。(MySQLのrootユーザのパスワードがわからなくなってしまった方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

“`terminal
$ mysql -u root -p

僕(フロントエンジニア)のQiita投稿内容

初めまして。渡辺大地です。

現在(2020/04/08)大学生ながらフロントエンジニア兼営業のフリーランスとして活躍しています。

画像の拡大の仕方忘れた→調べよう

エンジニアの方なら、分からないことを調べる。当たり前の日常ですよね!?
僕も毎日これの繰り返しです。
しかし僕の場合同じことを何回でも調べてしまうのです。

非常に時間がもったいない。そう感じたので自分なりの教科書を作ろうと思いこのアカウントを作りました。

いずれは皆さまも分からないことが出てきたらグーグルではなく僕の投稿から調べたくなる。そんな投稿をしていきますので今後ともよろしくお願いします。

[コピペでOK] PHPでログを出力する

# はじめに

PHPでログを出力するLoggerを作成しました。
PHPでは、標準のエラーログや便利なライブラリがありますが、
ここでは、ライブラリを使用しません。
コピペですぐに使えるものを目指しています。

機能としては下記の通りです。

– ログメッセージを出力する
– ログレベルの指定
– ログローテート
– 出力先の指定

## ErrorLog

PHPには、「ErrorLog」という実行時エラーをメッセージに出力する機能があります。
これは、try-catchで補足できないエラーもあります。
今回の作成したLoggerクラスでは対象外です。

詳細は下記の通りです。

[PHPでのログ出力 まとめ](https://qiita.com/iwason/items/8dc9f62b4118186cf2df)

## Monolog

PHPには、「Monolog」というログ出力のライブラリがあります。
Laravelなどの有名なPHPフレームワークで採用されています。
今回の作成したLoggerクラスでは対象外です。

詳細は下記の通りです。

[コード改善に役立ちそうなP

PHP/json文字列をデコードする

json_decode関数を使う。

“`
$object = json_decode($json_string);
// 第二引数をtrueにすると連想配列になる。
$array = json_decode($json_string, true);
“`

例:

“`
$request = file_get_contents(“https://www.googleapis.com/books/v1/volumes?q=search+%E6%8A%80%E8%A1%93&maxResults=40”);
$json = json_decode($request, true);

var_dump($json[‘kind’]); // string(13) “books#volumes”
“`