PHP関連のことを調べてみた

PHP関連のことを調べてみた

非JS系フロントエンド環境でのパフォーマンス改善

様々な制約により、ReactやVue、SvelteのようなナウいJS系フレームワーク(or ライブラリ)の導入が難しい場面があります。しかし、そういった状況であっても、サーバーサイドだけではなく、フロントエンドでのパフォーマンス改善を求められることもまたあります。奇縁により、私はそういった仕事が多く、知見が溜まってきたので皆さんにシェアしたいと思います。

## ルール1:自前のCSSは書かない、読み込ませない

BEMやFLOCSSのようなルールでなるべくCSSファイルを簡素化させたとしても、「CSSを書かない」より軽くなることはありません。

### じゃあスタイリングはどうしたらいい?

– 高速CDNで配布されているCSSフレームワークを使いましょう。ただし、React前提だよねみたいなCSSフレームワークが多いのでそのあたりのリサーチは入念に。自分はBootstrapを使っています。イケてるとは思わないですが、汎用性も高く、また読み込みパフォーマンスも及第点なので選んでいる感じです。
– それでも足りない場合はstyleタグを用いましょう。CSS in JSの展開後のイメ

元記事を表示

【PHP】西暦から干支・干支から西暦を算出する

小ネタ。
PHPで西暦から十二支を出す必要があったので、ついでに十干十二支(干支=えと)を出す関数を作ってみた。

#### 西暦→干支
“`getEto.php
function getEto(int $yyyy = NULL, bool $with_jikkan = TRUE) {
// yyyyに西暦を入れるとその年の干支(十干十二支)を返す
// yyyyが空のときは今年の干支
// 第2引数を0にすると十二支のみ返す
$yyyy = $yyyy ?: date(“Y”);
if ($yyyy > 0) {
$jikkan = [
‘庚’,
‘辛’,
‘壬’,
‘癸’,
‘甲’,
‘乙’,
‘丙’,
‘丁’,
‘戊’,
‘己’,
];
$juunishi = [
‘申’,
‘酉’,
‘戌’,
‘亥’,
‘子’,
‘丑’,
‘寅’,
‘卯’,
‘辰’,
‘巳’,
‘午’,
‘未’,
];
return ($with_j

元記事を表示

自動テストの更新日時を現在日時にするな学園

# 学園校歌
自動テストを行う際は~更新日時に気をつけよ~
更新日時は過去にせよ~現在日時とするなかれ~
現在日時にするならば~データ作ったら少し待て~
更新前後のテストデータが~別となるデータを持て~
あぁわれら~われらの学園~
自動テストの更新日時を現在日時にするな学園~

# ここから真面目な話
## 先に結論
MySQLの仕様として「更新前後の値が全く同じデータは更新したものとして扱われない」というのがあるため、更新日時が現在だったり実際のデータをコピーしたりして、テスト前後のデータが同じになってしまう状況は作らないようにすべきである
## いきさつ
PHP(Laravel)で作成していたプロジェクトのテストがべらぼうに多かったため、自動テストで対応することにした
なんとか全て作成し、いざテストするぞというタイミングで、特定のテストだけ失敗するという結果になった
それ以外の類似テストは全て合格だし、何ならデバッグモードで実施しても問題なかった。だが、デバッグモードでのテストと自動テストで結果が変わってしまっては自動テストの信頼性が低くなってしまう
さすがにこのエラーのためだけに

元記事を表示

トラブル対応メモ:PHP画面から外部サーバへのファイル転送不良

いつものように基本的知識の不足ゆえ、久々にドハマりしてしまったのでメモ。

### (前提) ###
+ やりたいこと:PHPプログラム(Web画面)からexec関数を実行し、SCPを使って外部サーバへファイルをリネームしながら転送
+ SCPの実行に当たっては、本来は公開鍵方式でやるべきだが、相手先サーバの事情によりパスワード認証方式で実行せねばならない。
 ⇒シェルのexpectコマンドを使ってSCPを実行し、疑似対話イメージでパスワードを指定することにした。
“` shell
expect -c ”
set timeout 30
spawn /usr/bin/scp (転送元ディレクトリ)/hoge.txt root@(転送先サーバ):(転送先ディレクトリ)/hogefuga.txt
expect default { exit 10 } \”root@(転送先サーバ)’s password: \” ; send \”(転送先サーバパスワード)\n\”
interact

