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

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

PHP オブジェクトを配列のように扱うためのインターフェース ItetatorAggregateやArrayAccessなど

# はじめに

PHPには、いくつかの[定義済みインターフェース](https://www.php.net/manual/ja/reserved.interfaces.php)があります。その中でも特に、以下のインターフェースを実装することで、オブジェクトを配列のように振る舞わせることが可能です。

– Traversable
– Iterator
– IteratorAggregate
– ArrayAccess
– Countable

これらのインターフェースを満足させる方法を見ていきます。

# Traversable

Traversableインターフェースは、`foreach`文でループ可能にするためのインターフェースです。しかし、Traversableはこれは内部エンジンのインターフェイスであり、PHP スクリプト内で実装することはできません。かわりにTraversableを実装したIteratorかIteratorAggregateを使用する必要があります。

“`php

元記事を表示

Webサイトに来た攻撃をまとめてみた

# はじめに
自宅にインターネットに公開しているWebサイト(自宅サーバー)があります。Webサイトでは日夜、世界中から脆弱性を悪用しようと攻撃を受けているのですが、今回は実際にWebサイトに来た攻撃の一部を紹介してみようと思います。

# 環境
* Laravel(PHP)を用いた動的なWebサイトなどを自宅で公開
* インターネットとの境界線にFW(Fortigate)を設置。UTMライセンスあり
* インターネット->自宅サーバーNWへの通信に対してFWの`アンチウイルス`、`IPS`、`WAF`を有効
– `IPS`とは: 不正な通信を検知、ブロックする機能。主にOS、機器などの脆弱性を狙った攻撃
– `アンチウイルス`とは:パケットに含まれるウイルスを検知、ブロックする機能
– `WAF`とは:Webアプリケーションレベルの攻撃を検知、ブロックする機能
* 期間は11月のある一週間

# 結論
自宅であろうが、AWSであろうが、レンタルサーバーであろうが、Webサイトをインターネットに公開すると攻撃を必ず受けます。Webサイトを公開する場合は、OS、ミドルウェア、

元記事を表示

ボタンクリックにより、同じIDの別のカラムのフィールドを出力する

前提: DBが作成されデータが入っている状態

例えば、こんな感じのデータベースを用意して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863480/583ac575-202b-af09-cfe2-fdc3ca448463.png)

キャラ名の隣のボタンをクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863480/2e9e6485-6958-473b-b8fd-0accb25d00b9.png)

そのキャラのタイプが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863480/6406f2ef-c99e-8ae8-e08c-90fcf0270327.png)

(↓動画にするとこんな感じ)
https://gyazo.com/8e68421fe20af2d6

元記事を表示

is_arrayについて

##is_arrayとは
`is_array()` = `()の中の引数が変数か配列か判定する関数。`
変数が配列の場合「true」、配列ではない場合「false」が返される。

“`

$number = array( 1,2,3,4); //array()で配列を作成

if(is_array($number) ){
print ‘$numberは配列です。’; //true時の処理
} else{
print ‘$numberは配列ではありません。’; //false時の処理
}

↓ //出力結果

$numberは配列です。
“`

参考元はこちら
(https://www.php.net/manual/ja/function.is-array.php)
(https://php-beginner.com/function/var/is_array.html)

元記事を表示

Humhubのカスタムモジュールの作り方(既存モジュールの改造:Modelにフィールドを追加する)

# はじめに

Humhubのカスタムモジュールの開発について、今回は、既存モデル(モジュールのDB(ActiveRecord))にフィールドを追加して利用するカスタマイズを紹介する。今回の参考例は、スペースのデフォルト言語プロパティを整えることを目的に、「Space」モジュールを直接改造するカスタマイズだ。

# 事前準備

事前準備としては、計画立案と方法の調査・確認・検討を行うべきだろう。

##設計(構成の検討)
今回、”スペースのデフォルト言語”という設定項目にしたいので、既存のSpaceモジュールのアクセスするDBにフィールドを追加して扱えるようにしたい。追加するフィールド名をlanguageとし、文字列を扱えるデータ型にしておけばよいだろう。あとは、Spaceモジュールの動作をカスタマイズするかSpaceモジュールのModelsを通じて、ActiveRecordを扱う処理を作成する、という手順だ。

## 手法の調査
Humhubの[公式説明](https://docs.humhub.org/docs/develop/models)によると、まずは、humhubのルートデ

元記事を表示

Laravel:SQLSTATE[42000]Syntax error or access violation…bytesの解決

#【概要】

1.[結論](#1結論)

2.[SQLSTATE[42000]とは何か](#2sqlstate42000とは何か)

3.[なぜこのエラーになったのか](#3なぜこのエラーになったのか)

4.[どのように解決したのか](#4どのように解決したのか)

5.[参考URL](#5参考url)

6.[開発環境](#6開発環境)

#1.結論
`app/Providers/AppServiceProvider``public function boot()``Schema::defaultStringLength(191);`を記載する!

#2.SQLSTATE[42000]とは何か

アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。

#3.なぜこのエラーになったのか
結論から言いますとLaravelとMysqlのバージョンのせいで、M

元記事を表示

PHP array_mapの色々活用方法

# 初めに

@tadsan さんに他の書き方教えていただいたので追記しています!
@tadsan さんありがとうございます!:bow:

比較
こんな時どうしよう、、、
こんな時どうしてたっけ?
みたいなことが10000億回ぐらいあるので、
ここに記録しておくことにしました!

記事は温かい目でみて頂けると嬉しいです!
優しい世界大事、大事ヽ(´▽`)/

