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

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

LaravelでDIを使う

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

[Laravelで環境(開発環境と本番環境等)ごとに異なる値を定義する](https://qiita.com/toontoon/items/c1372b34859f94b0225e)
本記事は上記の内容を理解している前提で書かれています

# DIって?
簡単に言うと、作成したクラスをnew演算子を使ってインスタンスを作成せずに、クラスに名前を付けて、付けた名前を使ってインスタンスを呼び出す方法です
そして、名前とクラスのマッピングは独立したファイル内で行います
そうすると、名前とクラスのマッピングファイルを変更するだけで帰ってくるインスタンスのクラスを変えることができます
それの何がいいかというと、ユーティ

元記事を表示

AWSでLaravelのフォーム送信が出来なかった

ローカルでLaravelアプリをDocker環境に移行し、AWSのEC2へそのままデプロイしました。
EC2上で“`docker-compose up -d“`をして立ち上げ、サイトにアクセスしたら、
表示はされるのですが、ログインフォームや登録フォームを送信したら、こんな状態に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/248a50b8-1cc8-98d3-a83f-d5153053ff46.png)
かなり対処に苦労したので、記録しておきます。

#環境

Mac OS Catalina 10.15.4
PHP: 7.2.24
Laravel: 5.5.48
Docker: 19.3.6
Docker-compose: 1.16.1
AWS: AMI: Amazon Linux2
EC2: t2.micro(無料枠のやつ)

#どういうことか

画像の文字の意味的には「このページは期限切れだから更新してみて」的な感じ。
これが出る時は多くがCSRFト

元記事を表示

for文の多重ループ

#多重ループが理解しにくい

こんにちは、徳永です

今回はfor文を使った多重ループの概念が難しかったので
復習も兼ねて書き留めておく

まず最初に出会ったのは

ドットインストールにて
[『phpを使ってビンゴゲームを作ろう』](https://dotinstall.com/lessons/bingo_php_v2)
要は以下のような表示をHTMLで表示させてみようといったものだ

スクリーンショット 2020-06-06 23.29.21.png

ちなみに表示のさせかたは、かなり端折ってはいるが

“`php:

for ($i = 0; $i < 5; $i++) { for ($j = 0; $j <= 5; $j++) { //ランダムな数値を生成する処理 }

元記事を表示

PHP で解いてみた!!Paiza練習問題「長テーブルのうなぎ屋」

## この記事について

先日、知り合いとプログラミング(特にオブジェクト指向設計でデザインされたウェブアプリケーション開発において重要となるようなスキル)の独習について話をしていて、オンラインジャッジってどうなんですかね、みたいな話になり、まぁ基礎力は身につくだろうけど、どうなんだろう…と思ったので、実際に体験してみた感想(とコード)です。

今回利用したサービスは [paizaラーニング](https://paiza.jp/works) です。海外のだと LeetCode とか Codewars あたりも使ってみましたが、調べている過程で発見した以下の記事に触発されたので、同じお題「長テーブルのうなぎ屋」を取り上げてみました。

[Javaで解いてみた!! Paiza練習問題「長テーブルのうなぎ屋」 – Qiita](https://qiita.com/koukun1985/items/896b5fe4f2c72cff9c02)

問題を解くだけなら、別にオブジェクト指向で書く必要はなくて、関数化すら必要ないわけですが、そこを敢えて、ウェブアプリケーションを念頭に置いて、書いてみま

元記事を表示

Nginx経由でCVE-2018-17082脆弱性を攻撃する手法に関する個人的なメモ

以下は、特に公表を目的としない個人的な備忘録であるが、公開のメモであるので、もちろん指摘やコメントなどは歓迎する。
PHPの脆弱性 CVE-2018-17082 についてYouTube動画を制作するために、この脆弱性についてあらためて調べているが、Nginxをキャッシュサーバーにしている(リバースPROXYとしてNginxを使っている)場合の挙動についてきちんと調べていなかったので調べ直した。主に以下の記事に関係する。

[PHPの脆弱性 CVE-2018-17082 によるキャッシュ汚染についての注意喚起](https://blog.tokumaru.org/2018/09/cve-2018-17082-cache-poisoning.html)

ブラウザ <--> リバースプロキシ(Nginx) <--> Apache2 + PHP という構成を前提としている

今までの調査で、Nginxが挟まっている場合攻撃が刺さらないことは判明しているが、なぜ刺さらないかを追っかけきれていなかった。

NginxとApacheの間の通信をキャプチャするには、tcpdumpを使うのが一般的だろ

元記事を表示

PHPStanの型チェック機能をまとめる

# PHPStan の型チェック機能

https://phpstan.org/writing-php-code/phpdocs-basics
こちらをベースに独断と偏見で重要そうなところをまとめる。(翻訳ではない)

バージョンは 0.12.25。

## PHPDocと型宣言

### メソッドや関数で型を指定する

“`php
g();
return new Baz();
}
“`

“`
—— —————————————————
14 Call to an u

