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

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

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

Laravelでmigrationファイル作る時、複数形にしていいの?だめなの?

Laravelでmigrationファイルを作るとき、デフォルトの設定では「スネークケースで複数形で書くと、キャメルケースで単数形に変換される」ってなってる。
例えば
・create_users_table.phpという名前でmigrationファイル作成→usersというテーブル作成、modelはUsers.phpで作成する。
・create_user_books_table.phpという名前でmigrationファイル作成→user_booksというテーブルを作成、modelはuserBooks.phpで作成する。

じゃあ、「data」ってテーブル作りたいとき、どうなるの?dataって、複数形ないよね?「information」は?「news」なんて、元々複数形だけど?

もちろん$tableとかを使って自力で明示的に名前つければ悩むことはないんだけど、せっかくだったら自動的に解釈してほしいじゃないさ。

そんな時、「この単語って複数形で設定するの?」というのを確認する方法がありました。ありがとうございます[Laravel の 複数形を事前に調べる](Laravel の 複数形を

DockerでLaravel開発環境構築(Mac)

#■構成
docker-laravel
├ docker-compose.yml
├ docker
│  ├ php
│  │  ├ php.ini
│  │  └ Dockerfile
│  └ nginx
│    └ default.conf
└ server

#■手順
##1.Dockerのデスクトップアプリをダウンロード
公式サイトより手順に従いダウンロード(簡単です)
https://www.docker.com/products/docker-desktop

##2.Docker.appを起動

“`ruby:terminal
open /Applications/Docker.app
“`
##3.ディレクトリ作成
docker-laravelという作業用フォルダ(名称は任意)をデスクトップに用意し、
その中に上記構成でフォルダ、ファイルを配置します。
※面倒であれば以下より、git cloneを。
https://github.com/masayan1126/docker-laravel

##4.主要ファイル
詳細は割愛します(githubを参照ください。)

laravel-enum:v2の日本語化

laravel-enumのv2の日本語化の書き方が他の記事と違ったので備忘録的に書き残す

## 環境

“`shell-session

% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H2

% docker version
Client: Docker Engine – Community
Cloud integration: 1.0.1
Version: 19.03.13
API version: 1.40

# php -v
PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans

# php arti

【PHPの名前空間について】

version5.4以降に使える名前空間についてメモっとく

“`
namespace A;
class A{
public static function xxx(){}
}
namespace B;
class A{
public static function yyy(){}
}
“`
この場合namespaceAのAクラスと、namespaceBのAクラスということになる。
呼び出すときはuseキーワードを使う。

“`
use A\A
“`
この場合、これ以下でAクラスを呼び出したときはnamespaceAのAクラスのことを参照していることになる。

“`
use A\B
“`
こうすることで、namespaceAのBクラスを呼び出していることになる。

別名で呼び出す場合
use A\A as C
こうするとこれ以下で、C::xxx();としたとき、実施にはnamaspaceAのAクラスを参照していることになる。

“`
use A\A as C
C::xxx();
//A::xxx();と同義
“`

【namespaceを使う際はグローバルク

【PHP】timestamp形式の日付時刻をフォーマットして表示したい

# やりたいこと

現在作成中のアプリで記事投稿日の表示フォーマットを変更したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588983/2e30b196-ce62-0e84-2da6-47653d9d03d3.png)

# 投稿一覧画面のソース抜粋

“`php

$value) :?>

array_shift()ってなんやねん!!

#array_shift()ってなんやねん
##説明
array_shift() – 配列の先頭の要素を取り除く
ただそれだけ、

“`
$tehai_predict = [1,2,3,4,5,6,7,8,9,11,12,13];
$lead_element = array_shift($tehai12_predict);
var_dump($tehai_predict);
var_dump($lead_element);
“`

“`
[2,3,4,5,6,7,8,9,11,12,13]
1
“`
が出力される。

#筆者
2020年1月ごろからプログラミング学習し始めました。
日々の学習についてあげています。
麻雀点数計算アプリを作成中!!!

Laravel ローカルに画像をアップロードし表示する

ode# 目次

– 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/cd54077a

prepare関数について

##prepareとは?
`prepare` = `SQL文の基本部分が同じで値だけ異なる`ような場合(例えば同じテーブルに値だけ変えて何回もデータを挿入するような場合)に`効率よく行える機能を提供`。

prepareの他に似たメソッドとしてqueryがあります。
違いは、
`query`:`変動値がない場合に使用`

“`
$pdo->query(‘SELECT * FROM user’);
“`

`prepare`:`変動値がある場合に使用`(prepare、bindValue、executeを使う)

“`
$stmt = $pdo->prepare(“SELECT * FROM user WHERE name=:name”);

$stmt->bindValue(‘:name’, $name, PDO::PARAM_STR);

$stmt->execute();
“`

参考元はこちら
(https://blog.senseshare.jp/query-prepare.html#index1)
(https://www.javadrive.jp/php/pdo/i

Laravel MAMPの設定からmigrateまでの手順 [忘備録]

##環境
・PHP 7.4.9
・Laravel 6.19.1
・MAMP 5.7
##MAMPをインストールし、Webブラウザを立ち上げる
MAMPをインストールし、起動する。
[MAMPインストールページ](https://www.mamp.info/en/mac/)

起動後、「⌘ + ,」を入力し、Preferenceを立ち上げる。
Portsタブを選択し、「Apache Port」と「Nginx Port」を80、「MySQL Port」を3306に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605741/f7a7571b-f6ae-99d0-c0e9-d1af7eb09136.png)
OKを選択し、次はMAMPの「Start Servers」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605741/fcab7bde-ee99-bbbf-5e3

サニタイズ / エスケープについて

##サニタイズとは?
`サニタイズ` = `危険なコードやデータを変換または除去して無力化`する処理。

例えば、Webサイトに設置された入力フォームなどから、悪意のあるコードが入力され、その文字列が実行されることで様々な被害に遭う可能性があります。

`サニタイズ`の一種に`エスケープ`というものがあり、
大抵は`サニタイズ` = `エスケープ`として捉えている事がほとんどです。

##エスケープとは?
`エスケープ` = `特殊な文字を無害な文字に強制的に置き換える`処理。
PHPでは`< > ‘ ” &`などの文字を変数値としてそのまま使用することができますが、これをHTMLにそのまま出力すると、HTMLタグなどの特殊文字として解釈されてしまいます。
なのでエスケープ処理することにより被害防止をすることが出来ます。

例えばHTMLだと、エスケープ処理することで下記のように勝手に特殊文字を変換してくれます。

|表示|エスケープ|
|:—:|:—:|
|>|&lt|
|<|&gt| |"|&quot| |'|&#039| ```

execute関数の使い方

##execute関数とは?
execute関数 = PHPの標準関数で`プリペアドステートメント`を実行する際に使われる関数。
標準関数一覧(https://www.php.net/manual/ja/indexes.functions.php)
`プリペアドステートメント` = SQLを使ってDBへ通信をする際に使われる値を`サニタイズ`する仕組み。
`サニタイズ`について今回は省略しますので別の記事に投稿します。

##execute関数の使い方
`execute関数`を使う前に`PDOオブジェクト`を作成して`DBへの接続`、`プリペアドステートメント`のSQLを`prepare関数`を使って設定しておきます。
設定できた上で`execute関数`を使うことでSQL文を実行可能です。
`prepare関数`についても別の記事に投稿します。

“`
$変数名 = new PDO(データベース接続情報, ユーザーID, パスワード); //DB接続
$stmt = $変数名->prepare(SQL文); //実行準備
$変数名->execute(); //実行
“`