ちなみに、コード実際にすぐ動かしたいだ!という方に以下オススメです!
私はよくお世話になってます!『paiza』さんありがとうございます!
https://paiza.io/ja/projects/new

###in_array + array_map

:thinking:配列の中のあるキーの値の中に含まれているか確認したいんだ~~~~の時に使用

コード例

“`.PHP
[‘id’ => 123424, ‘article_id’ => 454545],
1 => [‘id’ => 198989, ‘ar

元記事を表示

【PHP】PaizaのDランク問題(辞書式ソート)で躓いた話

##はじめに
アルゴリズムの基礎を学ぶため、現在[Paizaラーニング](https://paiza.jp/works/mondai/c_rank_level_up_problems/problem_index?language_uid=php)の問題集に取り組んでいます。こちらのリンク先の問題はCランク(forループなどの基礎的な問題が解ける程度の水準)達成に向けた問題集ですので基本的に難易度は低いはずですが、躓いた問題があったので投稿しておきます。

###ソート問題 STEP:3 辞書式ソート
難易度は堂々のDランクです。ぐぬぬ。
PHPではソート用の関数として`sort()`や`rsort()`といった関数が用意されていますが、文字列の場合でもこれが適用できますよ、ということを初学者向けに紹介するというのがコンセプトとなった問題な気がします。気がするのですが・・・

####問題概要
こちらから。
[https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_step3?language_uid=php]

元記事を表示

【初心者】PHPでバブルソートを使ってみた。

# バブルソート
何度も使うので覚えておいた方が良いのかもしれないので、チラシの裏な感じで。
バブルソートとは隣り合う要素の大小を比べながら小さい順(大きい順)に並べること。

for($i = 0, $i < n, $i++) for($j = 1, $j < n, $j++) $jx = $j - 1; if($jx > $j){
$temp = $jx;
$jx = $j;
$j = $temp;
}
}
}
こんな雰囲気で、左隣が右隣より大きかったら、空の箱($temp)を用意して、一時的に避難させて、入れ替える。
大きい順に並べたかったら逆にすれば良いのだろうなという想像をしながら、今日の学びは終了。

元記事を表示

【DB接続後sqlを渡すパターン】

`beginTransaction()`と`commit()`の使い方をわかっていなかったのでメモ

一つのsql文ですむ場合
`prepare()`と`execute()`だけでいい

“`php
try{
$db = new PDO(‘mysql:host=localhost;dbname=users’,’root’,’pass’);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERROMODE_EXCEPTION);
}catch(PDOException $e){
print $e->Message();
}
$sql = ‘INSERT INTO users (name) VALUES (?)’;
$stmt = $db->prepare($sql);
$stmt->execute(“taro”);

