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

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

コンテナ内で作られたファイルがrootとなり権限エラーで編集できなくなってしまう問題の処方箋

# はじめに
https://qiita.com/nagareboshi/items/e09cf8305654efbf9899

こちらの記事でUbuntu内ですべて完結すると処理が速くなると紹介しましたが、そうした場合デメリットがあります。
コンテナ内で作られたファイルは特に何もしなければrootユーザーとしてファイルが作られてしまうため、ホスト側からはファイル権限エラーとなり、編集することができなくなってしまいます。

今回はファイル権限まわりについて調べたことを記事としてまとめたいと思います。

# 動作確認環境
– Windows10 Home
– wsl2
– Docker Desktop for Windows
– Ubuntu20.04 LTS
– Laravel8
– PhpStorm

# Ubuntu側にコードの実体があり、それをコンテナにマウントした場合
先の記事で紹介した通り、こちらの方法の場合、無駄な変換処理などが行われないため処理がとても速くなります。
しかしながらこちらの方法の場合、特に何もしなければコンテナ内の操作はすべてroot権限で実行されるため、

元記事を表示

基礎④〜配列、連想配列〜 php

#はじめに
配列について書いてみた。

#内容

###配列とは

配列には添字配列と連想配列があり、これまでの変数が一つしか値を扱えなかったのに対し、配列を用いると複数の値をまとめて保存することができます。

例:

“`php
$a = array(‘ringo’,’banana’,’mikan’);

echo $a[0];
//結果:ringo

echo $a[1];
//結果:banana

“`

上の例題の説明をすると
・$a = array(‘ringo’,’banana’,’mikan’);
配列のデータには先頭から0, 1, 2…と数えていきます。
この場合
ringoは[0]
bananaは[1]
mikanは[2]
となります。

echoでringoを結果としてだしたかったのでecho $a[0];と書き結果ringoという値がでました。

###連想配列

連想配列は、配列と同じく複数のデータをまとめて管理するのに用いられます。配列との違いは、個々の要素を管理するのにインデックス番号ではなく、「キー」と呼ばれる文字列などの値を指定することができる点

元記事を表示

WordPress MW WP formプラグインの電話番号 半角数字バリデーション不備問題

# WordPress MW WP formプラグインの電話番号 半角数字バリデーション不備問題
Wordpressでメール送信機能を実装する際に、MW WP formプラグインで簡単に実装できる。しかし、
xxx-xxx-xxxのような電話番号で、半角数字のバリデーションを指定したところ、半角数字を入力したにもかからわず、半角数字と認識されずエラーメッセージが表示される場合がある。
解決方法を示したサイトが他なかったので、ここでその原因と暫定処置ではあるが解決方法を示す。

## 環境の整理
– WordPress 5.8
– MW WP Form プラグイン 4.4.0

## WP管理画面
1.MW WP Form にて、name=”tel”というフォームタグがあるとする。
![スクリーンショット 2021-08-11 070946.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/5f3f7302-2bbd-8679-1192-79c2bc3ecef7.jpeg)
2.telのバリデー

元記事を表示

PHP学習備忘録

#はじめに
現在PHPを学習中
大切だと感じたことや少し複雑と感じたこと、疑問に感じたことを解決し備忘録として残す

#PHPビルトイン関数
##requireとinclude
外部ファイルを呼び出すという同じ動作をするがファイル読み込み失敗時の挙動が異なる
・ **require** : E_ERRORを発行し処理を停止
・ **include** : E_WARNINGを発行し処理は継続

コアな実装には`require`、画面描画など該当箇所のみ表示させないことによりエラーをわかりやすくしたい場合は`include`など、実装内容に応じて使い分けたい

##requierとrequire_once
両者ともに外部ファイルを呼び出すという同じ動作をするが`require_once`は既にファイルが読み込まれているかPHPがチェックする
思いがけない関数の再定義や変数の際代入を回避することができる

##filter_input
指定した名前の変数を外部から受け取り、オプションでそれをフィルタリングする
フォームから送信された値を取得する際に用いる
**文法**

“`php
fi

元記事を表示

【PHP】IDを採番し直すやり方

“`PHP
[ ‘id’ => 89, ‘language’ => ‘PHP’],
1 => [ ‘id’ => 23, ‘language’ => ‘Java’],
2 => [ ‘id’ => 11, ‘language’ => ‘VBA’ ],
3 => [ ‘id’ => 17, ‘language’ => ‘Ruby’ ]
];

$i = 0;
foreach ($rows as $row) {
$data[] = [
‘id’ => $i,
‘language’ => $row[‘language’]
];
$i++;
}

var_dump($data);

