- 投稿日:2020-05-28T23:39:35+09:00
Xamppの初期設定
Xamppの初期設定について紹介します。
作業環境
OS:Windows 10
エディション:HOME
バージョン:2004
Xampp:バージョン7.4.6※Xamppのインストール方法はこちらで解説しています。
【環境構築】Windows10にXAMMPをインストールする方法php.iniの設定を変更する
「Cドライブ」→「xampp」→「php」を開きます。設定を変更する前に「php.ini」をコピーして、「php.ini.org」などと書いてバックアップをしておきます。1.日本語化けを防ぐ
「php.ini」を開きます。
「mbstring.substitute_character」
「mbstring.substitute_character」で検索すると、下記のような記述が見つかります。
php.ini; substitute_character used when character cannot be converted ; one from another ; http://php.net/mbstring.substitute-character ;mbstring.substitute_character = none
「mbstring.substitute_character」は無効な文字があった場合に代わりに表示する文字を指定します。今回はデフォルトの値のまま無効な文字は何も表示しない設定の「none」としておきます。
一番下の行はコメントがついて無効になっているので、下記のようにコメントアウトして、無効な文字は何も表示しない設定に変更します。
php.inimbstring.substitute_character = none「mbstring.func_overload」
「mbstring.func_overload」で検索すると、下記のような記述が見つかります。
php.ini; overload(replace) single byte functions by mbstring functions. ; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), ; etc. Possible values are 0,1,2,4 or combination of them. ; For example, 7 for overload everything. ; 0: No overload ; 1: Overload mail() function ; 2: Overload str*() functions ; 4: Overload ereg*() functions ; http://php.net/mbstring.func-overload ; mbstring.func_overload = 0
「mbstring.func_overload」はシングルバイト対応の関数をマルチバイト対応の関数でオーバーロードするどうかの設定です。自動でオーバーロードされると予期せぬ不具合が発生することもありますのでオーバーロードしない「0」としておきます。
先程と同様に、一番下の行はコメントついて無効になっているので、下記のようにコメントアウトして、オーバーロードをしない設定に変更します。
php.inimbstring.func_overload = 02.「Notice」のエラーを非表示にする
PHPのエラーには色々ありますが、「Notice」は「通知」という意味の英単語で、あまり重要ではないエラーです。「Notice」のエラー表示が出ると不便なので、表示をオフにします。
「error_reporting」と検索すると、下の行が見つかります。php.inierror_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICTこの行を以下のように変更すると、「Notice」のエラーが非表示になります。
php.inierror_reporting=E_ALL & ~E_NOTICE & ~E_STRICTMySQLのパスワードを設定する
Xamppはデフォルトだとパスワードが設定されていないので、パスワードを設定します。
1.phpMyAdminでパスワードを設定する
Xamppを起動し、「Apache」と「MySQL」を起動し、「MySQL」の横の「Admin」を選びます。
「MySQL」が起動するので、「ユーザーアカウント」を選びます。
「'root'@'localhost' のパスワードは正しく変更されました。」と表示されれば、パスワードの設定が完了です。
Xamppを再起動し、「Apache」と「MySQL」を起動し、「MySQL」の横の「Admin」を選ぶと、以下の画面が表示され、パスワードが設定できたことが確認できます。2.「config.inc.php」にパスワードを追記
「Apache」→「Config」→「phpMyAdmin(config.inc.php)」を選びます。
上記の部分に先程設定したパスワードを追記します。
「Apache」と「MySQL」を起動し、「MySQL」の横の「Admin」を選ぶと、以下の画面が表示され、ログインできるようになります。
以上、Xamppの初期設定についてご紹介しました。
参考サイト
- 投稿日:2020-05-28T20:44:25+09:00
Trelloのラベリング機能を自動化した[PHP7.3, Trello REST API, cron]
新型コロナウイルスの影響でリモート化した大学の講義の管理をTrelloで行っていたのだが、どうしても自動化した方がいいと思う部分があったので、自動化した。
前までの僕のリモート講義管理方法
①
大学
という名前のボードを作成。
②月
~金
という名前のリストを作る。
③その内部で、それぞれの曜日にある授業の講義名のカードを作り、
④受けないといけない講義動画が配信されているのが確認されたら、該当カードに赤色のラベルを貼る。
⑤講義を受け、提出物を提出した後、赤ラベルを消すという管理方法をとっていた。
どこを自動化するか
上記 ④ の、受けないといけない講義動画が配信されているのが確認されたら、該当カードに赤色のラベルを貼る。
という部分は、動画が配信される時間は決まっていたので、該当時間に自動で赤ラベルを貼ってくれるようにできそうだなと思った。実装の流れ
①Trello Developer APIのキーとトークンを取得する
②Trello developer公式ドキュメントを参考に実装
③ ② で作成したファイルを該当時間に実行されるようcrontabを設定①Trello Developer APIのキーとトークンを取得する
まず、ブラウザ上でtrelloをログイン状態にする。
↓のURLに飛ぶと、一番上にKeyが表示される。
https://trello.com/app-key
また、Keyのちょうど下にTokenが取得できるurlリンクがあるのでそこをクリックすると、tokenが発行される。
これらのkeyとtokenをメモ。②Trello developer公式ドキュメントを参考に実装
Trello developer公式ドキュメントに色々載ってるのでこれを参考に実装していく。
ファイル構成
ファイル構成はこんな感じにした。
├── mondayExec.php //月曜日に実行する処理 ├── tuesdayExec.php //火曜日 ├── wednesdayExec.php //水曜日 ├── thursdayExec.php //木曜日 ├── fridayExec.php //金曜日 ├── trelloAutomationController.php //実行処理全般 └── trelloInfoConstant.php //ここにkey、token,対象ボード名など固定情報記載する(曜日毎の処理はまとめられそうだけど、また今度やる。。)
固定情報
trelloInfoConstant.php<?php class TrelloInfoConstant { public $baseUrl = 'https://api.trello.com/1'; #①で取得したkey,token public $key = ''; public $token = ''; #適用させるボード名の指定 public $boardName = '大学'; #(例) }処理全般
trelloAutomationController.php<?php require("/path/to/trelloInfoConstant.php"); #trelloInfoConstant.phpへのパス class trelloAutomation extends TrelloInfoConstant { /** * curlの共通実行部分の関数科 * * @param string $curl * @param string $parameter * @return string */ public function execCurlProcess($curl, $parameter){ curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $parameter); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); #証明書の検証を行わない curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); #curl_execの結果を文字列で返す return curl_exec($curl);; } /** * 特定のボードのboardIdの取得 * 取得できない場合はfalseを返す。 * * @return string|bool */ public function getBoardIdByBoardName(){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->baseUrl. '/members/me/boards?key=' . $this->key . '&token=' . $this->token); $response = $this->execCurlProcess($curl, 'GET'); $boardsInfo = json_decode($response, true); curl_close($curl); foreach ($boardsInfo as $board) { if ($board['name'] == $this->boardName) { return $board['id']; } } return false; } /** * 特定のリストのlistIdの取得 * 取得できない場合はfalseを返す。 * * @param string $boardId * @param string $dayOfTheWeek * @return string|bool */ public function getListIdByBoardId($boardId, $dayOfTheWeek) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->baseUrl. '/boards/' . $boardId . '/lists?key=' . $this->key . '&token=' . $this->token); $response = $this->execCurlProcess($curl, 'GET'); $listsInfo = json_decode($response, true); curl_close($curl); #特定のリストのid取得 foreach ($listsInfo as $key => $list) { if ($list['name'] == $dayOfTheWeek) { return $list['id']; } } return false; } /** * 特定のリスト内の全カード情報の取得 * 取得できない場合はfalseを返す。 * * @param string $listId * @return array|bool */ public function getCardsInfoByListId($listId){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->baseUrl. '/lists/' . $listId . '/cards?key=' . $this->key . '&token=' . $this->token); $response = $this->execCurlProcess($curl, 'GET'); curl_close($curl); return json_decode($response, true); } /** * 特定のリスト内の全カードへのラベリング実行 * * @param array $cardInfo * @param string $color */ public function execLabelingToCardsInList($cardsInfo, $color) { foreach ($cardsInfo as $card) { $cardId = $card['id']; $color = $color; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->baseUrl. '/cards/' . $cardId . '/labels?color=' . $color . '&key=' . $this->key . '&token=' . $this->token); $response = $this->execCurlProcess($curl, 'POST'); $result = json_decode($response, true); curl_close($curl); var_dump($result); } } }月曜日に実行する処理
mondayExec.php<?php require("/path/to/trelloAutomationController.php"); #trelloAutomationController.phpへのパス class MondayExec extends trelloAutomation { } $mondayExec = new MondayExec; $boardId = $mondayExec->getBoardIdByBoardName(); #boardId取得 if ($boardId) echo "could not find boardId"; exit; $listId = $mondayExec->getListIdByBoardId($boardId, '月'); #特定のリストId取得 if ($listdId) echo "could not find listId"; exit; $cardsInfo = $mondayExec->getCardsInfoByListId($listId); #リスト内のカード情報取得 if ($cardsInfo) echo "could not find cardsInfo"; exit; $mondayExec->execLabelingToCardsInList($cardsInfo, 'red');#ラベリング実行第二引数でラベルの色指定火曜以下省略。
③ ② で作成したファイルを該当時間に実行されるようcrontabを設定
毎週授業がある曜日の朝9時に特定ファイルが実行されるように設定。
1.crontabを開く
$crontab -e以下のように設定する。
#0 9 * * 1 php /path/to/mondayExec.php #mondayExec.phpへの絶対パス(以下同様) #0 9 * * 3 php /path/to/wednesdayExec.php #0 9 * * 4 php /path/to/thursdayExec.php #0 9 * * 5 php /path/to/fridayExec.phpcronの設定方法に関しての詳細はここでは省略させてもらいますが、
簡単に説明すると、#0 9 * * 1 php /path/to/mondayExec.php上記の一行は、
0 9 * * 1
この時刻に、php /path/to/mondayExec.php
これを実行するという意味合いがあります。
0 9 * * 1
は分 時 日 月 曜
の順番にならんでおり、
-> 曜日は1 2 3 4 5 6 7 0
の順で月 火 水 木 金 土 日 日
となっています。つまり上記の一文の場合、毎週9時に、/path/to/mondayExec.phpを実行するということです。
くわしくはこのへんに載っているのでもっと詳しく知りたい方は見てみてください。
一応これで毎週手動で行っていたラベル付けを自動化することができました。
最後に
この記事で紹介したものをgithubでも公開しています。
省略している部分も全て記載しているので参考にしてくださるとありがたいです。
https://github.com/Naoki206/trelloAutomation
- 投稿日:2020-05-28T20:40:07+09:00
php.iniの上限値をなくす
- 投稿日:2020-05-28T20:11:28+09:00
CentOS7にComposerをインストールしよう
はじめに
PHPにはComposerが必須だとのことなので、インストールすることにしました。
前提
過去記事のWindows10にVagrantをを入れてCentOS7をインストールしよう(1、2、3、4、5、6)、
ローカルでLAMP環境を構築しよう(0、1、2、3、4)で構築した環境を前提とします。使用ツール
- Tera Term
Composerとは?
Composerとは、PHPのパッケージ管理システムのこと。
必要なパッケージをコマンド一つでインストールしてくれる便利アイテム。方法は3種類
1. 公式インストール手順
Composer公式のCommand-line installationのコードを実行する方法です。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');"解説
各行でやっていることを簡単に説明します
カレントディレクトリにインストーラーをダウンロード。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"インストーラーが
SHA-384
か確認。
たぶん最新版かどうかみたいな話のような気がするので、
この行はバージョンアップとかの際に変わるのかもしれませんね。php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"インストーラーを実行。
php composer-setup.phpインストーラーを削除。
php -r "unlink('composer-setup.php');"2. 簡易版
上記の公式のインストール手順と同内容を下記コマンドで実行することができます。
こっちのほうが簡単かも?curl -sS https://getcomposer.org/installer | php解説
①
curl
コマンド
HTTPアクセスをしてコンテンツを取得できるコマンド。
https://getcomposer.org/installer からインストーラーを取得しています。
②-s
オプション
ダウンロードの進捗とエラーメッセージを表示しないためのオプションです。
③-S
オプション
-s
オプションと併用することで、エラーメッセージを表示することができます。
-s
オプションのみの使用だと、エラーメッセージが表示されません。
④|(パイプ)
|(パイプ)
とはコマンドの標準出力を次のコマンドに渡す処理のことです。
curl
コマンドで取得したインストーラーをphpコマンドで実行する...ということになるでしょうか。3. yumを用いたインストール手順
コメントで@ABE_TAKASHIさんにアドバイスいただいた方法です。
yum --enablerepo=remi install composer
を使用すると便利とのことで調べてみました。そのまま実行すると、エラーが出てしまいました。
Error: Package: php-process-5.4.45-18.el7.remi.x86_64 (remi) Requires: php-common(x86-64) = 5.4.45-18.el7.remi Installed: php-common-7.1.33-8.el7.remi.x86_64 (@remi-php71) php-common(x86-64) = 7.1.33-8.el7.remi Available: php-common-5.4.16-48.el7.x86_64 (base) php-common(x86-64) = 5.4.16-48.el7 Available: php-common-5.4.45-18.el7.remi.x86_64 (remi) php-common(x86-64) = 5.4.45-18.el7.remi Error: Package: php-pecl-zip-1.18.2-1.el7.remi.5.4.x86_64 (remi) Requires: php(api) = 20100412-64 Installed: php-common-7.1.33-8.el7.remi.x86_64 (@remi-php71) php(api) = 20160303-64 Available: php-common-5.4.16-48.el7.x86_64 (base) php(api) = 20100412-64 Available: php-common-5.4.45-18.el7.remi.x86_64 (remi) php(api) = 20100412-64 Error: Package: php-pecl-zip-1.18.2-1.el7.remi.5.4.x86_64 (remi) Requires: php(zend-abi) = 20100525-64 Installed: php-common-7.1.33-8.el7.remi.x86_64 (@remi-php71) php(zend-abi) = 20160303-64 Available: php-common-5.4.16-48.el7.x86_64 (base) php(zend-abi) = 20100525-64 Available: php-common-5.4.45-18.el7.remi.x86_64 (remi) php(zend-abi) = 20100525-64 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest調べてみると、上記ではphpのバージョンを指定していなかったこと、
php-pecl-zipがインストールされていないことで起こったエラーのようです。
以下のコマンドに修正して実行すると、無事インストールが完了しました。sudo yum install --enablerepo=remi,remi-php71 php-pecl-zip composerComposerをどこからでも使えるようにしよう
Slimフレームワークの使い方を知りたくてFirst Application Walkthroughを読んでいると、
プロジェクトのsrcフォルダにComposerをインストールしろと書いてあります。
zipとかのコマンドと違って、1つのサーバーにいくつもプロジェクトがある場合、
プロジェクトごとにこの作業を行わないといけないんでしょうか。なぜ上記サイトではそうしろと書いてあるかはわかりませんが、
調べてみると、Linuxでは、"/bin/" や "/usr/bin/" などのディレクトリに
「その中の実行ファイルを任意のディレクトリから パス の指定なしに実行できる。」
という許可が与えられているため、
/usr/local/bin
フォルダにComposerの実行ファイルcomposer.phar
を移動させれば、
どのディレクトリからでもComposerを使用することができるようです。下記コマンドで、パスを通しましょう。
sudo mv composer.phar /usr/local/bin/composerComposerのインストール確認は以下のコマンドで可能です。
composer -vちなみに、3. yumを用いたインストール手順では、パスを通す作業は不要のようです。
以下のコマンドで実行ファイルcomposer.phar
を探しても見つからなかったのですが、
インストール確認コマンドをしたらバージョンが表示されました。find / -name composer.pharあと、rootユーザーでインストール確認コマンドを実行すると、
Do not run Composeras root/sper user!...
と表示されて怒られてしまうので、
ローカルユーザーで実行したほうが良いようです。参考サイト
Download Composer
hydroculのメモ > コマンドの使い方(Linux) > curl コマンド
パイプ「|」を使って 複数のコマンドを組み合わせる
CentOSにcomposerをインストールする方法
"パスが通っている"とは
CentOS7環境でLaravelを構築する関連ページ
Windows10にVagrantをを入れてCentOS7をインストールしよう
1. VagrantインストールからVagrantfileを設置まで
2. 仮想マシンの操作
3. WinSCP、Tera Termに秘密鍵でログイン
4. WinSCP、Tera Termにrootユーザーでパスワードログイン
5. zip/unzipをインストール
6. Vagrantにて仮想環境を配布ローカルでLAMP環境を構築しよう
0. 事前準備
1. Apacheをインストール
2. MySQLをインストール
3. PHPをインストール
4. ファイアウォールとか停止する
- 投稿日:2020-05-28T18:26:12+09:00
CentOS8 + Apache2.4.37 + php7.2(php-fpm) で HTML ファイルの中で PHP を実行する
Apache と PHP のインストール
# yum install httpd php
Apache と PHP の起動と自動起動の設定
# systemctl start httpd # systemctl enable httpd # systemctl start php-fpm # systemctl enable php-fpmPHP の設定変更
# vi /etc/php-fpm.d/www.conf
security.limit_extensions のコメントアウトを外し、末尾に .html を追加する。
# vi /etc/httpd/conf.d/php.conf <FilesMatch \.(php|phar)$> を <FilesMatch \.(php|phar|html)$> のようにファイルの種類に html を追加する。各サービスを再起動する
# systemctl restart httpd # systemctl restart php-fpm
- 投稿日:2020-05-28T15:31:13+09:00
MockeryのandThrowの引数について学んだ
概要
前回の記事で紹介しましたが、テストコードでモックを使う際は、Mockeryを使ってます。
開発を進めて、学んだことがあったのでここに残します。TL;DR
- MockeryのandThrowは第一引数がインスタンスか例外クラスで切り分け
- 第一引数が例外クラスのときは、例外クラスがメッセージ、コードの順じゃないとエラーになる
- etc
AccessDeniedHttpException
本編
やっていたのはLaravelプロジェクトのテスト作成です。
下記のようにクラスの返り値がAccessDeniedHttpException
でときのものです。他の例外と同様に書いていました。
<?php use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Tests\TestCase; use Mockery; class HogeTest extend TestCase { public function testHoge($id) { // setup $this->app->bind(fugaRepositoryInterface::class, function () use ($id)) { $mock = Mockery::mock(fugaRepository::class); $mock->shouldReceive('何かしら') ->once() ->with($id) ->andThrow(AccessDeniedHttpException::class, $message, $code); return $mock; }); // exercise $hogeService = resolve(hogeServiceInterface::class); // verify $actual = $hogeService->hoge($id); $this->assertTrue($actual); } }Type error: Argument 2 passed to Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException::__construct() must be an instance of Exception or null, int given, called in mockery/mockery/library/Mockery/Expectation.php on line 607原因を探るべく、andTrowのコードを見てみました。
下記のように第一引数によって処理を分け、
andReturn
に渡していることがわかります。
先程の例の場合は、else
文を通るので、$message, $code, $previous
の順で渡してインスタンスを生成します。public function andThrow($exception, $message = '', $code = 0, \Exception $previous = null) { $this->_throw = true; if (is_object($exception)) { $this->andReturn($exception); } else { $this->andReturn(new $exception($message, $code, $previous)); } return $this; }次に
AccessDeniedHttpException
のコードをみてみます。
コンストラクタで$message, $previous, $code
の順で受け取っており、andThrow
で渡している引数と順番が違うことがわかります。そのため、エラーになったというわけですね。
class AccessDeniedHttpException extends HttpException { /** * @param string $message The internal exception message * @param \Exception $previous The previous exception * @param int $code The internal exception code */ public function __construct($message = null, \Exception $previous = null, $code = 0) { parent::__construct(403, $message, $previous, [], $code); } }こういったケースで
andThrow
を使うなら、例外インスタンスを生成して渡した方が良さそうですね。andThrow(new AccessDeniedHttpException($message, null, $code));まとめ
MockeryのandThrowは第一引数がインスタンスか例外クラスで切り分けしており、第一引数が例外クラスのときは、例外クラスがメッセージ、コードの順じゃないとエラーになるということがわかりました。
etcAccessDeniedHttpException
また
andThrow
は内部でandReturn
を呼んでいることも知れてよかったです。
- 投稿日:2020-05-28T14:48:08+09:00
学習記録 PHP#4(RDBMSとMySQLの基礎)
RDBMSとMySQLの基礎
RDBMSについて
RDBMS
- RDBMS:Relational Data Base Management System oracle,MySQL,Access,DB2,SQLserverなど... PDO:PHP Data Object PHPでのRDBMS操作のクラス群
RDBMSの構成要素
- テーブル データを記録するもの。データベースの本体。
- エンジン データの処理機能。検索、集計、並べ替え、更新、削除、追加、ロックなどはエンジンに集約。 ユーザーやプログラムがエンジンに指示を出し、エンジンが処理をしてデータをユーザーやプログラムに返す。
RDBMSとSQL
- SQL:データベースに対する指示命令方法の統一規格 SQLコマンド:SQL規格で作られた指示命令系統 RDBMSはどの製品を使用してもSQLコマンドで動かされる。
RDBMSの基本概念
RDBMSの基本概念
- テーブルは切り分ける
- 必要に応じて、テーブル同士を結合する ###テーブルを切り分けるメリット
- データ入力の効率化
- データ検索・集計の効率化
- 保守・メンテナンスの効率化
- データ容量の削減 結合(リレーションシップ):テーブル同士を繋ぐテーブル結合でデータの入力・集計を効率化。
テーブルの構造と用語
フィールドとレコード
- フィールド:列
- レコード:行
データ型
- フィールドに格納するデータの種類を決めるもの 整数型、実数型、文字列型etc...
主キーと外部キー
- 主キー レコードを一件ずつ確実に区別するための目印 主キーのフィールドには重複する値が入力できず、未入力(Null)もNG。
- 外部キー 他のテーブルの主キーが入るフィールド リレーションシップでは主キーと外部キーのフィールド同士を結合。
MySQLの概要
LAMP
- Linux(OS)
- Apache(Webサーバー)
- MySQL(データベース)
- PHP(プログラミング言語)
MySQLの特徴
- 機能数が他のデータベース製品と比べて少ない
- 機能数が少ない分、高速に動作する
Webアプリ:シンプルな処理を効率的かつ高速に動かしたい
→MySQLとの相性が良い。
- 投稿日:2020-05-28T13:54:15+09:00
【PHP】wordのドキュメントファイルを読み込む
PHPでWEBシステム制作の案件を処理していると、まれにwordのドキュメントファイルを読み込まないといけないという案件があったりします。ですが、Wordのドキュメントファイルに書き込むことを前提としたPHP-wordの使用方法はちらほら出てくるのですが、あくまでPHP上のデータをWord上に書き込むだけであり、逆にWordのドキュメントファイルを読み込むという方法がなかなか出てきません。
そこで、色々と検索ワードを考えて海外サイトも含め巡回した成果を記録していきたいと思います。
Wordのdocxファイルを読み込む
docxファイルはWord2007から主流となっている、XMLを使用したファイルです。なので、PHPでXMLを読み込めるように対処すれば普通に読み込めてしまったりします。
これは、自分が公開しているPhpspreadsheetに関する記事ですが、こちらもxlsxファイルを読み込むためにphp-zipとlibzip5ライブラリをインストールしているので、今度の場合もdocxファイルを読み込むために同じライブラリをインストールしておきます。
/*PHP7.1以前はこちら*/ hogehoge$ yum --enablerepo=remi-phpxx -y install php-zip libzip5 /*PHP7.2以降はこちら*/ hogehoge$ yum --enablerepo=remi-phpxx -y install php-pecl-zip libzip5 hogehoge$ systemctl restart httpd //Apacheの場合、Nginxならhttpdをnginxに書き替える hogehoge$ php --ri zip//zip関連のアーカイブがインストールされているか確認 /*このように表示されていれば確実*/ zip Zip => enabled Zip version => x.x.x Libzip headers version => x.x.x Libzip library version => x.x.xdocxファイルを読み込む
あとはZipArchiveクラスを用いるだけです。
PHP$filename = "test.docx"; //対象となるdocxファイル $zip = zip_open($filename); $content = ""; if ($zip && !is_numeric($zip)){ while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry) == FALSE) continue; if (zip_entry_name($zip_entry) != "word/document.xml") continue; $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); zip_entry_close($zip_entry); } } zip_close($zip); $content = preg_replace("/\<\/w:t\>/","<br>",$content); //改行にあたる部分だけを置き換える echo $content;これで後はブラウザに表示するだけです。ただ、元のソースのままだと改行が行われなかったので、改行が行われるように修正を加えています。また、ソースを見るとまだまだ無駄なタグがあるので、それを必要に応じて置換するといいでしょう。
参考にしたページ
How to extract text from word file .doc,docx,.xlsx,.pptx php
Wordのdocファイルを読み込む
docファイルはマイクロソフト社が独自で開発した規格のため、かなりの人が処理に悪戦苦闘しているようですが、実はfile関数を使って開くことができるようです。ですが、そこからのエンコードに苦戦しているようで、いろいろなサイトで方法を公開していますが、的確に処理できていた記述は上記のリンクにあった方法だけでした。
PHP$filename = "test.doc"; //テスト用のドキュメントファイル if(file_exists($filename)){ if(($fh = fopen($filename, 'r')) !== false ){ $headers = fread($fh, 0xA00); // 1 = (ord(n)*1) ; Document has from 0 to 255 characters $n1 = ( ord($headers[0x21C]) - 1 ); // 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters $n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 ); // 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters $n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 ); // 1 = (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters $n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 ); // Total length of text in the document $textLength = ($n1 + $n2 + $n3 + $n4); $text = fread($fh, $textLength); nl2br($text); $text = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/',"",$text); //制御記号を置換 echo $text; } }ただ、それだけだと制御文字まで表示されてしまっていたので、置換処理を施しています。
※あくまでStack Overflowでの記事なので、日本語までは対応していません。いちおう文字化けした状態では出力されるのですが、エンコードができずに苦戦しています。もし、解決方法をご存知の方はアンサーをいただけると大変助かります。
Apace POIを使用する方法もあるようですが、そもそもどうやってcentOS7にインストールしたらいいのかが詰まっており、しかも、そこからPHPと連携する方法、docファイルを取得する方法がわかっていませんし、日本語を取得できるのかもわかりませんが、業務の合間を見て分析を続けていきたいところです。
- 投稿日:2020-05-28T13:54:15+09:00
【PHP】プログラムからMS Wordのドキュメントファイルを読み込む
PHPでWEBシステム制作の案件を処理していると、まれにwordのドキュメントファイルを読み込まないといけないという案件があったりします。ですが、Wordのドキュメントファイルに書き込むことを前提としたPHP-wordの使用方法はちらほら出てくるのですが、あくまでPHP上のデータをWord上に書き込むだけであり、逆にWordのドキュメントファイルを読み込むという方法がなかなか出てきません。
そこで、色々と検索ワードを考えて海外サイトも含め巡回した成果を記録していきたいと思います。
Wordのdocxファイルを読み込む
docxファイルはWord2007から主流となっている、XMLを使用したファイルです。なので、PHPでXMLを読み込めるように対処すれば普通に読み込めてしまったりします。
これは、自分が公開しているPhpspreadsheetに関する記事ですが、こちらもxlsxファイルを読み込むためにphp-zipとlibzip5ライブラリをインストールしているので、今度の場合もdocxファイルを読み込むために同じライブラリをインストールしておきます。
/*PHP7.1以前はこちら*/ hogehoge$ yum --enablerepo=remi-phpxx -y install php-zip libzip5 /*PHP7.2以降はこちら*/ hogehoge$ yum --enablerepo=remi-phpxx -y install php-pecl-zip libzip5 hogehoge$ systemctl restart httpd //Apacheの場合、Nginxならhttpdをnginxに書き替える hogehoge$ php --ri zip//zip関連のアーカイブがインストールされているか確認 /*このように表示されていれば確実*/ zip Zip => enabled Zip version => x.x.x Libzip headers version => x.x.x Libzip library version => x.x.xdocxファイルを読み込む
あとはZipArchiveクラスを用いるだけです。
PHP$filename = "test.docx"; //対象となるdocxファイル $zip = zip_open($filename); $content = ""; if ($zip && !is_numeric($zip)){ while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry) == FALSE) continue; if (zip_entry_name($zip_entry) != "word/document.xml") continue; $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); zip_entry_close($zip_entry); } } zip_close($zip); $content = preg_replace("/\<\/w:t\>/","<br>",$content); //改行にあたる部分だけを置き換える echo $content;これで後はブラウザに表示するだけです。ただ、元のソースのままだと改行が行われなかったので、改行が行われるように修正を加えています。また、ソースを見るとまだまだ無駄なタグがあるので、それを必要に応じて置換するといいでしょう。
参考にしたページ
How to extract text from word file .doc,docx,.xlsx,.pptx php
Wordのdocファイルを読み込む
docファイルはマイクロソフト社が独自で開発した規格のため、かなりの人が処理に悪戦苦闘しているようですが、実はfile関数を使って開くことができるようです。ですが、そこからのエンコードに苦戦しているようで、いろいろなサイトで方法を公開していますが、的確に処理できていた記述は上記のリンクにあった方法だけでした。
PHP$filename = "test.doc"; //テスト用のドキュメントファイル if(file_exists($filename)){ if(($fh = fopen($filename, 'r')) !== false ){ $headers = fread($fh, 0xA00); // 1 = (ord(n)*1) ; Document has from 0 to 255 characters $n1 = ( ord($headers[0x21C]) - 1 ); // 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters $n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 ); // 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters $n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 ); // 1 = (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters $n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 ); // Total length of text in the document $textLength = ($n1 + $n2 + $n3 + $n4); $text = fread($fh, $textLength); nl2br($text); $text = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/',"",$text); //制御記号を置換 echo $text; } }ただ、それだけだと制御文字まで表示されてしまっていたので、置換処理を施しています。
※あくまでStack Overflowでの記事なので、日本語までは対応していません。いちおう文字化けした状態では出力されるのですが、エンコードができずに苦戦しています。もし、解決方法をご存知の方はアンサーをいただけると大変助かります。
Apache POIを使用する方法もあるようですが、そもそもどうやってcentOS7にインストールしたらいいのかが詰まっており、しかも、そこからPHPと連携する方法、docファイルを取得する方法がわかっていませんし、果たして日本語を取得できるのかどうかもわかりませんが、業務の合間を見て分析を続けていきたいところです。
- 投稿日:2020-05-28T10:59:00+09:00
PHP 配列に格納された連想配列に要素を追加する
目的
- 配列に格納された連想配列に値を追加する際に若干詰まったので方法をまとめる
前提情報
- 下記のリンク先で後述するコードの振る舞いを確かめる。
具体例
連想配列が格納された配列
$tests
を定義し、$tests
の末尾に連想配列を追加する処理を下記に記載する。<?php //連想配列が格納された配列の定義 $tests = [ [ 'str_1' => 'aaa', 'str_2' => 'bbb', 'str_3' => 'ccc', ] ]; //追加する連想配列を記載する $tests[] = [ 'str_1' => 'ddd', 'str_2' => 'eee', 'str_3' => 'fff', ]; //配列内容の出力 foreach ($tests as $test) { echo $test['str_1'] ."\n"; echo $test['str_2'] ."\n"; echo $test['str_3'] ."\n"; echo '==================='; }; ?>