“`

関連する複数のsqlをinsertなどしたい場合(どれかが欠けるとおかしくなる時)
beginTransaction()を使って、失敗したらrollbackさせる。

“`php
try{
$db = new PD

元記事を表示

LaravelのSeeder実行時に「Class ‘Database\Seeders\Datetime’ not found」エラーが出たときの対処法

# 背景
LaravelでSeeder実行時に少々詰まったので共有します。

# 環境
Laravel Framework 8.15.0

# 現象
Seederファイルを用意した状態でSeederを実行するとエラーが発生する

“`terminal
$ php artisan db:seed
Seeding: Database\Seeders\FutsalsTableSeeder

Error

Class ‘Database\Seeders\Datetime’ not found

at database/seeders/FutsalsTableSeeder.php:22
18▕ [
19▕ ‘name’ => ‘futsal 1’,
20▕ ‘place’ => ‘tokyo’,
21▕ ‘url’ => ‘xxx’,
➜ 22▕ ‘created_at’ => new Datetime(),

元記事を表示

phpUnitの練習をしたのでメモ

phpUnitの練習をしたのでメモしておく

**書いているテストは全てGreen**

## 数値関連
“`php
$answer = 1 + 1;
$this->assertIsInt($answer);
$this->assertIsNotFloat($answer);
$this->assertIsNumeric($answer);
$this->assertEquals($answer,2);
$this->assertNotEquals($answer, 100);
$this->assertGreaterThan($answer, 5);
$this->assertGreaterThanOrEqual($answer, 2);
$this->assertLessThan($answer, 1);
$this->assertLessThanOrEqual($answer, 2);

“`

## boolean関連

“`php
$this->assertIsBool(true);
$this->assertIsBool(false);
$this->assertTr

元記事を表示

【Laravel6でエラーが出た】BadMethodCallExeption: Method Illuminate¥Routing¥Rout::get does not exist.

#【Laravel6でエラーが出た】BadMethodCallExeption: Method Illuminate¥Routing¥Rout::get does not exist.

##使用環境
* windows 10 Home(COREi7)
* XAMPP 7.3.18
* Laravel 6

##背景
Laravel5.7入門の動画に沿ってLaravel6の学習をしていた。
しかしながら、ところどころ違うところも出てきており、極力、ファイルをいじらずに進め、**php artisan serve**をしようとしたところエラーが発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/1c8a8ead-bf4e-f7cf-f998-311d605603d5.png)

routesディレクトリ中のweb.phpを見てみると、以下のようになっていた。

“`php

元記事を表示

Laravel8をノリで使ってみたらTarget class [◯◯Controller] does not existと表示された

今までLaravle6や7でアプリなどを作っていたが8にバージョンアップになったと聞いて早速8を使ってみたら、今まで見たことないエラーメッセージが表示されたのでここにメモとして残すことにした。

記述したコード
routes/web.php

元記事を表示

PHPのThread Safetyが有効になっているかを調べる

###### tags: `php`

PHPには,スレッドセーフ版とノンスレッドセーフ版というのがある.

TS版,NTS版とか,PHP TS, PHP NTSとか呼ばれたりもする.

自分の環境で有効になっているかを確認するには,`phpinfo()`の出力や,`php -i`の出力を確認すればよい

> phpinfo()の結果を見るとわかる。Thread Safetyの項がenabledならスレッド・セーフ版、disabledならノン・スレッド・セーフ版である。
https://clover.fcg.world/2017/03/19/8093/#toc1

## 確認方法

### linux

linuxで確認する場合は以下.

“`
$ php -i | grep -i “thread safety”
Thread Safety => disabled
“`

### windows

windowsで確認するためには powershell で以下のように発行する.

“`
> php -i | Select-String -Pattern “Thread Safet

