PHP
mail関数
PHPUnit
- 公式(英語)
https://phpunit.de/ - 日本語ドキュメント
https://phpunit.readthedocs.io/ja/latest/ - PHPUnitの使い方
https://qiita.com/init/items/a4c314c330b87fa03ba1
DBUnit
- 公式リポジトリ
https://github.com/sebastianbergmann/dbunit - サポート切れらしい
https://iamapen.hatenablog.com/entry/2019/02/27/125934
https://github.com/sebastianbergmann/dbunit/issues/217
it is usually easier to implement a custom, project-specific solution for database fixture management than to use the generic solution provided by DbUnit.
- 一応、データベースのテストについて書いている章
https://phpunit-tenkoma-working.readthedocs.io/ja/latest/database/
Composer
require, include, userの違い
エンコーディング
[公式マニュアル]
- php.iniディレクティブ
- PHPの設定ファイルで使用できるオプション一覧
https://www.php.net/manual/ja/ini.core.php - mbstring拡張モジュール
→ zend.multibyte を有効にする場合に必要
https://www.php.net/manual/ja/mbstring.installation.php
- PHPの設定ファイルで使用できるオプション一覧
- マルチバイト文字列
https://www.php.net/manual/ja/book.mbstring.php - PHPの文字列リテラルについて
https://www.php.net/manual/ja/language.types.string.php#language.types.string.details
文字列のエンコードはスクリプトファイルのエンコード方式に従って行われるというのが正解です。
(途中省略)
Zend Multibyte が有効になっている場合は話が別です。 この場合は、スクリプトはどんなエンコーディングで書いてもかまいません (明示的に宣言することもできるし、自動検出させることもできます)。 スクリプトはその後で内部エンコーディングに変換されるので、 文字列リテラルも内部エンコーディングと同じ方式で符号化されます。
-
mb_convert_encoding
-
mb_detect_encoding
- 文字エンコーディングの検出
→ デフォルトは、strictがfalseなので、厳密な判定をしない場合は第3引数をtrueにすること
→ ファイルの文字エンコーディングを判定する場合は、file_get_contentsで、ファイルの内容を文字列に読み込んでから判定すること
https://www.php.net/manual/ja/function.mb-detect-encoding.php
- 文字エンコーディングの検出
-
mb_internal_encoding
- 内部文字エンコーディングの設定 or 取得
https://www.php.net/manual/ja/function.mb-internal-encoding.php
- 内部文字エンコーディングの設定 or 取得
-
mb_convert_variables
[その他]
-
内部文字エンコーディングの用途
→ HTTP入力文字エンコーディング変換, HTTP出力文字エンコーディング変換, マルチバイト文字列(mbstring)関数においてデフォルトの文字エンコーディング
https://www.gesource.jp/weblog/?p=280 -
マルチバイト文字
→ 全角文字のこと(正しくは、2バイト以上で表現する文字のこと)
https://wa3.i-3-i.info/word1809.html -
リテラル
→ ソースコードにべた書きした文字、数字
https://wa3.i-3-i.info/word15346.html -
文字コードと文字エンコードの違い
- 文字コード: 文字に割り当てられた数字 [例] 「A」に割り当てられた数字は、「65」
- 文字エンコード: コード体系 or コード体系を変更する作業 [例] UTF-8, SJIS
https://wa3.i-3-i.info/diff16moji.html
バージョンアップ対応
PHPのバージョンアップに使えるツールたち
phan
- GitHub TOP
https://github.com/phan/phan - チュートリアル
https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base
phpstan
- GitHub TOP
https://github.com/phpstan/phpstan - チュートリアル(というより使い方?)
https://phpstan.org/user-guide/getting-started
php7cc
- GitHub TOP
https://github.com/sstalle/php7cc
※こちらのツールは、すでにサポート切れしていて、代替ツールとして上記2つを使うよう記載がある
PDO
[公式] PHP Data Objects
DB接続
(1) 接続:new PDO
→ 接続に失敗した場合はPDOException オブジェクトがスローされる
(2)接続を閉じる: 変数にnullをセット
(3) オプション:
[例]持続的な接続:PDO::ATTR_PERSISTENT => true を記述
トランザクション
(1) PDO::beginTransaction: トランザクションの開始
→ トランザクションが既に開始されている場合や、ドライバがトランザクションに対応していない場合、PDOException をスロー
(2) PDO::commit: トランザクションをコミット
→ PDO::beginTransactionで新しいトランザクションが始まるまでオートコミットモードになる
→ 有効なトランザクションがない場合はPDOException をスロー
(3) PDO::rollBack: トランザクションをロールバックする
→ オートコミットモードに設定されている場合、元に戻す
→ 有効なトランザクションがない場合はPDOException をスロー
フェッチモード
(1) PDO::FETCH_NUM: キー: カラム番号
→ 出力については、PDO::FETCH_NUM 配列を使用 | PUKIWIKI 参照
(2) PDO::FETCH_ASSOC: 連想配列。キー: カラム名
(3) PDO::FETCH_OBJ : オブジェクト。プロパティ:カラム名
※よく使うのは以下4パターンらしい
①FETCH_BOTH:【配列のキー】カラム名&連番
②FETCH_ASSOC:【配列のキー】カラム名のみ
③FETCH_KEY_PAIR:指定した2つのカラムを「キー/値」のペアの配列にする
④FETCH_COLUMN:指定した1つのカラムだけを1次元配列で取得
[参考]
フェッチモードとは?PDOのfetchパターンを理解する | SENSE SHARE
Prepare & Execute
(1) 変数や値のバインドを伴うプリペアドステートメント
<?php
/* 変数や値のバインドを伴うプリペアドステートメントの実行 */
$calories = 150;
$colour = 'gre';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour LIKE :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', "%{$colour}%");
$sth->execute();
?>
(2) 入力値の配列を伴うプリペアドステートメントの実行 (名前つきパラメータ)
<?php
/* 入力値の配列を伴うプリペアドステートメントの実行 */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
?>
(3) 入力値の配列を伴うプリペアドステートメントの実行 (プレースホルダ)
<?php
/* 入力値の配列を伴うプリペアドステートメントの実行 */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array($calories, $colour));
?>
(4) 疑問符プレースホルダを伴うプリペアドステートメントの実行
<?php
/* バインド変数を伴うプリペアドステートメントの実行 */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
(5) IN 句で配列を使うプリペアドステートメントの実行
<?php
/* IN 句で配列を使うプリペアドステートメントの実行 */
$params = array(1, 21, 63, 171);
/* パラメータのプレースホルダ用の文字列を、パラメータ数に合わせて作ります */
$place_holders = implode(',', array_fill(0, count($params), '?'));
$sth = $dbh->prepare("SELECT id, name FROM contacts WHERE id IN ($place_holders)");
$sth->execute($params);
?>
エラー情報の取得
MDB2
[公式]pear MDB2
DB接続
(1) 接続: MDB2::factory, MDB2::connect, MDB2::singleton
→ 接続エラーの判定には PEAR::isError($mdb2) を用いる
(2) 接続を閉じる: $mdb2->disconnect()
(3) オプション: 同ページ内に記載あり
トランザクション
(1) $mdb2->beginTransaction(): トランザクションの開始
→ トランザクションサポートの有無の確認には、PEAR::isError($mdb2)を用いる
(2) $mdb2->commit():トランザクションのコミット
(3) $mdb2->rollback(): トランザクションのロールバック
フェッチモード
(1) MDB2_FETCHMODE_ORDERED: 規則配列。キー:カラム番号(デフォルトの設定値)
(2) MDB2_FETCHMODE_ASSOC: 連想配列。キー:カラム名
(3) MDB2_FETCHMODE_OBJECT: オブジェクト。 プロパティ―:カラム名
Prepare & Execute
※Quoting and escaping も参照のこと
(1) Individually choose the values to be quoted
<?php
$query = 'INSERT INTO sometable (textfield1, boolfield2, datefield3) VALUES ('
.$mdb2->quote($val1, "text", true).', '
.$mdb2->quote($val2, "boolean", false).', '
.$mdb2->quote($val3, "date", true).')';
$res =& $mdb2->exec($query);
?>
(2) Passing an array to execute() with named placeholder
<?php
// Once you have a valid MDB2 object named $mdb2...
$types = array('integer', 'text', 'text');
$sth = $mdb2->prepare('INSERT INTO numbers VALUES (:id, :name, :lang)', $types);
$data = array('id' => 1, 'name' => 'one', 'lang' => 'en');
$affectedRows = $sth->execute($data);
?>
(3) Passing an array to execute() with placeholder
<?php
// Once you have a valid MDB2 object named $mdb2...
$types = array('integer', 'text', 'text');
$sth = $mdb2->prepare('INSERT INTO numbers VALUES (?, ?, ?)', $types, MDB2_PREPARE_MANIP);
$data = array(1, 'one', 'en');
$affectedRows = $sth->execute($data);
?>
(4)
(5)
※prepareの第三引数に指定するパラメータ
(1) MDB2_PREPARE_MANIP: DMLステートメントの場合
(2) MDB2_PREPARE_RESULT: データ読み取り
エラー情報の取得
-
PEAR_Error
→ 非推奨(deprecated)の記載あり
phpDocumentor
[公式]phpDocumentor
PHPOffice
PHPExcel とPHPSpreadsheetの比較
- いずれもPHP Officeシリーズのひとつ
PHPExcel
-
現在、メンテナンスされていない
→ 2017年に使用非推奨となり、2019年にアーカイブされた -
PHP5.2~PHP5.6くらいまでは対応しているとみられる
→ changelog.txtとPHPのリリース履歴参照
PHPSpreadsheet
-
PHPExcelの後継で、Excelファイルの操作も可能
-
PHP7.3以上必要(正確には、EOLから半年以内のバージョン以上)
[EOLのバージョン一覧]
https://www.php.net/eol.php
→ PHPSpreadsheet側の対応状況にもよるが、最新の安定板の使用が望ましいと考えられる(2022年1月17日現在、PHP8.1.1が最新でPHPSpreadsheetのコミット履歴でも対応済)
https://www.php.net/downloads.php
参考になった記事
PHPExcelを使う必要のある場合
- 動作環境のPHPのバージョンが5系の場合
→ PHPSpreadsheetへのリプレイスを加味した実装にするとよし!
PHPExcel よりPhpSpreadsheetのほうがいけてない点と対処法
(1) テンプレートの埋め込み関数が計算されない
[対処法]キャッシュをフラッシュもしくは無効化する
[関連ページ]
(2) xlsxテンプレートの背景色が維持されない
[対処法]なし?(少なくともFeatures cross referenceではサポート対象にチェックがついていない)
[関連ページ]
foreachと値の書き換え
PHPのバージョンについて
-
stableの最新版とダウンロード
https://www.php.net/downloads.php -
現サポートバージョンと各種期限
https://www.php.net/supported-versions.php -
すでにEOLを迎えているバージョン
https://www.php.net/eol.php
Debian系へのPHPのインストール
- ライブラリを提供しているメジャーどころ(?)
https://deb.sury.org/ - PHP8.1.1のインストールは以下を参照
https://www.cloudbooklet.com/how-to-install-or-upgrade-php-8-1-on-ubuntu-20-04/
FPM
PHPでWeb API
1. PHPでWeb APIを呼び出す
(1) file_get_contents を使う
(2) curlを使う
(3)file_get_contents vs curl
・file_get_contentsのほうが手軽
・curlのほうが速い? ・file_get_contentsだとセキュリティの問題で通信できない場合がある2. PHPでWeb APIを作成する
(1) リクエストの受け取り
・$_POST[], $GET[]など
※1: GETとPOSTの使い分け
※2: POST×配列で送信する
※3: POST×JSONで送信する
※4: POSTのJSONデータを受け取るには、file_get_contents("php://input")を使う
(2) 値の返却
・echo
→ 表示させる方法には、printもあるが、引数をひとつしか取れないので、echoにすべし!
PhpSpreadsheet
-
PHPのインストール
・以下参照(CentOS7にRemiでPHP8系をインストールする場合)
https://qiita.com/C_HERO/items/1512ba1e33c330c9ab0d -
composerのインストール
# PhpSpreadSheetのライブラリ用のディレクトリを作成し、そこにインストール
$ mkdir phpspreadsheet && cd phpspreadsheet
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
# 1系は非推奨なので、2系にアップグレードする
$ composer self-update
[参考]
3. PhpSpreadsheetのインストール# 上記に続いて実施
$ composer require phpoffice/phpspreadsheet
$ composer config platform.php 7.2.34 # 動作環境のPHPのバージョンを設定(左記は7.2.34の場合)
$ composer install
[参考]
Basic認証を突破する
file_get_contentsを使う