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

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

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を使わない代わ

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

# 初めに
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

# データを保存するテーブルを準備する
テーブル名はcontactsでidからcreated_atまでの8項目が用意されています。
![スクリーンショット 2021-06-20 16.53.54.png](https://qiita-image-store

short_open_tagを有効にする方法【php7.2以上】

php勉強して数ヶ月…

“`php

“`

「php」って毎度書くのめんどくない?!
と気付いたので、ショートカットできる方法を探した。
当方、**PHP Version 7.2.33**。
> `php.ini` ファイル内の `short_open_tag ` を `On `にすれば良い

とのことで早速実践!

1つ目の段落では、デフォルトで↓
>; short_open_tag
; **Default Value: On**
; Development Value: Off
; Production Value: Off

だけど、phpをショートカットできていない(現状そうだった
では次の段落。

>; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/short-open-tag
**short_open_tag=Off**

↑この `short_open_tag` が怪しいので早速 `On` へ変更!

無事

LaravelでモデルのUnitテストを書く時の注意

# はじめに

以下の記事にあるように、インスタンス化したモデルに自分で値をセットすることで、Unitテストを行うことができます。
ですが、この時プロパティを`date`へキャストする設定を行うとエラーが発生します。その時の解決法です。

https://qiita.com/ggg-mzkr/items/507c2921e442ad3ccab9

# TL;DR
* モデルのプロパティを`Datetime`へキャストするときは

“`php
‘datetime’ // active_fromカラムの値をDatetimeへキャストする
];

public function isActive(): bool
{
return $this->active_from < Carbon::now(); } } ``` * `setDateFor

Laravelで違う文字(濁点/半濁点/平仮名/片仮名)が同じ文字として使われてしまう問題の対処法

## はじめに
Laravelで日本語の比較処理をしようとしたところ、違う文字列であるにも関わらず同じものとして扱われてしまうことがありました。
その時の対処法を忘れないように記事にしたいと思います。

## 動作確認環境
– PHP 8.0
– Laravel 8.0
– MySQL 8.0

※下位環境でも動作する場合がございます

## テーブル構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490767/d74a503e-6891-a7fd-f186-37cc45134653.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490767/fac676c1-f138-e5e3-226c-394b767305f6.png)

## 問題点
“`php
$nana = Sample::where(‘name’, ‘バッグ’)->get();
“`

この処理。一見だと

【PHP】PHP課題14-8 ジャンケンゲーム 難易度(高)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/94cd6c7f-2233-f347-177d-1d1e92680e5f.png)

“`
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/04b768fa-3780-2eff-bc8e-08422eca0f65.png)

“`
“`

1・画面のレイアウトは画像の通り
2・ユーザーはグー・チョキ・パーのいずれかをラジオボタンで入力する
3・submitされたら、ユーザーの手を表示する
4・submitされたら、コンピュータの手をグー・チョキ・パーからランダムに選択し、表示する
5・submitされたら、じゃんけんの勝敗を判定し、出力する
6・利用するクラスは public/object_sample/classes 内に作成し、適宜読み込む。
7・JankenGameクラスとHandクラスを作成す

ユーザーエージェントを判別するAgentをLaravelにインストールする

![68747470733a2f2f6a656e737365676572732e636f6d2f7374617469632f6d656469612f6167656e742e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47882/bc9f18d2-f2fb-528f-e6e2-e163b667cc57.png)

「Agent」のロゴ。ダンディですね。

# UserAgentを識別するライブラリ「Agent」
https://github.com/jenssegers/agent

PHPでユーザーのOSやブラウザの種類を判別したいときには「Agent」が便利です。

## 使い方

“`php
isAndroidOS();

// ブラウザのチェック
$agent->isIE();
$agent->isSafari();

【PHP8.1】呼び出し元に返らない返り値の型が指定できるようになる

“`php
function foo():XXX{
exit;
}
“`

この関数の返り値の型は何にすればいいでしょうか。
null?
void?

nullはnullという型ですし、voidは『値を返さない』であって『呼び出し元に返らない』ではありません。
ということで『呼び出し元に返らない』を明記できる型が提案されました。
返らないのに返り値とは。

PHP8.1以降ではこう書けるようになります。

“`php
function foo():never{
exit;
}
“`

以下は該当のRFC、[PHP RFC: noreturn type](https://wiki.php.net/rfc/noreturn_type)の日本語訳です。

# PHP RFC: noreturn type

## Introduction

ここ数年の傾向として、元々はPHP docで表現されていた型がPHPネイティブになっていくということがあります。
過去の例としては[スカラー型](https://wiki.php.net/rfc/scalar_type_hints_v5)、[

【WordPress】All-in-One WP Migration のアップロード上限を上げる方法【ロリポップ】

# 【STEP1】 ロリポップ管理画面の php.ini の設定を変更

最初にロリポップの管理画面の「PHP設定」でモジュール版からCGI版に変更します。
php.ini の設定画面にある「php_value, php_flagを利用可能にする」の項目を `On` にします。
「php.iniを設定する」のボタンをクリックします。

![スクリーンショット 2021-06-21 18.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42231/6925ce62-4ace-93c0-185a-a4fdc64e15eb.png)

※モジュール版のままだと「php_value, php_flagを利用可能にする」の項目を変更できません。
※「php_value, php_flagを利用可能にする」の項目を `On` にすることで、 `.htaccess` に記述したアップロード上限の設定が有効になります。

# 【STEP2】 .htaccess に追記

既に WordPress がインストー

PHP 多次元配列の差分を取る方法

* LaravelのCollectionに多次元配列を比較する万能な機能を求め調べてみたのですが、特になかったので、
phpの配列の多次元配列の差分を見る方法を探しました。
下記のfunctionを用いて、差分を出してみてください。

“`php
public static function array_diff_assoc_recursive($array1, $array2)
{
$difference=array();
foreach ($array1 as $key => $value) {
if (is_array($value)) {
if (!isset($array2[$key]) || !is_array($array2[$key])) {
$difference[$key] = $value;
} else {
$new_diff = self::array_

phpstorm xdebug どうしてもつながらないよ。そんなとき

だれかの役に立てば

xdebug.log ファイルを見ても明らかに接続成功してるのに、breakpointで止まらない。
そんなときは

Language & Frameworks > PHP > Debug > External connections の

“`
Ignore external connections through unregistered server configurations
“`

のチェックをはずしてみてください!きっとつながります

LaravelのAuth機能で表示されるナビバーにリンクを追加したい。

#LogoutしかメニューがないAuth機能のナビバー。

Laravelでポートフォリオを作成中です!!

Auth機能でログイン機能を実装したのち
右上部にログインした後に名前が表示されるのですが
そこのナビバーって
Logoutしかメニューがないんですね。

今回のポートフォリオで
追加で「新規投稿画面」
「ユーザー情報画面」とか他画面に行くためのリンクの追加がしたい。。。。

##日本語で探したかったけどうまく言葉が見つからんやった

なので英語で説明あったので。
[こちら](https://stackoverflow.com/questions/61400144/adding-links-to-laravel-auth-navbar)

まだ初心者なので英語のソース見るのドキドキしちゃうんですが
簡単でした。

>This should be super simple to do, I’m not sure what you’re doing but to add additional links you can add an anchor tag to the drop

Engress(作成中)

# 事前準備

## コーディング手順

1. 対応ブラウザ、パスの指定方法、納品形式、フォルダの構造、アニメーションの実装などの仕様を確認。
2. デザインを見て、頭の中でコードを組み立てる。この際、「クラス名の命名」「共通要素の洗い出し」「実際のコーディングで直面しそうな問題の把握(実装の仕方がわからないなど)」を明確にする。
3. 画像の書き出し。画像ファイルの命名も「ttl_」「bg_」「ico_」「btn_」「img_」「nav_」などの識別子をつけ、画像がどのような意味を持つのか考えながら命名。 `「ページ名/ブロック名」_「識別子」_「連番」`の順で命名する。 また、背景透過、画質などを考慮し「png-8」「png-24」「jpg」「gif」などを適切な拡張子を選択する。 加えて、高解像度ディスプレイ対応のため2倍の大きさで書き出し。 さらに、ファイルサイズを考慮し、適切に圧縮をかける。
4. このテンプレートを使用し、まずは大枠、共通部分のコーディング、それから細部のコーディングを進める。
5. コーディング完了後はW3Cのバリデーションツールで文法のエラーをチェック。

CakePHP v3.5.x から v4.2.x へのバージョンアップについてのメモ

CakePHP 3.5.x から 4.2.x へバージョンアップする際に、苦労した点などをマトメていきます。

この記事は徐々に、更新していく予定です。

私が携わった案件では、サーバをインターネット環境に接続できないという制約があったため、composerは使用せず、全て手動でバージョンアップしています。

CakePHP4.xの移行ガイドに書かれていることについては、この記事では触れません。
移行ガイドだけ読んでいても気づきづらいことや、予め一覧化されていた方がよい変更点などをマトメていきます。

↓ v4.2の移行ガイドはこちら ↓
https://book.cakephp.org/4/ja/appendices/4-2-migration-guide.html

id name created_at
1

記述方法の変更点マトメ

現行のソースコードにこれらの記述方法の変更点を反映させて、新フレームワークに乗せ換えるだけで、ほぼほぼ動く様になると思います。
(もちろん、/src/Config配下の設定が正しく移行されていることが必要ですが。)

逆に言うと、

そのまま、コピペーでできます!LineNotify api でlineグループにメッセージを送信する(PHP)

①Lineグループを作る。
・Line Notifyのユーザーを友たちに追加します。
・Lineグループを作成します。
・Line Notifyのユーザーをグループに招待します。

②下記Urlにログインしてトークンを発行する。

https://notify-bot.line.me/ja/

こちらの画面から発行してください。
![notigy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1668939/52ea37b2-21e2-67bb-d55d-52d1d5316748.png)

③下記コードをそのまま使えば送信できます。

“`php:lineNoftify.php
function send($lineNotifyToken, $lineMessage)
{

$query = http_build_query([‘message’ => $lineMessage]);
$header = [
‘Content-Type: application

PHP、CakePHP、LaravelのそれぞれのXSS対策

# XSSとは
XSS(クロスサイトスクリプティング)は、脆弱性のあるWebサイトに対して、悪意のある不正なスクリプトを挿入する攻撃のことを示します。
挿入したスクリプトを、サイトに訪れたユーザーに実行させる攻撃のため、ウェブサイトそのものではなく、サイトを利用するユーザーに被害が発生します。
XSS対策を行っていないサイトでは、どのように攻撃されるのか例を見てみます。

## XSS対策をしていないサイトの例とXSS攻撃方法

「投稿する」ボタンを押下すると、入力データが保存された後、次の投稿一覧画面に表示されるサイトとします(今回テーマから逸れてしまうので、データベースに保存する処理を省略しています)。

### 例:投稿フォームと一覧画面
“`comment_index.php

投稿フォーム

コメント


Laravel8でHTTPテスト

## はじめに
初めまして。ヤマウチです。
今回は私が業務で実装しているLaravelのHTTPテストに関してPHPUnitのセットアップからテスト実行までの手順をチュートリアル風に書いてみました。
技術面がまだまだ乏しい弱々エンジニアですが、一人でも多くの方に参考になると嬉しいです。
誤った記載がありましたらコメントにてご指摘くださいm(__)m

## やること
今回はHTTPテストを実施することを目的としますので、すでに実装済みのコードがあることを前提に

– テストの準備
– データの作成
– 使用するトレイトやメソッド

を中心に紹介していきます。
マイグレーションや機能の実装などの紹介は行いません。
また、今回はコントローラの機能テスト(HTTPテスト)を行うていで進めていきます。

## テストの準備
Laravelでは、ユニットテストも考慮して作られており、最初からPHPUnitが標準で備わっています。
以下のコマンドを打つことでテスト用のファイルが`tests/Feature`ディレクトリへ配置されます。

“`
$ php artisan make:test U