元記事を表示

sabre/dav

## インストール

* https://sabre.io/dav/install/

“`sh
composer require sabre/dav
# データの保存場所
mkdir -p /home/share/webdav/
chmod 700 /home/share/webdav/
# lockファイル用
mkdir data
“`

## 利用方法

“`php:/webdav/server.php
setBaseUri(‘/webdav/server.php’);

$lockBackend = new DAV\Locks\Backend\File

元記事を表示

【PHP】配列Aの並び順を正として、配列Bを並び替える

# 本記事の趣旨
PHPの配列について、備忘のためメモします。
誰かの何かの役に立てれば幸いです。

# 要件
配列A(以下”見本”)の要素の並び順を正として、配列B(以下”要並び替え”)の要素を並び替える。

ただし、
要並び替え配列の中身そのものを並び替えるのではなく、
要並び替え配列の各要素が見本配列に存在するか、をチェックしたうえで、
存在していたら、その要素は見本配列内では何番目にあるのか、という情報を取得し、
その情報をもとに、別な配列に要素を入れ直す。

**単純な配列の場合**

“`
$mihon = [“りんご”, “みかん”, ”バナナ”]; // 見本

$temoto = [“バナナ”, “りんご”, “みかん”]; // 要並び替え

$checked_array = []; // 並び替え後に格納する用の配列

foreach($mihon as $key => $fruit){
// 見本配列をループしつつ、要並び替え配列の$key番目の要素が、見本配列内に存在するかチェック
if(in_array($temoto[$key], $miho

元記事を表示

Laravel の FormRequest を全体的に、実態に近く自動テストする

## はじめに

Laravel の FormRequest のテストの話は rules() のテストだけなのが多いので、rules() 以外も含む FormRequest 全体を、より実態に近くテストする話をする

## テスト

以降は次を use する前提

“`php
use App\Http\Requests\HogeRequest;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
“`

全体なので FormRequest の passedValidation() や failedValidation() の実装の影響を受ける
以降はこれらがデフォルトの実装の前提。上書くときはその処理に従う。

### 成功することをテストする

FormRequest がサービスコンテナによる解決によって効果を得ることをテストする

“`php
public function testPass()
{
$attributes = [‘key’ => ‘value’];

元記事を表示

Read DoubleのComposerでLaravelインストールで躓いたところ

#Read DoubleのComposerでLaravelインストールで躓いたところ
プログラミング学習歴1年未満の初心者がLaravelをインストールするまでの道のり。
laravel公式(日本語ver)と言われる[Read Double](https://readouble.com/)だけではわからなかったため途中、調べたところを追加。

##使用環境(動作環境)
* windows10Home(COREi7)
* xampp7.3.18

##Composerシステム全体のvendor/binディレクトリを$PATHへ登録してくださいって何?
**$PATHへ登録する=PATHを通す=環境変数(環境パス)に登録する**
環境パスのことすらわからなかった(多分これまでも環境構築で設定してきたはず)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/5d7db8a4-e24d-c317-d6ba-4113a3662def.png)

###PATHを通すとは

>特定のプロ

元記事を表示

【PHP】単数系の英語を複数形に直す

PHPの初学者です。

作ったコードをQiitaに書く様にしていきたいと思います。

・末尾がs, sh, ch, o, x である場合英単語の末尾にesを付ける
・末尾がf, fe のいずれかである英単語の末尾の f, fe を除き、末尾に ves を付ける
・末尾の1文字がyで、末尾から2文字目がa, i, u, e, oのいずれでもない英単語の末尾の y を除き、末尾に ies を付ける
・上4つに当てはまらないものにはsを付ける

“` ‘children’,
‘crux’ => ‘cruces’,
‘foot’ => ‘feet’,
‘knife’ => ‘knives’,
‘leaf’ => ‘leaves’,
‘louse’ => ‘li

元記事を表示

OTHERカテゴリの最新記事