元記事を表示

【Lighthouse】Variablesを使ってスキーマを送る際に空文字がnullなる問題の対処法【Laravel + GraphQL】

# 発生したこと

GraphQLのString!型に空文字を送ったところ、スキーマに直接値を書き込む形では空文字のまま渡されるが、Variablesを使用して代入すると空文字がnullに変換される。

* スキーマ定義

“`php:schema.graphql
type Mutation {
updateUser(id: ID! name: String!): User! @update
}

type User {
id: ID!
name: String!
}
“`

* 単体のスキーマの場合。
* 正常に動作し、`name`は空文字のものが返される。

“`graphql:mutation
mutation {
updateUser(
id: 1
name: “”
) {
id
name
}
}
“`

* Variablesを使用してスキーマを使用した場合。
* こちらでは`updateUser`で`name`にnullのリクエストを投げているというエラーが出る。

“`graphql:mut

元記事を表示

Laravelでテーブルの中身をcsvファイルにエキスポート&インポート

## 環境
– PHP 7.3.1
– Laravel Framework 5.8.35
– csvファイルの読み込みには[SplFileObject](https://www.php.net/manual/ja/class.splfileobject.php)を使用

## 最終目標

スクリーンショット 2020-06-06 14.37.51.png

○○EXPORTを押すと、以下のようなファイルを吐き出します。

スクリーンショット 2020-06-06 14.49.04.pngPHPとMysqlで躓いた点まとめ

###その1 mysql関数が見つからない
どうやらPHP7系以降のバージョンではmysql関数が使用できないようなので、mysqliクラスまたはPDOクラス(こちらは筆者未使用)などの関数で書き換える必要があるみたいです。
###その2 引数が違うと怒られる
mysqli関数にはmysqli_select_dbなどmysql関数と引数の順序が異なるものがあるようです。
“`php
$connect = mysqli_connet(DB情報);
mysql_select_db(‘db_name’,$connect);
“`
これだとエラーが出ます。
正しくは
“`php
$connect = mysqli_connet(DB情報);
mysql_select_db($connect,’db_name’);
“`
のように記述する必要があるみたいです。

元記事を表示

PHP ベーシック認証方法

忘備録として

#ファイル構成

“`
mainte
┣index.php
┣.htaccess
┗.htpasswd
“`
ファイル名の前に『.』をつけると隠しファイルになる

#①index.phpの絶対パスを取得
“`php:index.php

“`
#②パスワード生成(暗号化)
“`php:index.php
echo(password_hash(‘パスワードを入力’,PASSWORD_BCRYPT));
“`

#③.htaccessを編集
※ファイル名を『index.php』→『.htpasswd』に書き換え

“`
AuthType Basic
AuthName “IDとパスワードを入力してください”
AuthUserFile C:\~\~\~\mainte\.htpasswd ←※ファイル名を.h

