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

PHP関連のことを調べてみた2020年03月05日
目次

【CakePHP】CounterCacheでユーザーのフォロー数とフォロワー数をカウントする

# CounterCacheとは

例えば、記事に紐づくコメント数や、いいね数など`hasMany`で紐づくデータの数を記事のリストと同時に表示したいはずです。

そのようなときは`SELECT COUNT(*)`で取得する方法が考えられます。
しかし、記事データを取得する際に毎回`SELECT COUNT(*)`クエリが発行されるのははっきりいって地獄ですよね:confounded:
しかも、いいね数順にソートしたいときにもいいね数にインデックスを貼ることができないのでさらにパフォーマンスが悪化することが考えられますね…

そのような場合、**記事テーブルにコメント数いいね数カラムをもたせる(キャッシュさせる)**という方法がよく取られます。
あえて正規化を崩すような設計ですが、わざわざ結合や集計をすることなく取得することができ、さらにインデックスを貼ることもできるのでパフォーマンスの向上が見込まれます:laughing:

### 記事テーブルにカウント数をもたせる際のデメリット
パフォーマンスは向上しましたが、**正規化を崩している**ため、当然そのためのデメリットが存在しま

元記事を表示

WordPressで投稿と外部サイトの更新情報をまとめて日付順に表示する

#やりたいこと
– WordPressサイトの新着情報に外部サイトの更新情報もまぜたい
– 順番はまぜた状態で日付順にする

##イメージ
スクリーンショット 2020-03-05 10.22.05.png

#出来上がったコード

投稿の更新内容と外部サイトのRSSをそれぞれ取得し、新着順に並べ替えたリストを表示するショートコードを作成します。