?>
“`

元記事を表示

PHP 正規表現を使って文字列を比較する

# 目的

– 正規表現を用いた文字列比較ができる関数`preg_match()`の使用方法をメモ的にまとめる

# 方法

– 下記のように記載することで正規表現を用いて文字列を比較する事ができる。

“`php
preg_match(‘/パターン文字列(正規表現を含む検索したい文字列)/’, ‘比較対象文字列’);
“`

– パターン文字列が比較対象にマッチした時はintの`1`を返す。
– パターン文字列が比較対象にマッチしなかった時はintの`0`を返す。
– エラーが発生した時は`false`を返す。
– 必ずfalseを返す訳ではなく「falseとして評価される値を返す」場合もある。
– 当該関数の戻り値を評価する時は`===演算子`を使用しないと行けないらしい。

# 参考文献

https://www.php.net/manual/ja/function.preg-match.php

元記事を表示

基礎③〜for文、while文〜 php

# はじめに
前回はif文について触れたので今回はfor文とwhile文について触れてみたいと思います。

# 内容

## for文について
・for文とは繰り返し処理を行うことを意味します。

例:

“`php
for($i = 1; $i<=100; $i++){ echo $i; } ``` 結果: 123456789101112131415.....100 1〜100までが出力されることになります。 上記の例を説明すると ・$i = 1 というのは1から始まります。 ・$i=100は100までループするよというループ条件を表しています。 ・$i++は条件を満たすまで更新し続けることを表しています。 ##while文について ・while文もfor文と同様に繰り返し処理ができる1つです。 例: ```php $i = 1; while($i <= 100){ echo $i; $i++ } ``` 結果: 123456789101112131415.....100 上記の例を説明すると ・$iに1という変数を代入する ・($i

元記事を表示

PHP フレームワーク比較 

#■背景
普段、私自身LaravelやCakePHPを使用しているが、PHPのフレームワークは数多く存在する。
下記、調査しましたので記事に残して置きます。
・フレームワークの種類
・GitHubスター数の比較
・案件数
・Google Trendsによるトレンド比較

#■PHPフレームワークの種類
PHPには下記フレームワークが存在します。
 ◆Laravel
Laravelは2011年にリリースされたPHPのフレームワークです。
PHPフレームワークの中では後発ながら、その手軽さや扱いさすさから人気を集め、今やPHPの中でも代表的なフレームワーク。
 ◆CakePHP
CakePHP は2005年に登場したフレームワークです。
「Ruby on Rails」の概念を踏襲したフレームワークとなっていて、Railsの良い部分をPHPで実現したフレームワークだと言えるもです。
 ◆Symfony
Symfonyは、2005年に登場したMITライセンスに基づくオープンソースのPHP5用フレームワークです。SymfonyはMojaviから派生し、Ruby用フレームワークRuby on Ra

元記事を表示

mb_convert_encoding()のHTML-ENTITIESの変換は逆変換できない

[`mb_convert_encoding()`](https://www.php.net/manual/ja/function.mb-convert-encoding.php)の第2引数に`HTML-ENTITIES`を指定すると、文字列中の漢字やひらがななどをHTMLの文字実体参照・文字数値参照(` `,`€`みたいなやつ)に変換してくれます。

「漢字やひらがななど」とあえてふわっと書きましたが、正確にはASCII (0x00-0x7F) の範囲外の文字が変換対象のようです(このあたりドキュメントが見つからなかったのでおそらくですが)。

逆に、第3引数に`HTML-ENTITIES`を指定すれば、文字実体参照などをデコードできます。

“`php

元記事を表示

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

# CSRFとは
CSRF(Cross Site Request Forgery)とは、Webアプリのユーザー自身が、意図しない処理を実行するようにする脆弱性または攻撃手法のことです。
悪意のあるWebサイトにスクリプトや自動転送(HTTPリダイレクト)を仕込むことによって、ユーザーに別のWebサイト上で何らかの操作を意図せずに行わせる攻撃となっています。

## CSRF対策をしていないサイトの例と攻撃方法
今回、会員サイトのパスワード変更画面を例にします
ログイン後にパスワード変更を行う場合を想定しております
(今回テーマから逸れてしまうので、ログイン画面とパスワード変更完了時のサニタイズ処理は省略しております)。