“`
### (発生した事象) ###
+ PHPプログラムを実行したところ、転送先サーバにリネ

元記事を表示

PHP開発者が必要とする8つの必須ツール

PHP開発者にとって、ツールの選択はワークフローと生産性に大きな影響を与えます。ここでは、経験豊富なPHP開発者が開発を簡素化し、コード品質を向上させるためによく使用する必須ツールを紹介します。

Codeium
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782463/ed0e4004-c8e3-3066-872b-fecd83d2a472.png)

[Codeium](https://codeium.com/)は、革新的なAI駆動のコーディングアシスタントで、PHP開発者のゲームチェンジャーです。開発環境にシームレスに統合され、リアルタイムでコンテキストに応じたコードの提案を提供します。このツールはコーディングタスクを加速し、ベストプラクティスを維持し、効率的でエラーフリーなコードを確保します。さまざまなコードリポジトリから継続的に学習することで、PHPコーディングを最新かつ業界標準に準拠させます。生産性とコード品質の向上におけるその利点は、すべてのPHP開発者のツールキットに

元記事を表示

【PHP8.4】ついにPHPにプロパティフックが導入される

プロパティフックとは何なのかというと、これです。

“`php
class HOGE{
public string $tel{
set{
if(!ctype_digit($value)){
throw new ValueError(“電話番号は数値のみ”);
}
if(strlen($value) < 10){ throw new ValueError("電話番号は10文字以上"); } $this->tel = $value;
}
get{
return ‘電話番号は’ . $this->tel;
}
}
}

$hoge = new HOGE();

$hoge->tel = ‘123456789012’; // OK
$hoge->tel = ‘abcdefghijkl’; // Uncaught ValueError: 電話番号は数値のみ
$hoge->tel = ‘123’; // Uncaught ValueError: 電話番号は10文字以上

echo $hoge->tel;

元記事を表示

phpでJSONを生成してjsに渡す時の注意点

jsonを生成する時に単純に

“`php
$json = json_encode($str);
“`

としていないだろうか。単なる数値だけならこれでよいが、例えば、

“`php
$str[1] = “G’men ’75”;
$str[2] = ‘\2,800’;
$str[3] = ‘my name is “john”‘;
“`

というような文字列をエンコードしてjavascriptに渡すとエラーになる。

“`php
$json = json_encode($str, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS );
$json = str_replace(‘\\’, ‘\\\\’, $json);
“`

とするのがよい。

元記事を表示

今日の学び #1 2024-05-20

## Laravel

### `TrimgStrings`ミドルウェア
リクエストの内容(主にPOSTのbody)は、標準のMiddleware(`TrimgStrings`)内のtrim関数によってトリミングされている。
(知らなかったのが恥ずかしい…)

https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php

### `TransformsRequest`

リクエスト内容を書き換えるためのクラスで、これを継承すれば多階層になっているjsonの中身も再帰的に走査できる。
`transform`メソッドだけ弄れば最小の実装で済む。
`TrimgStrings`もこれを継承している。

https://github.com/laravel/framework/blob/11.x/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php

## その他読んだ記事
h

元記事を表示

最大値を探すアルゴリズム

## はじめに

最大値を探すアルゴリズムについてまとめる

### 対象データ

5つの整数が格納された配列を処理対象とする。

“`php:data.php
$array = [12, 13, 11, 14, 11];
“`

### フローチャート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733055/c1485c9f-0902-e7be-a60a-dfbadec50269.png)

### 解説

①変数`max`を用意する。
②`array[0]`のデータを変数`max`に代入し、暫定の最大値とする。
③変数`max`と`array[1]`を比較する
④`array[1]`の方が大きければこちらが新最大値となる。
⑤`array[1]`が変数`max`より大きくない場合は変数`max`に格納された`array[0]`が最大値の座をキープする。
⑥以降は同じ手順で繰り返す。
⑦変数`max`を出力する。

元記事を表示

初心者向け!PHPを用いたWebアプリケーション作成(環境構築編)

# はじめに
こんにちは!社会人一年目の石川です。
記事をご覧いただきありがとうございます。
私は現在、PHPを用いた研修でWebアプリケーションの作成へと進もうとしています。
そこでPHPで最も人気のあるフレームワークの一つであるLaravelを使ってみたい!と思ったので記事にしました。

:::note warn
注意
この記事はWindowsユーザー向けです。
:::

