PHP関連のことを調べてみた2021年06月24日

PHP関連のことを調べてみた2021年06月24日
目次

Check that your cafile/capath settings〜なるエラーに騙された話

# 問題

古いシステムをPHP 7.4に上げようとしていました。アクセスするのにクライアント証明書が必要な社内向けAPIがありまして、このアクセスがうまくいきません。

エラーメッセージはこんな感じ:

“`text
warning: file_get_contents(): Unable to set local cert chain file `xxx.pem`:
Check that your cafile/capath settings include details of your certificate
and its issuer in foo.php on line XX
“`

# 調査

このエラーを見た私は、「cafile/capathの設定をチェックしろ? たしかに社内向けプライベート認証局とか使うので変な設定してるしなあ…」と思ってそのあたりをいくらチェックしてもおかしいところは見当たりません。

でもこれ古いシステムではちゃんと使えてるやつだし、と思って[SSLコンテキストオプション](https://www.php.net/manual/ja

元記事を表示

Laravel 8でマルチ認証して一般ログインと管理ログインを分ける方法

 Laravel 8で一般ログインと管理ログインを分けるために、マルチ認証を実装する方法を紹介します。

# ゴール

– 一般ログインと管理ログインを分ける。
– Laravel標準のユーザー認証機能(Auth)を使う。
– コードはなるべく共用にする。
– 一般ログインURIは `/login` とする。
– 管理ログインURIは `/login/admin` とし、管理画面は `/admin` 以下とする。
– リセットパスワードができるようにする。

# 前提

– PHP 8の知識がある
– Laravel 8の知識がある、認証機能のあるアプリが作れる
– Laravel 8に必要な環境構築ができる
– Composerが使える状態にある
– [Laravel Installer](https://laravel.com/docs/8.x/installation)が使える状態にある

 Laravelで認証機能のあるアプリを作る知識と環境がある前提でスタートします。今回は一般ユーザー(user)と管理ユーザー(admin)の2種類の認証ができるようにします。3種類以上でも全

元記事を表示

PHP Discord OAuth2認証

# PHP Discord OAuth2認証
PHP Laravel環境でDiscord OAuth2認証を行ったので備忘録
## 環境
・Larave 5.7
・PHP 7.2.15
## 前提
・Discord Developerで「OAUTH2_CLIENT_ID」「OAUTH2_CLIENT_SECRET」を取得
・Discord DeveloperでCallback URLの設定

### ログイン時
“`
public function login(Request $request)
{
define(‘OAUTH2_CLIENT_ID’, ‘‘);
define(‘OAUTH2_CLIENT_SECRET’, ‘‘);

$authorizeURL = ‘https://discord.com/api/oauth2/authorize’;
$tokenURL = ‘http

元記事を表示

【AIZU ONLINE JUDGE】Webエンジニアがアルゴリズムの問題を解いてみる

## 目次
* 自己紹介
* AIZU ONLINE JUDGEとは
* やろうと思った経緯
* 問題例
* 所感

## 自己紹介
* 新卒3ヶ月目Webエンジニア(バックエンド)
* バックエンド未経験で自社開発系企業に入社
* 大学では情報工学を専攻.フロントエンドも少し触る
* 現在は社内の案件に触れて実務を行っている

## AIZU ONLINE JUDGEとは?
AOJとよばれるもので、だれでもプログラミングの問題が解けるサイトです。
問題の内容はプログラミングコンテストのようなところで出される、お題に沿ってプログラムをつくって提出→採点をしてくれるサイトです。同じようなサイトに競技プログラミングのAtCoder( https://atcoder.jp/?lang=ja )なんてものもあったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288580/99c7c48e-6361-f841-3ded-dbab2da2845c.png)

https://onli

元記事を表示

phpフォームのページ遷移で$_SESSIONが消えないように気を付けたこと

##はじめに
php(今回フレームワークは使用していない)でフォームを作成したときに、CSRF対策(セキュリティ対策)でセッションを使用した。フォームは「ユーザ入力ページ」「入力内容確認ページ」「送信完了ページの3つ」。フォームの送信が入るたびにページ遷移が入るようにしたが、ページ遷移と同時に設定したセッションの値が切れてしまったので、対策したことを備忘録として残します。

作成したトークンと、そのトークンをセッション変数に代入してページ遷移後に同じ値であれば、ページを表示するというよくあるやり方。

##結論
セッションに設定した変数は

元記事を表示

Laravel / Guzzle (HTTP Client) で画像ファイルを送信したい

Laravel + Guzzle を使用し、テキストや画像を混在させた状態のデータをHTTP Client経由で送りたいときの備忘録です。検証はしてませんがPDFやテキストファイルなど、その他のファイル形式でもいけるはずです。
APIでの画像アップロード(ファイルアップロード)のお供にどうぞ。

### 検証環境
– Laravel 6.20.12
– Guzzle 7.2
– PHP 7.4

## 前提条件: base64 と multipart/form-data

ファイルの送信にはよく “`base64“` へのエンコードが用いられますが、Guzzleで画像やその他ファイルをエンコードせずに送るためには “`multipart/form-data“` という形式で送る必要があるようです。

“`base64“` はざっくり言えば、64進数を意味しており、データを64種類の文字 (アルファベット[ a – z ], [ A – Z ], 数字[ 0 – 9 ]、一部の記号[ +, / ] )で表すエンコード方式です。

[Base64 出典: フリー百科事

元記事を表示

Laravelスケジュールの実行ログを出力する

## 概要
Laravelでスケジュール機能を使って定期実行する際、実行ログを出力したいといったことがあったので調べたことをメモしておく。

## ファイル構成
こんな感じでdockerのcron環境を整備する。
※ ソースコード: [Github-reflet/laravel5.6](https://github.com/reflet/laravel5.6)

“`
├ docker // ← docker関連のフォルダ
│ └ cron
│ ├ cron.root
│ ├ Dockerfile // ← cron実行するコンテナ (PHP-CLI)
│ └ php.ini

├ src // ← Laravel関連のフォルダ
│ ├ app
│ │ ├ Console
│ │ │ ├ Commands
│ │ │ │ ├ EmailSendCommand.php // ← メールをテスト送信するコマンド
│ │ │

元記事を表示

「やればできる!」と言われたときだけ「ビビビビビタミン!MATCH」と返すmatch式

# はじめに
こんにちは。先日兄から自動化処理の仕事を受注しました、筆者です :bow:

さて、今回は初のネタ記事です:smile:

でも一応PHP8に触れているので興味持っていただければそれだけでうれしいです:bow:

# MATCHという飲み物を知っていますか?
↓これ

https://www.matchnews.com/

自分は高校生の頃に飲んでいた記憶です。

食堂(購買)横に設置している自販機に夏になる現れる人気(主観)な飲み物です!

私だけですかね、なんか**青春**って感じがします :relaxed:

最近はお笑い芸人の**ティモンディ**の2人がCMをやっていますね!

# match式を知っていますか?
これ↓

https://www.php.net/manual/en/control-structures.match.php

PHP8で追加された、関数ではなく、**式**です!

(コマンドで関数のリファレンス参照しようとして気づきました、、あ、関数じゃないわ、これ :sweat_smile: )

“`sh
$ php -v
PHP 8.0.3

元記事を表示

laravel 任意のフィールドの値が指定したものと一致していない時に除外するバリデーションルールを記載する方法

# 目的

– laravelで任意のフィールドの値が指定したものと一致していない時に当該フィールドのバリデートをスキップする方法をまとめる

# 方法

– フィールド`check`の値に「true」という文字列以外が格納されたとき以外に、フィールド`input_str`の値のバリデーションをスキップしたい時は下記のように記載する。
– `input_str`の値のバリデーションルールは「必須」と「文字列であること」とする。
– 下記はリクエストファイルの`rules()`メソッドの内容のみ抜粋して記載する。

“`HogeRequest.php
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘check’ => ‘required’,
‘input_str’ => ‘

元記事を表示

PHP8以降の比較とmatch文について

便利だけど使う前に挙動をしっかり理解しておきたいので。
予習メモです。

# 環境構築
PHP8の環境を用意します。
開発環境を汚したくない場合は[Docker](https://docs.docker.com/get-docker/)がおすすめです。

簡単なスクリプトならDockerfileを作成する必要もありません。
rmオプションを使用することにより、スクリプト実行後にコンテナが削除されます。

“`bash
$ mkdir php8_test
$ cd php8_test
$ vi mytest.php
$ docker run -it –rm –name my-running-script -v “$PWD”:/usr/src/php8_test -w /usr/src/php8_test php:8.0-cli php mytest.php
“`

[公式ドキュメント](https://github.com/docker-library/docs/tree/master/php)にも紹介されています。

# 数値と文字列の比較
数値と文字列の比較について、“文

元記事を表示

ララベルで久々にプロジェクトをクローンしたのでつまづきポインの備忘録(forMac)

自分のプロジェクトをクローンしてデータベースのモックアップ(テスト環境)をローカルに作成しようと思ったのですが、前にプロジェクトをクローンした時と同じ轍を踏んでいる気がしたのでいい加減覚えようと戒めの意味も込めて備忘録を作成します。

#1.プロジェクトのクローン

これは簡単ですねサクッとローカルにクローンします。

“`vim

simple_db_mockup % git clone https://github.com/mar-gitacount/simple.git

“`

うまくいったぽいです。

“`vim
Cloning into ‘simple’…
remote: Enumerating objects: 554, done.
remote: Counting objects: 100% (554/554), done.
remote: Compressing objects: 100% (307/307), done.
remote: Total 554 (delta 304), reused 463 (delta 213), pack-reused

元記事を表示

【Php】フォームからDBへデータ保存(2)

# 初めに
phpでフォームの入力内容をDBに保存する方法について学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

前回の記事:
https://qiita.com/redrabbit1104/items/a6e57aa1fd1771ef90ff
https://qiita.com/redrabbit1104/items/a3eaf2bba51fac0b3c51
https://qiita.com/redrabbit1104/items/6e9c85c7503ed9043f38
https://qiita.com/redrabbit1104/items/c9b7bb7a89922521c003
https://qiita.com/redrabbit1104/items/3c83883ab811d7bd1337

# phpファイルの読み込みとDB保存のための関数
入力フォームの完了画面のあたりに前回作成したデータベースへ保存処理が書かれているphp

元記事を表示

レトロなゲーム風の掲示板を作った

8ビットゲーム風の掲示板を作りました。

データベースが面倒だったので、CSVファイルを使いました。

一応スレッドも立てられます。

CSSはNES.cssを使いました。

フォントはPress + Start + 2Pを使いました。

ご使用の際はモラルを守って使用してください。

あとLGTMしてください
お願いします

![10907D5F-1FCB-45BF-9F9A-B9566B6C811E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795753/d5563275-930a-f454-7d85-350a895227da.png)

![5FBADC20-6640-4682-A0DE-7684D955FFAD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795753/6057fa30-2abd-21ad-aa4a-aa0c215a2339.png)

![83D43C75-01D4-4B7D-A425-9

元記事を表示

PHPの変数のスコープについてまとめてみた

そもそもスコープとは?

スコープ(Scope)は「範囲」という意味がある。
そのため、PHPの変数のスコープとは変数が適応できる範囲という意味 :whale2:

:house: ローカルスコープ

変数を定義している関数内でしか使えない変数のスコープ
関数の外で定義した変数を関数の中で使ったり、逆に関数の中で定義した変数を関数の外で使ったりすることはできない

“`php
function localScope()
{
$localValue = “これはローカルスコープの変数です。”;
return $localValue ;
}

echo $localValue ;
echo localScope();
“`
“`
  // 実行結果
> //echo $localValue;の実行結果
>これはローカルスコープの変数です。  //echo localScope();の実行結果
“`

元記事を表示

laravel 任意のフィールドの値が指定したものと一致していた時に除外するバリデーションルールを記載する方法

# 目的

– laravelで任意のフィールドの値が指定したものと一致していた時に当該フィールドのバリデートをスキップする方法をまとめる

# 方法

– フィールド`check`の値に「false」という文字列が格納されたときに、フィールド`input_str`の値のバリデーションをスキップしたいときは下記のように記載する。
– `input_str`の値のバリデーションルールは「必須」と「文字列であること」とする。
– 下記はリクエストファイルの`rules()`メソッドの内容のみ抜粋して記載する。

“`HogeRequest.php
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
‘check’ => ‘required’,
‘input_str’ => ‘exc

元記事を表示

【Laravel】スケジューラ(Lravelの定期バッチ)を手動実行する。

自分用のメモとして残します。

開発環境とかになると、タスクスケジューラに登録してないことが多いです。
そこで手動でLaravelのスケジューラを実行して動作を確認する方法をメモ。

#やり方
“`shell
php artisan schedule:run
“`

以上。

元記事を表示

SQLのCRUDについて再確認してみる

CRUDとは?

プログラミングでアプリを作る際の4大機能の頭文字を取ったもの。
CRUDはクラッドと読めば良いらいしい!

C・・・create(新規作成)
R・・・read(読み込む)
U・・・update(更新する)
D・・・delete(削除する)
の頭文字を取ったものになる。

SQL文でのCRUDの使い方

① CREATE

SQL文では新規作成のCREATEは“`INSERT“`という言葉で書く。(insertの直訳は差し込む)

“` 
INSERT INTO テーブル名(カラム名) VALUES(値);

//実際の使用例
INSERT INTO contacts(id,name,created_at)VALUES(1,”三宅”,now());
“`
使用例を実行した結果、“`contact“`テーブルには以下のデータが新規作成(追加)される。

PDOクラスのprepareメソッドについて勉強してみた

PDOのprepareメソッドでSQL文を実行する手順

①DBに接続
②実行したいSQL文をprepareメソッドにセット
③bindValueメソッドを実行して、SQLにパラメーターをセット
④executeメソッドで実際にSQLを実行
⑤返り値を取得

prepareメソッドとは

変動値を含むSQL文を実行するのに使うPDOクラス内のメソッド。
変動値を含むため、悪意のあるユーザーが変動値を入力する箇所に攻撃をしてきても大丈夫なようにSQLインジェクション対策としてプレースホルダを使って安全にSQL文を割り当てる必要がある。
プレースホルダーの書き方は、変数が入る箇所に「?」または「:(任意の名前)」をつければOK!

“`
$sql = ‘select * from contacts where id = ?’;      //疑問符プレースホルダー
$sql = ‘select * from contacts where id = :id’; //名前付きプレースホルダー
“`

bindValueメソッドとは

・・・そ

PDOクラスのqueryメソッドについて勉強してみた

:mushroom: PDOクラスとは

PDOは PHP Data Object の頭文字をとったもので、
データベースに接続するための機能

:mushroom: queryメソッドとは

データベースに接続した後、SQL文を発行してデータを取得するが、
queryメソッドではSQL文に変数を割り当てずに(POST,GETなどで取得した値によって動的に処理せずに)固定ページなどにデータベースの値を取得したいときに用いる関数。
返り値はPDOStatementオブジェクトとして返ってくるので、値を取り出すにはPDOStatementクラスで用意されているfetchを使う必要がある。

“`
$sql = ‘select * from samples where id = 1’;
$stmt = $pdo->query($sql); //$sqlに格納したSQL文が実行される
$result = $stmt->fetchAll();

/*
$stmtには返り値としてPDOStatementオブジェクトが入っているので、
PDOStatementオブ

prepareメソッドを使う時にbindValueを省略する記述法があるらしい…!

bindValueを省略しない書き方

prepareメソッドは変動値を持つSQLを実行したいときに使うメソッド。
基本的な流れは
変動値にプレースホルダーを持たせてprepareメソッドを記述
  ↓
prepareメソッドの返り値のPDOExeptionの中にあるbindValueメソッドで、
設定しているプレースホルダーに割り当てたい値、$PDOデータ型定数を設定する
  ↓
executeで実行する
  ↓
fetchで実行結果の返り値を取得

“`
$sql = ‘select * from contacts where id = :id’;
$stmt = $pdo->prepare($sql);
$stmt->bindValue(‘id’, 3, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll();
“`

bindValueを省略する書き方

基本的な流れは
変動値にプレースホルダーを持たせてprepareメソッドを記述
  ↓
bindValueを使わない代わ

id name created_at
1