### パスワード変更_入力画面
“`php

パスワード変更

プログラミング初心者がphp artisan db:seedしたらエラーが出た

はじめに
—–

現在プログラミングスクールにてGitHubを用いて共同開発中なのですが
相方が作ってくれたコードをローカルでマージして、DBにシーダーファイルのデータを登録しようとしたところ
エラーが発生しました。
※Laravelのverは6.20.16です。

エラーの内容
—–
“php artisan db:seed“をしたところ下記のようなエラーが出ました。
![シーダーエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1478204/d7262b12-f255-abf5-01ba-1fc70418afb2.png)

“UsersTableSeederクラス“が存在しないよと書かれていますが
ちゃんとフォルダの中には存在しています笑

困ったので色々と調べたところ下記のコマンドが有効でした。

“`
composer dump-autoload
“`

こちらを打ち込んだところ“Generating optimized autoload files“となり

元記事を表示

【講義11.php_ファイルアップロード】詰んだことでパーミッションの理解が深まった話

#本記事について
今後の開発の参考になればと思い、PHPについて、講義での実体験をまとめたもの。

##PHPのファイルアップロードについて
PHPではformを利用して画像ファイルの受け取り、アップロードが可能。
アップロードの流れは以下の通り
1.formからアップロード
2.tmp領域(一時保存場所)に保存
3.サーバの保存領域に移動
4.データベースに保存場所のパスを登録

##詰んだ内容
ファイルの権限設定をし忘れたことに気づかず、コードの記述ミスやパーミッション権限を疑ってハマった。
パーミッションはアップしたデータの修正、削除のみに使うため、疑うべきところが謝っていた。

##試したこと、疑ったコード
コメントしているfilename_to_save関数まではvar_dumpで確認できた。
そのため、パーミッション部分(if (move_uploaded_file以降以下)を疑った。
以下は、実際に記述したコード。

 

“`php
$img = $_FILES[‘img’][‘name’];
$img_data = “”;

