Closed18

PHP

ChiHaRuChiHaRu

PHPUnit

DBUnit

it is usually easier to implement a custom, project-specific solution for database fixture management than to use the generic solution provided by DbUnit.

ChiHaRuChiHaRu

エンコーディング

[公式マニュアル]

文字列のエンコードはスクリプトファイルのエンコード方式に従って行われるというのが正解です。
(途中省略)
Zend Multibyte が有効になっている場合は話が別です。 この場合は、スクリプトはどんなエンコーディングで書いてもかまいません (明示的に宣言することもできるし、自動検出させることもできます)。 スクリプトはその後で内部エンコーディングに変換されるので、 文字列リテラルも内部エンコーディングと同じ方式で符号化されます。

[その他]

  • 内部文字エンコーディングの用途
    → 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
ChiHaRuChiHaRu

バージョンアップ対応

PHPのバージョンアップに使えるツールたち

phan

phpstan

php7cc

  • GitHub TOP
    https://github.com/sstalle/php7cc
    ※こちらのツールは、すでにサポート切れしていて、代替ツールとして上記2つを使うよう記載がある
ChiHaRuChiHaRu

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);
?>

エラー情報の取得

ChiHaRuChiHaRu

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)の記載あり
ChiHaRuChiHaRu

PHPOffice

https://github.com/PHPOffice

PHPExcel とPHPSpreadsheetの比較

PHPExcel

  • 現在、メンテナンスされていない
    → 2017年に使用非推奨となり、2019年にアーカイブされた

  • PHP5.2~PHP5.6くらいまでは対応しているとみられる
    changelog.txtPHPのリリース履歴参照

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

参考になった記事

https://vertys.net/php-spreadsheet-often-use-process/
http://vbnettips.blog.shinobi.jp/php/php phpspreadsheet エクセルのワー_209

PHPExcelを使う必要のある場合

  • 動作環境のPHPのバージョンが5系の場合
    → PHPSpreadsheetへのリプレイスを加味した実装にするとよし!

PHPExcel よりPhpSpreadsheetのほうがいけてない点と対処法

(1) テンプレートの埋め込み関数が計算されない

[対処法]キャッシュをフラッシュもしくは無効化する
[関連ページ]
https://github.com/PHPOffice/PhpSpreadsheet/issues/2693
https://phpspreadsheet.readthedocs.io/en/latest/topics/calculation-engine/#calculation-cache

(2) xlsxテンプレートの背景色が維持されない

[対処法]なし?(少なくともFeatures cross referenceではサポート対象にチェックがついていない)
[関連ページ]
https://github.com/PHPOffice/PhpSpreadsheet/issues/2565
https://phpspreadsheet.readthedocs.io/en/latest/references/features-cross-reference/#features-cross-reference

ChiHaRuChiHaRu

PHPでWeb API

1. PHPでWeb APIを呼び出す

(1) file_get_contents を使う

https://laraweb.net/surrounding/9720/
https://boccitabi.com/php-jikkou-server/

(2) curlを使う

https://qiita.com/ryo-futebol/items/6bdf503599a7c44b2f97

(3)file_get_contents vs curl

・file_get_contentsのほうが手軽
https://ja.stackoverflow.com/questions/25190/file-get-contentsとcurlとhttprequestの違いについて
・curlのほうが速い?
https://blog.ver001.com/file_get_contents_curl/
・file_get_contentsだとセキュリティの問題で通信できない場合がある
http://wsd.zombie.jp/gw/php_curl_file_get_contents/

2. PHPでWeb APIを作成する

(1) リクエストの受け取り

・$_POST[], $GET[]など
https://pisuke-code.com/php-send-response-immediately/

※1: GETとPOSTの使い分け
https://blog.senseshare.jp/get-post-method.html

※2: POST×配列で送信する
https://salumarine.com/do-http-post-in-php-with-curl/

※3: POST×JSONで送信する
https://tech.mktime.com/entry/504

※4: POSTのJSONデータを受け取るには、file_get_contents("php://input")を使う
https://qiita.com/hidepy/items/42220523cb2b3eb2c451

(2) 値の返却

・echo
https://qiita.com/mizumizue/items/ebea22c7ac7ae0056b1f
https://pisuke-code.com/php-send-response-immediately/

→ 表示させる方法には、printもあるが、引数をひとつしか取れないので、echoにすべし!
https://qiita.com/tadsan/items/e09475093bc336881b20

ChiHaRuChiHaRu

PhpSpreadsheet

  1. PHPのインストール
    ・以下参照(CentOS7にRemiでPHP8系をインストールする場合)
    https://qiita.com/C_HERO/items/1512ba1e33c330c9ab0d

  2. 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

[参考]
https://getcomposer.org/download/
3. PhpSpreadsheetのインストール

# 上記に続いて実施
$ composer require phpoffice/phpspreadsheet
$ composer config platform.php 7.2.34 # 動作環境のPHPのバージョンを設定(左記は7.2.34の場合)
$ composer install

[参考]
https://github.com/PHPOffice/PhpSpreadsheet/blob/master/docs/index.md

このスクラップは2021/03/09にクローズされました