元記事を表示

return(返り値)を複数返す方法

#返り値を複数返す方法とは!?

こんにちは、徳永です

returnの概念がやっと理解できたかな?と思った矢先にこんな問題が

>関数内で値を2つ定義し、その二つの値を返り値に入れて
>出力してください!

ふむふむ・・・

返り値を2つね、楽勝!!

“`php:

function test()
{
$num_1 = 100;

$num_2 = 200;

return $num_1, $num_2;
}

echo test();//エラー

“`

あれ、構文エラー???

複数返り値にもたすことはできないのかな?

ならばこれで・・・

“`php:

function test()
{

$array = [
$num_1 = 100,
$num_2 = 200
];
return $array;
}

echo test()[0]; //100
echo test()[1]; //200

“`

なるほど

返り値を二つ以上返したい場合は配列に入れて返せばいいのですね!

では試しに・・・

“`php

元記事を表示

【覚書】PHP 問い合わせフォームの作り方

備忘録として。

#作成コード全体

“`php:form.php

‘; // var_dump($_POST); // echo ‘

';
// echo $_GET['name'];
//スーパーグローバル変数
//全9種類ある
//連想配列になっている
//[]の中にはinputタグのキー(name="キー")を入力
//値がどうなっているかを確認できる


$pageFlag = 0;
//1ページで入力→確認→完了まで表示する場合
//pageFlagという変数を使って
元記事を表示

「複数代入」ってなに?-猿でも分かるlaravel解説-

#複数代入とは? データベース作成において登場する「複数代入」という概念、最初は意味わからないですよね。 大丈夫です、それ、サルでもわかります。 猿でもわかるように複数代入を解説します。 結論から言うと複数代入とは**複数のカラムにデータを入れること**です `例えば、passwordだけ更新出来る画面が有ったとして、ブラウザに表示されるのはpasswordフィールドだけですが、ブラウザをちょっといじれば入力項目を追加できます。これが複数代入です。 大抵、他の項目も更新出来てしまう問題を回避するために、複数の項目に代入出来ない様にしています。` はい、そのまんまです。 また、よく出てくるEloquentに関する記事では次のような説明を行っていました。 >Eloquentユーザーからの入力を元にデータを保存する場合、悪意のあるユーザーがこちらの意図しないデータの保存・更新を行うように複数の項目を代入してくることです。 例えば、ユーザー作成の際に管理者権限にするかどうかは通常のページにはPOSTする項目として設定していないにも関わらず、悪意のあるユーザーが独自に項目を追加しPO
元記事を表示

Google Calendar APIを使ってみた

さぁ、始まりました!使ってみたシリーーーズ 今回はGoogle Calendar APIで予定(日本の休日)を取得してみる。 # 準備 - [Google Cloud Platform](https://console.cloud.google.com/)にアカウントを作ってログインする。 - プロジェクトを作成する。 - [APIとサービス]-[ライブラリ]で`Google Calendar API`を選択して[有効にする]をクリックする。 - 認証情報を作成で`サービス アカウント`を選択する。 - キーを作成でキータイプJSONを選択して[作成]をクリックする。 サービスアカウントのJSONファイルがダウンロードされる。 # Google Client Libraryをインストール [PHPクイックスタート](https://developers.google.com/calendar/quickstart/php) [composer](https://getcomposer.org/)がインストールされていない場合はインストールする。 ```sh $ brew
元記事を表示

Laravel アプリのローカルサーバの起動に失敗する

# 目的 - git cloneした直後のLaravelアプリのローカルサーバ起動コマンド(`$ php artisan serve`)の実行に失敗したので原因と解決方法を記載する。 # 実施環境 - ハードウェア環境 | 項目 | 情報 | | --- | --- | | 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.3 | Homwbrewを用いて導入 | | Laravel バージョン | 7.0.8 | commposerを用いて導入 | | MySQLバージ
元記事を表示

