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

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

Laravel ローカルにアップロードした画像をzip化してダウンロードする

# 目次

– Macのローカルで作成したLaravelアプリで画像ファイルアップロードしたものを、zip化してダウンロードするボタンを設置する方法をまとめる

# 実施環境

– ハードウェア環境

| 項目 | 情報 |
| — | — |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

– ソフトウェア環境

| 項目 | 情報 | 備考 |
| — | — | — |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd5

元記事を表示

DockerとDocker-composeでlaravel/mysql/nginxの環境を作る

## Dockerとは
Dockerの有用性が強調されるようになって久しく昨今はDockerもかなり浸透してきたと思います。いやDockerって何に使うのかよくワカランという人もいると思いますがDockerはLaravelなどのウェブアプリを動かすための仮想環境を作るものです。え?それだったらVagrantでよくね?という人もいるかもしれませんがDockerのすごいところは仮想環境をそのまま本番サーバーにデプロイできちゃうところです。Vagrantは開発者のローカルな環境に本番サーバーと似た仮想環境を作るものですがDockerは開発でも使えて本番にもデプロイできる仮想環境を作るものです。

じゃあ試しにlaravel/nginx/mysqlをDockerとDocker-composeで作ってみましょう。なおDocker-comppseは複数のDockerイメージの作成と管理をするいわゆるオーケストレーションのためのツールです。

## Dockerのインストール
まずDockerのインストールをします。
1. Windowsユーザーは[Docker for Windows](https

元記事を表示

emptyとissetの違い

###php言語をおけるemptyとissetの違いについて

emptyは空かどうかを判定し、空ならtrueを返す。

逆にissetは入っているかを判定し、入っていればtrueを返す。

だから、下記のような認識をしていた。

“`sample.php
empty === !isset
“`
しかし、これは間違っています。

それは、0の判定の場合です。

emptyは「0」は「空」と判定します。

一方issetは「0」は「入っている」と判定します。

また、issetは空の配列も「入っている」と判定します。

ここの部分がemptyとissetの違いです。

ですから、その時の状況によってemptyとissetを使い分けるようにしましょう。

元記事を表示

[php]cookieの説明 +ページ遷移で消えてしまう際の対応

# 経緯
setcookieで保存したクッキーがページ遷移した際に消えてしまう現象が起きました。
その対処法をここに記載致します。

# 結論
このような記述を書いていました。

“`php
setcookie(cookie名, cookie保存内容);
“`

上の記述を以下のように記述する。

“`php
setcookie(cookie名, cookie保存内容, (time()+1800), “/”);
“`

# クッキーとは
HTTPにおける情報を管理する通信プロトコルやウェブブラウザに一時的に保存できる情報のことを指します。
HTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指します。
ユーザ識別やセッション管理を実現する目的などに利用されます。
Cookieを残しておくと第三者に不正使用される可能性があるため、個人情報は載せてはいけないです。

# setcookieの説明
クッキーを保存できます。

“`php

例)
setcookie(‘cookie_name’, ‘

元記事を表示

PHPでHTTPデータのダブルクォーテーションが勝手にエスケープされる

# 事象
GETやPOSTで送信されるデータにダブルクォーテーションが含まれている場合、勝手にエスケープされてされてしまい少しハマりました。

“`
\”保登心愛\”香風智乃\”
“`

# 原因

原因はphp.iniの`magic_quotes_gpc`が有効の為でした。

> GPC(Get/Post/Cookie) 処理に関する magic_quotes の設定を行います。 magic_quotes が on の場合、'(シングルクオート)、” (ダブルクオート)、\(バックスラッシュ) 、NULL には全て自動的に バックスラッシュでエスケープ処理が行われます。magic_quotes_sybase も on の場合、シングルクオートは、バックスラッシュではなく シングルクオートでエスケープされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/ec27572c-471a-2871-88fc-1ca5e66c59d3.png)

ちなみに`magic_quo

元記事を表示

8進数も基数表示を明記したい

PHPの数値リテラルは、いくつかの基数をサポートしています。

“`php:全部16
$a = 16; // 10進数
$a = 0x10; // 16進数
$a = 0b00010000; // 2進数
$a = 020; // 8進数
“`

8進数だけおかしくない?
ということで[Explicit octal integer literal notation](https://wiki.php.net/rfc/explicit_octal_notation)というRFCが提出されました。

# Explicit octal integer literal notation

## Introduction

PHPの8進数リテラル表記は、`”016″ == 016`がfalseになるなどよくわからない結果になることがあります。
これは`016`が8進数であり、10進数でいう`14`になるからです。

この表記は、Java、C、C#、Golang、Haskellその他諸々の言語と同じ規則であり、たしかに確立された文法ではあります。
一方

元記事を表示

TLSv1.2未満でのアクセスを制御するときのメモ

# 概要

いろいろあって低いSSLバージョンでのアクセスは弾くことになりました。
まぁまぁ今更感がありますが、やっといた方が良いような気はしますよね。
Apacheの設定でチョチョイのチョイなんですが、案外丁寧にやってる記事が少なかったのでメモ。

## 普通のやり方

TLSバージョンを見て、アクセスを弾く。まずはこれで行こうと考えますよね。

“` httpd.conf
SSLProtocol +TLSv1.2
“`

しかし実際この対応をしてサーバーにアクセスすると下の画像のように表示され、じゃあどうすればええねんということがわかりにくい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350773/da711c1e-ba23-9e73-35fe-7ba263ae23e1.png)
今どきTLS1.2対応していないブラウザでアクセスしようとする人なんてほぼいないだろうし別に良い気もしますが、もし古代のアーティファクトを使い続けている方々がこの画面を見たときどうすれば良いかは絶

元記事を表示

Laravel8のルーティング

### はじめに
laravelの8でこれまでのバージョンとルーティングの書き方が変わったようなので、変更点を記載する。

### 前提
PostControllerのindexアクションを呼びたい時

“`PostController.php

元記事を表示

LINEBOTで湯婆婆を実装してみる

# はじめに
**原作者(元ネタ)様の記事:**[Javaで湯婆婆を実装してみる – Qiita](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)

何番煎じか分かりませんが、
執筆時点(2020/11/09)で**LINEBOT**で実装して記事にされている方がいなかったので、実装してみました。

# コード
**PHP7**で実装しました。
**(コピペして試される方はアクセストークンが記述されたtoken.txtファイルを読み込んでいる点にご注意ください。)

“`php5
‘text’,
‘text’ => “フン。”.$name.”というのかい。\n贅沢な名だねぇ。”
];