“`functions.php
//新着表示用ショートコード
function newsFunc() {
global $wpdb;
global $post;
$disNum = 5; //表示数
$news_data = array();
//wpの新着
$wpLabel = ‘お知らせ’; //wp投稿用のラベル
$news_post = get_

元記事を表示

JavaScriptの問題 「DOM Based Xss / Webストレージの不適切な使用」

JavaScriptにまつわる脆弱性について。
「DOM Based Xss」と「Webストレージの不適切な使用」について記載する。

[JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript)

#DOM Based Xs

1. 概要
2. 攻撃手法と影響
3. 脆弱性が生まれる原因
4. 対策

##概要
JavaScriptが原因で発生するXXSをDOM Based Xssと呼んでいる。
XXSはサーバ側のプログラムの不備が原因で発生するが、クライアントサイドで動作するJavaScriptの記述の不備で発生するケースもある。
このケースがDOM Based Xssに該当する。

##攻撃手法と影響
###影響
通常のXSSと同じ。具体的な被害としてはフィッシング詐欺、セッションハイジャック、ウェブサイトの改ざんなど。

– クッキー値の盗み出し
– その他のJavaScriptによる攻撃
– 画像の書き換え

###攻撃手法
– innerHTMLプロパティ
– document.writeメ

元記事を表示

【PHP】連想配列の配列の書き方

jsonで連想配列の配列を送信しようとしたのだけど、どう書けばいいか分からず半日くらい詰まったのでメモ。

“`php:連想配列の配列.php
$arr = array(
‘表題’ => ‘名簿’,
[
array(
‘名前’ => ‘佐藤’,
‘年齢’ => 21,
‘出身’ => ‘兵庫県’,
)],[
array(
‘名前’ => ‘高橋’,
‘年齢’ => 22,
‘出身’ => ‘京都府’,
)],[
array(
‘名前’ => ‘鈴木’,
‘年齢’ => 25,
‘出身’ => ‘愛知県’,
)],
);
echo json_encode($arr, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT );
“`

echoの内容

“`
{
“表題”:

元記事を表示

vagrant up で docker-compose を起動する

## 目的

* Vagrant で構築する VM 内に Docker と docker-compose をインストールし、docker-compose を起動する。

## vagrant-docker-compose プラグイン

shell プロビジョナ等で Docker や docker-compose をインストールして起動しても良いのですが、まさにこういった用途に合ったプラグインがあったのでこれを利用します。

https://github.com/leighmcculloch/vagrant-docker-compose

“`sh
$ vagrant plugin install vagrant-docker-compose
“`

## ファイル構成

VM の中で `php` イメージを docker-compose で起動するようにします。
ファイル構成は下記のようにしています。

“`sh
public/
+ index.php
docker-compose.yml
Vagrantfile
“`

index.php は phpinfo() を実行す

元記事を表示

concrete5 (version 8)を CentOS8の環境に構築する①

# 概要

concrete5とは、オープンソースで現在でも開発が進められているCMS製品です。
githubでのcontributorたちの活動状況はこんな感じです。
スクリーンショット 2020-03-04 19.58.15.png

2019年まではかなり活発で、2020年はまだそこまででも無いですが、
安定してそれなりの頻度で開発されていることは分かります。

とあることからconcrete5について知る機会があり、せっかくなので自分で触ってみようと思ったので、
まずはその環境を用意するところからやることにしました。

やるからには最新バージョンで取り揃えたいので、まずはその環境構築から始めます。

# 環境情報

今回の環境構築にあたって必要となる主な製品とバージョンです。

– Vagrant 2.2.

元記事を表示

Laravelでライブラリを入れる際にバージョン違いで怒られた話

# 困ったこと
* 下記のようにlaravel/uiというライブラリインストール時に、laravel/frameworkのバージョン違いでインストール失敗

スクリーンショット 2020-03-04 19.10.59.png

# 問題の背景
* プロジェクト作成時はLaravel6で開発をはじめたが、開発中にLaravel7がリリースされていた。
※2020年3月3日にLaravel7がリリースされていた

# 解消方法
* 自身の利用しているlaravel/frameworkへ対応しているライブラリのバージョンを指定してインストールする
“`$ composer require laravel/ui:1.2“`

# 参照文献
* [composer requireがInstallation

元記事を表示

[PHP]Allowed memory sizeの原因がくだらなかった

##[PHP]Allowed memory sizeの原因がくだらなかった

100万件のCSVをPHPで読み込むために、メモリ上限を1028MBに変更したが、
相変わらずメモリエラーが発生するのはなぜだろう。

“`
Allowed memory size of 2097152 bytes exhausted (tried to allocate 1052672 bytes)
in C:\Users\user_name\htdocs\hoge.php on line 32
PHP Stack trace:
“`

よく見ると、php.iniでmemory_limiを1028MB と書いていた。
MBと書いたことが原因っぽい。

“`php
memory_limit = 128M
“`
MB→Mに書き直したら正常に処理できた。(というかデフォルトに戻した)
当たり前すぎるが他にも同じ理由でエラー起こす人がもしかしたらいるかもしれない
ので投稿しました。僕はこれで数日つまづいていました(笑)

元記事を表示

ZIPファイルのAES暗号化をPHPで実装する

# ZIPファイルのAES暗号化をPHPで実装する

## AES暗号化について

ZIPには元々`Traditional PKWARE Encryption`(通称:`ZipCrypto`)とよばれる暗号化機能があり、WindowsやMacOSXの標準で現在でも使われている。[PKZIPのAPPNOTE.txt]( https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT )にはより強力な暗号化の仕様(`Strong Encryption Specification`)が載っているが、これをサポートしているアーカイバは少ない。開発元のWinZipやPHP7.2以降のZipArchive・7-zipでは、AESを利用した`AE-x encryption`とよばれる暗号化処理を実装している。以降でその仕様をまとめ、PHPによる実装例を紹介する。

## AE-x encriptionの概要

* AESのカウンターモードを使う(aes-256-ctr等)
* 暗号化キーと検証キーにPBKDF2を使う
* ファイル検証にHMAC

元記事を表示

Laravel5.7 新規画像投稿〜画像表示まで

###はじめに
備忘録的視点でLaravelを使った画像投稿の方法を記述。
したいこと
→投稿するたびに、任意の画像たちが画面に出力される
##準備物
DB・・・diariesテーブルとeimgカラム作成
投稿画面・・・newpost.blade.php
出力画面・・・home.blade.php
ルート・・・web.php
コントローラー・・・DiaryController.php
モデル・・・Diary.php

あと、ここには書いてないけど出力画像の大きさを指定するhome.css

##実装過程
①画像投稿用のフォームを用意
②画像パスをDBへ保存
③指定した画像を任意storageフォルダに保存
④DBから画像パスを呼び出して、該当画像をstorageから出力

#①画像投稿用のフォームを作成
inputタグを使って画像データを指定する。
投稿画面用にnewpost.blade.phpを作成。
newpost.blade.php

“`

php アップロードサイズを変更する

#以下のようにセット設定が必要です

“`
ini_set()では変更できない。

php.iniを変更する
htaccessで設定する
httpd.confで設定する

/etc/php.ini
memory_limit = 40M
post_max_size = 32M
upload_max_filesize = 8M

/.htaccess 実行phpファイルと同じフォルダ
php_value memory_limit “40M”
php_value post_max_size “32M”
php_value upload_max_filesize “8M”

/httpd.conf
php_value memory_l

元記事を表示

【Laravel】Amazon S3へのアップロードが「403 Access Denied」で失敗する原因と対処方法

# はじめに
LaravelでAmazon S3へ画像アップロードする処理を実装し、いざアップロードしようとしたところ、以下のエラーが出て失敗しました。

“`
Error executing “PutObject” on “https://minna-no-houteishiki.s3.ap-northeast-1.amazonaws.com/r1oJ01mYWVeol0m7jUTji7uef5lyG7MATNOqzl1A.png”; AWS HTTP error: Client error: `PUT https://minna-no-houteishiki.s3.ap-northeast-1.amazonaws.com/r1oJ01mYWVeol0m7jUTji7uef5lyG7MATNOqzl1A.png` resulted in a `403 Forbidden` response:

AccessDeniedAccess Denied

元記事を表示

【 LaravelDB.com】リレーション自動生成!! チーム共有!! Tableチェック表示!!「2020年3月4日最新アップデート」

# ◇Laravel DB.com を初めての人はこちらから

[**初めての人はこちらから>>** ](https://qiita.com/daisu_yamazaki/items/068595670bdc2b6fe3fc)

#####
[**YouTube(操作方法)>>**](https://t.co/jGVarMoXse)

#◇NewUpdate[2020-03-4]
###1.リレーション自動生成
今まで、外部キー制約の機能のみ実装されていましたが 2020年03月04日から「 リレーション(JOIN) 」が生成できるようになりました。

LaravelDB_com_Editor_.png

#####リレーションのポイント
– JOINしてるテーブルの全ての項目を最初は表示します。
– CR

元記事を表示

【laravel】ErrorException file_put_contents(xxxxx): failed to open stream: No such file or directory

#エラーが発生するまでの過程
“`
php artisan serve
“`
↑のローカルのサーバーを立ち上げた状態で開発を進めていた。
1. 開発中にプロジェクトディレクトリの名前を変更したいと思いだす。
2. laravel → tutorial に名前を変更。
3. control+c でサーバーを閉じる。
4. もう一度立ち上げる。
5. タイトルのエラーが発生。

#原因
ディレクトリの名前を変えたことによって、アプリケーション内に設定されていた、パスが通らなくなった。

#解決法
アプリ名/bootstrap/cache/config.php 
にあるパスを再構築することで解決できる。
以下のコマンドで、アプリケーション内のパスが再構築される。

“`
php artisan config:cache
“`

元記事を表示

WSL2+docker+PHPのWindows開発環境構築(2) docker編

本ページに直接来た方は[WSL2+docker+PHPのWindows開発環境構築(1) WSL2編]から読んでね。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪ ---- ------------------- ↓ 余談はここから ↓------------------- [Laradock]:http://laradock.io [WSL2+docker+PHPのWindows開発環境構築(1) WSL2編]:https://qiita.com/dozo/items/9d9e958d4acefffb3fb8 [WSL2+docker+PHPのWindows開発環境構築(2) docker編]:https://qiita.com/dozo/items/17d0ebfb05bb4446caed [WSL2+docker+PHPのWindows開発環境構築(3) PHPStorm編]:() 関連記事: * [Bash on Ubuntu on Windowsを使う(1)](https://qiita.com/dozo/items/07ae85ab3937d2ed675a)

元記事を表示

php に xdebug を入れて phpstorm でデバッグする

## php に xdebug を入れる

“`
php -i | grep xdebug
php –version | grep xdebug
“`
などにより php に xdebug が入っていないことを確認します。

“`
pecl install xdebug
“`

により xdebug をインストールします。

自分の環境では初めはインストールに失敗し、

PHPのインストール : PHP


を参考にして解決しました。

インストールに成功すると

“`
php -i | grep xdebug
“`
などで xdebug の行が出てくるかと思います。

次に php.ini で xdebug のパラメータを設定します。
以下のコマンドで php.ini の場所がわかります。

“`
php -i | grep php.ini
“`

“`php.ini
xdebug.remote_enable = 1
“`
など、環境に合わせて追記していきます。

サーバーを起動したま

元記事を表示

Laravel Commandの実行ログをパラメータつきで出力させる

# 目的
Laravel Commandの開始時と終了時に実行コマンドのログを自動で出力するようにしたい。
パラメータ指定がある場合は合わせて出力させたい。

# バージョン
Laravel 5.7

# 実装
Laravel EventListnerを使って実装を行います。
## イベント/リスナ登録
`EventServiceProvider`の`$listen`に以下のようにイベントとリスナを登録します。
Commandの開始と終了のイベントは既に定義されているので、それに対応するリスナを自分で定義します。

“`php
[
CommandStartLogger::class
],
CommandFinished::class => [

元記事を表示

Laravel シンボリックリンクで少しハマった話

##はじめに
今回はアップロードした画像をHomesteadで表示する時にハマった話です。
画像アップロード時のディレクトリ指定&リネームの仕方含めて備忘録という形で書いていきます。画像のアップロード方法自体の方法はしません。

参考:https://readouble.com/laravel/6.x/ja/filesystem.html

###環境
“`
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G2022

ホスティングサービス: GitHub
通信プロトコル: SSH通信
“`

***
##1.画像アップロード時のディレクトリ指定&リネーム
storeAsメソッドを使います。
###storeAsメソッドの使い方

“`
storeAs(第一引数,第二引数);
#第一引数はディレクトリを指定します。通常は’public’を指定することで、
/storage/app/public/にファイルが保存されるようになります。
#第二引数はファイル名を指定します。

“`
###実装
`sto

元記事を表示

codeigniter3 データベースからYYYY/MM/DD形式で日付を取得する

codeigniter3でcreate_dateとupdate_dateを**YYYY/MM/DD**の形式で取得する

“`ruby:qiita.rb
$this->db->select(
‘*,
DATE_FORMAT(create_date,”%Y/%m/%d”) AS create_date,
DATE_FORMAT(update_date,”%Y/%m/%d”) AS update_date,’
);
“`

元記事を表示

【CakePHP3】【PHPUnit】コントローラーのテストでファイルをPOSTする方法

半日つぶしたので備忘録として。

POSTデータと`$_FILES`にそれぞれ画像の情報を入れれば正常に送れる。
(おそらく実践では`csrf_token`が必要になるはず)

“`php
public function testIndex()
{
$fileKey = ‘image_key’;
$fileInfo = [
‘name’ => ‘image_name.jpg’,
‘tmp_name’ => ‘path/to/tmp_image_name.jpg’,
‘type’ => ‘%拡張子と同じ形式%’,
‘error’ => UPLOAD_ERR_OK,
‘size’ => ‘%ファイルサイズ%’,
]
$_FILES = [
$fileKey => $fileInfo,
];
$this->post(‘index’, [$fileKey => $fileInfo]);
}
“`

元記事を表示

OTHERカテゴリの最新記事