$matches[0] の中身はなんだろな? - 量指定子の仲間たち

# はじめに おはようございます。今朝、早起きして [Laravel](https://laravel.com/docs/7.x) のルーティング処理を読んでいたら、見慣れない正規表現に出くわしました。 見慣れない正規表現というのは `*?` とか `+?` とかです↓ ソースコードの引用元は [こちら](https://github.com/laravel/framework/blob/7.x/src/Illuminate/Routing/Route.php) です。 ```php:Illuminate\Routing\Routeクラス /** * Get the parameter names for the route. * * @return array */ protected function compileParameterNames() { preg_match_all('/\{(.*?)\}/', $this->getDomain().$this->uri, $matches); return array_map(function ($
元記事を表示

Amazon linux 2でのphpの更新方法

# 症状 WordPressの管理者画面のサイトヘルスにphpのバージョンを7.3以上に上げてよ、という「おすすめの改善」が出てしまった。 # 環境 - AWS - Amazon linux 2 t2.micro - php7.2.30 - WordPress # やりたいこと phpをバージョンアップする。なんかよく分かんないし、最新にしちゃえ。 # やったこと ## 現在のバージョンを確認する ``` $ php -v PHP 7.2.30 (cli) (built: May 5 2020 18:04:45) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies ``` WordPressで怒られたとおり。古い。 ## SSHを使用して、AWS EC2 Linuxインスタンスに接続 いつもの方法で。macのターミナルを使いました。 参考:[Connecting to your Linux instance us
元記事を表示

WEBサーバのTCPコネクション数に上限はあるのか?

#はじめに アクセス数がすごい環境は大抵高負荷環境でもあるので対策としてApacheの設定やサーバ構成のセオリーをすぐ見つけられて実際試しても目に見えて良くなります。 アクセス数の多さで起こる問題は実際に負荷をかけてみないと表面化しません。 問題が分かったら設定やパラメータを調整して現状がましになるようにするだけです。 ですが限りあるリソースの中でTCPセッションを十分にコントロールしようとするとすぐ手詰まりです。 WEBサーバがしているやりとりの基礎が足りていないそんな気がしていたのでTCPに目を向けてみました。 #行き着いた結果は 待ち受け側とリクエスト側ではボトルネックが違う リクエスト時はTCPのエフェメラルポートが上限 待ち受け時はTCPよりもファイルディスクリプタが上限 になりやすい という良く見かける設定を見直すということになりましたが、どうやってそうなっているのかが今回の成果だと思います。 #TCPセッションはどうやって区別されるか? 1つのサーバでのTCPセッションは複数のクライアントと複数のセッションを組むことができてそれぞれを識別しています。 それをどう
元記事を表示

PHPでcsvファイルから商品一覧ページと商品詳細ページを作る

#希望内容 自社商品の情報はデータで管理してる。 ホームページがで自社商品を紹介したい。 でもネットショップを作るほどでもない。 簡単でいいのでホームページ上で自社商品を紹介できないか? 上記希望をPHPを使って実現する方法。 #PHPコード ```index.php eof; } fclose($handle); } ?> `
元記事を表示

PHPでsudoコマンドを実行する方法

#OSコマンドを実行する関数 ##shell_exec >shell_exec ( string $cmd ) : string ###返り値 実行されたコマンドからの出力を返します。 エラーが発生した場合やコマンドが何も出力しなかった場合は NULL を返します。 ###例 ```php $output

“;
?>
“`

##exec
>exec ( string \$command [, array &$output [, int &\$return_var ]] ) : string
###返り値
コマンド結果の最後の行を返します。コマンドを実行し、 一切干渉を受けずに直接コマンドから全てのデータを受けとる必要が あるならば、PassThru() 関数を使ってください。
実行されたコマンドの出力を取得するには、必ず output パラメータを設定・使用してください。

###例
“`php

元記事を表示

OTHERカテゴリの最新記事