// 湯婆婆が名前を1文字ずつ認識できる様にする
$name_arr = preg_split(“/\B/u”, $name)

元記事を表示

【Laravel】パッケージ開発の第一歩 〜helloページを出力する〜

Laravelのパッケージ開発に必要な手順をまとめました。
なお、この記事ではローカルでの動作確認のみとしてpackagistへの登録等は行いません。

# 動作環境
– Laravel 8.12
– PHP 7.4.1
– Composer 2.0.4

どちらもローカルで動作させます

# ざっくりとした仕様
ブラウザで`http://localhost:8000/hello`にアクセスすると「Hello from SayHello Package!」と表示できるようになるパッケージの開発

# 大まかな流れ
– 必要なディレクトリを作成する
– composer.jsonを作成する
– パッケージ開発をする
– パッケージを利用したい側のcomposer.jsonにrepositoriesをキーに使用したいパッケージへのパスを記述する
– composer require [vendor]/[package_name]でパッケージをインストールする

# ディレクトリ構成
[laravelpackage.com](https://laravelpackage.com/02-dev

元記事を表示

エンジニア転職から1ヶ月経っての感想

##自己紹介
 こんにちは、福岡在住の駆け出しエンジニア 田代大輔です。
10月より受託開発企業にてWebエンジニアとして従事しています。
ほんとに良い人ばかり働いています。周りの方々に恵まれて感謝〜

##転職の経緯
 僕はオンライン型プログラミングスクールに4月より通い始め、
転職活動を始めたのは6月中旬からでした。
そう、コロナ禍真っ只中・・・
 福岡も例外なく緊急事態宣言の影響で下火になってました。

 そんなこんなで、(詳しく書くと一記事になりそうなので別の機会に。。。)
当時の仕事を9月末で退職し、10月より今の会社で働き始めました。

##エンジニアになって1ヶ月経って感じた素直な感想
 正直、まだ役に立っておらず即戦力には程遠いと感じます。
現在は、ECサイトの構築をEC-cubeという技術を基に行なっています。
あれも学ばないと、、、これも学ばないと、、、
あーーー、時間が足りない、、、、と感じることが沢山ありますが
時間は作るもの!!と自分に言い聞かせながら頑張っている次第であります。

##実際に実務で必要なスキルセット
 もちろん、実際に開発するためのプロ

元記事を表示

Laravel ローカルにアップロードした画像をダウンロードする

# 目次

– Macのローカルで作成したLaravelアプリで画像ファイルアップロードしたものを、ダウンロードするボタンを設置する方法をまとめる

# 実施環境

– ハードウェア環境

| 項目 | 情報 |
| — | — |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

– ソフトウェア環境

| 項目 | 情報 | 備考 |
| — | — | — |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aa

元記事を表示

配列とオブジェクトの違いについて

##結論
`配列`と`オブジェクト`では、簡単に言うと`書き方`と`呼び出し方`が違います。

## 配列 ( 連想配列 )
`配列` = `keyとvalueがセット`。
`[ ]`で`配列を宣言`し、`key`と`value`を`=>(ダブルアロー演算子)`で結ぶ。
呼び出しは、`$array[‘key’];`を`echo`で表示させる。

“`
$array = [ //配列$arrayを宣言
“name” => “ワタナベ”, //name(key)にワタナベ(value)を代入
“number” => 1,
];

↓ 呼び出し

echo $array[‘name’]; //ワタナベが表示される。

“`

##オブジェクト
`オブジェクト` = `クラスの中にプロパティを宣言`。
`{}`で`クラスの宣言`をし、`new演算子`で`インスタンス化`をして値を持たせる。
`new演算子` = `インスタンスを作成する演算子`。
`インスタンス化` = `オブジェクトを作ること`。
呼び出しは、`->(シングルアロー演算子)`で`プロパティを指定`。

`

元記事を表示

【Lumen】.envをconfig()で読み込む

# はじめに

Laravelでは、`.env`から環境変数を読み込む際、`env()`が使われます。

ただし、この`env()`で直接`.env`にアクセスするのは好ましくありません。

理由としては、Laravelは設定ファイルのキャッシュが存在する場合、
`.env`を読み込まずにキャッシュを参照する仕様になっているためです。

ではどうすればいいのかというと、タイトルにある通り、`config()`を使用します。

本記事では、この`config()`での`.env`読み込みについて、
Lumenで実装する方法についてまとめます。

※Laravelでの具体的な実装例や`env()`を使ってはいけない理由などをブログに詳しくまとめられている方がいらっしゃいます。
本記事では詳細には触れないので、気になる方はこちらをご覧ください。
[Laravel の .env の値は config() 経由で使う](https://hiroto-k.hatenablog.com/entry/2018/03/28/213000)

# Lumenでconfig()を使う

– `config`

元記事を表示

Warning: Invalid argument supplied for foreach()の対処法

##エラー内容
`Invalid argument supplied for foreach()` = PHPの`foreach文`で`配列データ`を取り出そうとした場合に、配列の`データが入っていない時`に出るエラー。

`foreach文`=`配列の要素がある分だけ繰り返し処理`をするループ文。

##解決方法
まずは、`配列データが入っているかを判定`する必要があります。
`foreach文`で使えるのは`配列`と`オブジェクト`のみなので、`(arry)`を使用して`変数を強制的に配列に`してあげることで対処できます。

配列とオブジェクトについては別の記事に投稿します。

“`
foreach($stmt as $row){
//処理内容
}

foreach((array)$stmt as $row){
//処理内容
}

“`

参考元はこちら
(https://memocarilog.info/wordpress/5132)
(https://qiita.com/takuma-jpn/items/678876ad12b9ae9998ac)

元記事を表示

DataTables+生PHP+MySQL のサイト構築例

本社オンプレ経由で情報を支社からも参照できる簡易ポータルを、生のPHPで書いてみた。
`

`タグでリスト表示しているページがあるなら、[DataTables](https://qiita.com/tags/datatables)にちょっと書き替えるだけで、それっぽいWebアプリケーションにリニューアルできるという一例。

# 環境

|種類 |内容 |
|:————————–|:————|
|オペレーティングシステム |Ubuntu 18.04 |
|Webサーバ |Apache 2.4 |
|リレーショナルデータベース |MySQL 5.7 |
|プログラミング言語 |PHP 7.2 |
|フロントエンドフレームワーク |DataTables, Bootstrap4, jQuery, FontAwesome |
|Web Appsフレームワーク |なし |

## システ

composer のバージョンをアップデートする

## アップデートコマンド

最新バージョンにアップデート (今だとバージョン 2.x へ)

“`
composer self-update
“`

バージョンを指定してアップデート (1.10.17 を指定する場合)

“`
composer self-update 1.10.17
“`

[Command-line interface / Commands – Composer](https://getcomposer.org/doc/03-cli.md#self-update-selfupdate-)

## エラーが発生する場合

下記のようなエラーが発生する場合

“`
SHA384 is not supported by your openssl extension, could not verify the phar file integrity
“`

composer のバージョンが古すぎるため、コマンドで更新できません。再インストールが必要です。

[公式ドキュメント](https://getcomposer.org/doc/00-intro.md#

kubernetes上にLaravel環境を構築した際のメモ

[前回記事](https://qiita.com/furuTra/items/7002f4d2c3f8a833d842)の続きとなる。

kubernetes上に作成したLNMP環境に対してLaravelプロジェクトをデプロイした際のメモ。

# Laravelプロジェクトの構築

今回、構築作業にヒューマンオペレーションが入り込むのを極力避けることを目的とし、Laravelプロジェクト作成をコンテナログインからのコマンド実行以外で実施することとした。

## Laravelプロジェクトの初期化

Pod作成時に`command`から実施してしまうと、Pod起動の度にプロジェクトの作成がされてしまう。

ということで、Laravelプロジェクトの初期化限定で、[Jobオブジェクト](https://kubernetes.io/ja/docs/concepts/workloads/controllers/job/)を利用することにした。

### Jobの作成

`Job`は、コンテナを利用し処理を実行するリソースである。

Jobにて作成されたコンテナは、マニフェストファイルに記載され

LaravelとjQueryで非同期処理で実装するいいね機能を世界一わかりやすく解説してみたい

#やりたいこと
ジャズライブの口コミを投稿できるサイトをチームで制作しています。
今回は、ユーザーの投稿にいいねをできる機能を実装したいです。結構苦労したので、初心者だけど、いや初心者だからこそ日本一わかりやすくメモを残しておきたいと思います。ご指摘などありましたら、ぜひ容赦無くよろしくお願いします。

Laravel 7です。

###仕様
1. ハートボタンとカウンターで構成する
* 各投稿が合計いくつのいいねを集めているかが表示される
* 下記行動ができるのはログインしているユーザーのみ
* いいねボタンが押されたらスタイルをピンクにし、いいねカウントの数字を1増やす
* もう一度押されたらスタイルと数字を元に戻す
* あるユーザーが1つの投稿に対していいねが押せるのは1回のみ
* 自分がいいねした投稿は常にピンクになっている

###実装前のプログラムの挙動に関する疑問…
* どの時点でサーバー側にリクエストを出せばいい?(非同期処理だとしたら、イベントが発生した直後?)
* 非同期処理だとしたら、何回も押されたらその都度リクエストを出してサーバーと通信するのか??
* 誰

laravel migration失敗した話 

migrationに失敗してエラーが出たので、解決策を共有します。

やりたかったことは、usersテーブルの追加です。
なので、下記コマンドを実行しました。

php artisan make:migration create_users_table
//users table 作成

エラー内容

どうやら、未定義の定数だそうです。

 ErrorException 
  Use of undefined constant JSON_INVALID_UTF8_SUBSTITUTE - assumed 'JSON_INVALID_UTF8_SUBSTITUTE'

ネットで検索してみると、PHPのバージョンに関する問題でした。
PHP7.2以降じゃないと出るエラーだとか
バージョンを確認するとPHP7.1でした。

そもそも、dockerコンテナ外でmigrationしてました。
ってことで、dockerコンテナの中へ

PHPのバージョンは7.4でした

そして、
migrati