if (isset($_FILES[‘i

元記事を表示

setErrors 上書き出来ない cakePHP

# はじめに
気力と体力がほとんどないのでちょっと乱雑な文章になりそうですが、
共有したいことは共有出来ているはずなので優しい心でお願いします!:bow:

バリデーションエラーの一部をなかったことにしたいけど少し戸惑ったのでここに残しておきます!

ちなみになぜそうしたかったかですが、Formでエラー表示しないとしてもエレメントで確認すると表示に違いがあるな〜〜〜と思い、これじゃだめだ!!!!だめなんだ!!!となりました、、

ちなみに表示させたくなかった文言は『このメールアドレスはすでに使用されています。』です。どのメールアドレスが登録されているかバレちゃうので、、:rolling_eyes:

# では早速

“`PHP

$fix_errors = $user->getErrors();
$fix_errors[‘email’] = null; //キーごと無くすunsetでは上手くいかなく戸惑いました、
$user->setErrors($fix_errors, true); //メソッド確認したら上書きするかの指定しないといけなかったのね、、と

“`

ちなみに

元記事を表示

GETとPOSTとは PHP

#■はじめにリクエスト行う方法を認識する。
●ブラウザのアドレス欄にURLを直接入力する。
●お気に入りからアクセスする。
●ページ内のリンクやボタン、画像などをクリックする。
●入力フォームに情報を入力して送信ボタンをクリックする。
などがあります。

#■リクエストを行う際サーバーに渡したいデータ
●見たい商品や動画のID
●ページ移動する際のページ番号
●ログイン画面に入力するメールアドレスやパスワード
●注文画面に入力する名前や住所などの個人情報

#■GETとPOSTというのはリクエストの方式の1つです。

####▼GET
リクエストを行う時にURLの末尾にデータ名を記載しくっつけて送る方法です。
?以降にデータが記載している。

■できない事
URLに長さの制限がある。長い文章や画像のようなデータ量が多いデータをURLにくっつけて送る事はできない。
個人情報やパスワードなどの情報をURLに記載されていたらまずい。

▼使い分け
画面表示のために必要
表示したい画像や動画のID、ページ番号など

GETは取得するためのリクエスト

“`
/search?id=なになに
`

元記事を表示

queryとprepareの使いわけ php

#■queryとprepareとは
PHPからデータベースを操作する手順です。

①データベースに接続
②実行したいSQL文をセットする。
③SQLに対してパラメーターをセットする。
④実際にSQLを実行する。
⑤結果を取得する。
⑥データベースから切断する。

###▼PHPからデータベースを操作するには簡易版と詳細版がある。
#■簡易版にはqueryをつかう。
上記の②③④の手順を簡易的に一括で行えるのがquery。

▼使い分け
SQL文の中に変動値がない場合queryを使う。

“` php
//変動値がないSQL文 例
$sql = “SELECT * FROM テーブル名”;
“`
▼使い方
セットから実行まで一括で行なっている。

“` php
$dbh->query($sql);
“`

#■詳細版にはprepareを使う。
上記の手順通り個別に行う。②③④に個別にメソッドが用意されている。
②prepareメソッド
③bindValueメソッド
④executeメソッド

▼使い分け
SQL文の中に変動値がある場合prepareを使う。
プレースホルダを使

元記事を表示

プレースホルダ php

#■プレースホルダとは
SQLインジェクション(DBに対して第三者が不必要なSQLを実行する事)等から守る方法
開発者の想定しない命令テーブルのデータ消去等を悪意のある第三者にさせないために使う。

万が一不正な値が入力されても第三者にSQL文の命令はできなくなる。

###▼SQL文の中にPHPの変数を直接書いてはダメ!!!
SQLインジェクションが容易に行えるようになってしまう!!

“` php
//■ダメな例
$sql = “SELECT * FROM user WHERE name= ‘$name'”;
“`

#■プレースホルダを使用する。
①変動箇所を:で指定。文字列カラムでもシングルクオテーションは不要。
プレースホルダの名前はカラム名と同じにしておくと分かりやすい。

“` php
$sql = “SELECT * FROM user WHERE name= :name”;
“`

②プレースホルダに実際の値をバインドする。
実際にプレースホルダを使えるようにここで指定してる。

“` php
$sql = “SELECT * FROM user WHER

元記事を表示

PHP7.4でzipがインストールできない

PHPのインストールでzip(**php74-php-pecl-zip**)のインストールに依存関係の問題で少しはまったのでメモ。php -m で「zip」が表示されてない状態。

環境:PHP/7.4 OS/Amazon Linux2

結論からいうと、Amazon Linux2のリポジトリが邪魔して、依存関係を解決できない状態になってました。

###1.**libzip-1.3.2-1.amzn2.0.1.x86_64**が邪魔してインストールできない

“`
[root@ ~]# yum install php74-php-pecl-zip

–> トランザクションの確認を実行しています。
—> パッケージ php74-php-pecl-zip.x86_64 0:1.19.3-2.el7.remi を インストール
–> 依存性の処理をしています: libzip5(x86-64) >= 1.8.0 のパッケージ: php74-php-pecl-zip-1.19.3-2.el7.remi.x86_64
–> トランザクションの確認を実行しています。
—> パッケー

元記事を表示

【Laravel】APIテストで自分で用意したテスト用ファイルをアップロードする。

## 背景

Laravelでファイルアップロードをテストする際には`UploadedFile::fake()`でダミーデータを送信することができる。[^1]

“`php
public function test_import_success()
{
Excel::fake();
Storage::fake();

$response = $this->post(route(‘users.excel.import.upload’), [
‘users’ => UploadedFile::fake()->create(
name: ‘users.xlsx’,
mimeType: ‘application/vnd.openxmlformats-officedocument.spread’
)
]);

$response->assertOk();
}
“`

しかし、CS

元記事を表示

未経験の学生が2ヶ月の共同開発を終えての感想

#はじめに
**・投稿した経緯**
 6月から2ヶ月間、一人の方と私立探求学園の共同開発に参加しました。結論として
とても良い経験で、僕と同じ未経験の方にはとてもお勧めできる内容でした。
振り返りと学習したことのアウトプットも兼ねて今後参加したいと思う方の参考になればと思い
ます。

#目次
・参加前の状況
・参加した理由
・共同開発の概要(簡単に)
・共同開発で身についたこと
・共同開発で苦労したこと
・全体的な感想
・まとめとこれから

#参加前の状況
・大学2年生20歳
・2ヶ月間別のプログラミングスクールに通い、文法などの基礎学習と
 個人アプリをテンプレートの教材をもとに作成した程度
・個人で1からアプリを作るといった経験はなし

#参加した理由
・Laravelのアプリを開発できる
・実務では必須のチーム開発を経験することができる
・一緒に開発する仲間がいる
・講師の方に質問、相談できる環境だった

#共同開発の概要(簡単に)
・2ヶ月間で掲示板アプリとECサイトの作成
・今回の開発人数は2人(基本は3〜4人程度)
・週2回のMTG
・Gitでバージョン管理
・GitHu

元記事を表示

【Laravel8・PHP8】PHPUnitのテストケースの中でseedingすると「PDOException There is no active transaction」とエラーが発生する。

## 背景

テストでマスターデータが必要になった。

テストケース中でシーディングするときに詰まったのでメモ。

## 環境

– Laravel 8.40
– PHP 8.0
– MySQL 8.0

## 事象

テストケースの中でシーディング実行するとエラー発生

“`
$ php artisan test ./tests/Unit/UserTest.php

FAIL Tests\Unit\UserTest
⨯ seed

• Tests\Unit\UserTest > seed
PDOException

There is no active transaction

at vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:279
275▕ */
276▕ protected function performRollBack($toLevel)
277▕ {

元記事を表示

OTHERカテゴリの最新記事