## 目次
1. XAMPP
* [XAMPPとは?](#xamppとは)
* [XAMPPのインストール手順](#xamppのインストール手順)
* [XAMPPの動作確認](#xamppの動作確認)
2. Composer
* [Composerとは?](#composerとは)
* [Composerのインストール手順](#composerのインストール手順)
* [Composerの動作確認](#composerの動作確認)
3. Laravel
* [Laravelとは?](#laravelとは)
* [Laravelのインス

元記事を表示

Nextcloud に 私の顔認証モデルがテスト採用された

Nextcloud の顔認証アプリケーションで使用するモデルに私の Taguchi model がテスト採用されたようです。

![nextcloud-facerecognition.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785306/8a6e239e-8cfd-6b73-5114-7adcdd80f24d.jpeg)

## Nextcloud の概略
>Nextcloudは、オンラインストレージの作成と使用のためのクライアント・サーバ型のソフトウェアである。機能的にはDropboxに似ているが、オフプレミスのオンラインストレージサービスは提供しない。Nextcloudはフリーかつオープンソースなので、誰でも自分のプライベートサーバ(英語版)にインストールして利用することができる。
>Dropboxのようなプロプライエタリなサービスとは異なり、Nextcloudのようなオープンアーキテクチャではアプリケーションの形でサーバに機能を追加することができ、ユーザーがデータを完全に自身の制御下に置く

元記事を表示

ChatGPTのAPIを使用して会話をする(React、PHP)

# はじめに
今回オリジナルプロダクトの機能の一つとして、ChatGPTから五つの質問をしてもらい、その回答をChatGPTが解析することで、現在の感情を数値化してもらう。
といった機能を作成したので、そのコードを見ながら、どのように実装したかを振り返ろうと思います。

**注意**:
自分の復習と、これからAPIを使用したい人にわかりやすく伝えようとコードを載せましたが、このコードは実際に使用できてはいますが、まだデプロイもしていない段階なので、セキュリティの考慮などのリファクタリングがされていません。

そのことを念頭に置いていただければ幸いです。

# 開発環境
– LaravelにViteを使用してフロントエンドはReact
– バックエンドはPHP
– Visual Studio Code使用

# 準備
– [公式サイト](https://platform.openai.com/api-keys)を参考にしてアカウントとAPIキーを取得
– Laravelを作成して、.envファイルにAPIキーを環境変数として記述

# コード
まず最初はReactのフロントエンドから説明

元記事を表示

WordPressで検索結果から固定ページを除外する方法

WordPressで検索結果から固定ページを除外する方法について解説します。

## **functions.phpに記述するコード**

“`php
function my_posts_search($search, $wp_query) {

if ($wp_query->is_search() && $wp_query->is_main_query() && !is_admin()) {

$search .= ” AND post_type = ‘post’ “;

}

return $search;
}
add_filter(‘posts_search’, ‘my_posts_search’, 10, 2);
“`

## posts_searchフィルターフックについて

`posts_search`はWordPressの検索クエリのSQL WHERE句をカスタマイズするためのフィルターフックです。このフィルターを利用することで、デフォルトの検索機能を拡張し、特定の条件に基づいて検索結果を絞り込むことが可能になります。

`posts_search`フィルタ

元記事を表示

メールヘッダーインジェクション

## はじめに

メールヘッダーインジェクションについてまとめる。

### メールヘッダーインジェクションとは

メールヘッダーに不正なヘッダー情報を混入させることで、スパムメールなどを送信させる攻撃のこと。

### 例

以下のようなコードがあったとして、

“`php:mail_send.php
mb_send_mail(‘test@example.com’, $_POST[‘subject’], $_POST[‘body’],
“From: {$_POST[‘from’]}”);
“`

`”From: {$_POST[‘from’]}”)`の箇所に以下のような値を渡した時、

“`
test@example.com
Bcc: injection@example.com
“`

新たなBccヘッダーが認識されてしまう。
(入力値を介して、ユーザーが勝手に送付先を忍び込ませることができてしまう。)

メールヘッダーインジェクションのあるサイトは、スパムメールの踏み台にされる。

### 対策

メールアドレスの妥当性を検証する。
「`/\A\w+([-+.]\w+)*

元記事を表示

PHP 8.4の新機能の見通し

## PHP 8.4の新機能

PHP 8.4は2024年11月21日にリリースされる予定です。プロパティフック、JITの改善、追加の括弧なしでのメソッドチェーンが含まれます。これは大きな変更です!

### プロパティフックRFC

現代のPHPの歴史の中で最大の変更の一つ:プロパティフックを定義する機能。

“`php
class BookViewModel
{
public function __construct(
private array $authors,
) {}

public string $credits {
get {
return implode(‘, ‘, array_map(
fn (Author $author) => $author->name,
$this->authors,
));
}
}

public Author $mainAuthor {

元記事を表示

ディレクトリトラバーサル

## はじめに

ディレクトリバーサルについてまとめる

### ディレクトリトラバーサルとは

本来想定していたパスを遡って自由にファイルを読み書きされてしまう脆弱性のこと。

### 例

クエリ情報経由でパスを受け取る以下のコードがあったとき、

“`php:download.php
$fl = $_GET[‘path’] ?? “default.jpg”;
header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename= “‘ . $fl . ‘”‘);
print file_get_contents(“./doc/{$fl}”);
“`
ユーザーが
`http://localhost/download.php?path=../../../../apache2/conf/httpd.conf`
のようなアドレスを指定するとhttpd.confを入手できてしまう。
(`file_get_contents()`が相対パスも受け入れ可能なため)

元記事を表示

【Phalcon】期待したクエリが生成されないことがある【v4,v5】

# 概要
担当プロジェクトでPhalconのアップデートを行なっており、その際に発生した不具合の備忘録です。
issueを見つけるのに時間がかかったので、同じ現象に遭遇した方の助けになれば幸いです。
Phalconにはphqlという独自のsqlのようなものがあり、ベタ書きしたのをPhalconが用意しているparser内で変換しクエリ実行している箇所で、そんなカラムないよ!と怒られるエラーが発生していました。
parserにカラム名先頭で「not」が来ると削除されてしまうバグがあり、そのためエラーが発生していたようです。

例えば元のSQLが以下だったとします。(Modelにnoteがある前提)
“`
Select m.note From Model m.
“`
これをcreateQuery()やexecuteQuery()でparseしてしまうと…
“`
Select m.e Form Model m.
“`

当然「Column not found」でエラーになります。
2019年からあるバグのようで、未だに修正されていないようです😭
対象バージョンは4.0.0〜

G

元記事を表示

Symfony6でのルーティングの方法

# 従来のやり方
“`php
/**
*@Route(‘/hello’, name=’hello’)
*/
public function helloControler() {
return $this->render(‘/hello/hello.html.twig’,[
message => ‘Hello!’
]);
}
“`

# Symfony6でのやり方
“`diff_php
-/**
-*@Route(‘/hello’, name=’hello’)
-*/
+#[Route(‘/hello’, name:’hello’)]
public function helloControler() {
return $this->render(‘/hello/hello.html.twig’,[
message => ‘Hello!’
]);
}
“`

元記事を表示

Twitter APIでフォロー対象抽出アプリを作ったら精度が良すぎてアカウントロックされた話

昨日URLのドメインが完全にx.comになったX(旧Twitter)について、APIの有料化&厳しい制限になってしまっているので時効ということでフォロー対象を抽出するアプリを作った時のことを書こうと思います。

※まだまだ「Twitter」という名称が頭から抜けない人が多いと思いますので、この記事ではXのことをTwitterと書いています。

## フォロー対象をリストアップするアプリを作った

TwitterのAPIがまだ無料で使えた頃、フォロワーを増やすためにフォロー対象をリストアップするアプリを作りました。

やってることは単純で、ツイートについているいいねや特定のアカウントのフォロワーをうまいこと抜き出してきて画面に表示するというシンプルなアプリです。

自分からフォローするというのはTwitterに限らずSNS全般で有効なやり方で、自分のアカウントと相性がいいアカウントというのもあります。

またフォローとフォロワーの比率やフォロワー数などの特徴から「フォローが高確率で返ってくるアカウント」というのも存在します。

それらを踏まえてアプリを作りました。

### 作った機能

元記事を表示

【AtCoder】備忘録344-B

## 問題

https://atcoder.jp/contests/abc344/tasks/abc344_b

PHPで解いています。

## 解答

“`php
私は**0も含めて逆順にする**構文を書いていました。
しかし要件には**0を最初に出力し、残りを逆順に出力する**と書いてあります。
これらは一見結果が同じように見える場合もあり

元記事を表示

OTHERカテゴリの最新記事