20200528のPHPに関する記事は10件です。

Xamppの初期設定

Xamppの初期設定について紹介します。

作業環境

OS:Windows 10
エディション:HOME
バージョン:2004
Xampp:バージョン7.4.6

※Xamppのインストール方法はこちらで解説しています。
【環境構築】Windows10にXAMMPをインストールする方法

php.iniの設定を変更する

202005282156.png
「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.iniファイルの確認と修正

一番下の行はコメントがついて無効になっているので、下記のようにコメントアウトして、無効な文字は何も表示しない設定に変更します。

php.ini
mbstring.substitute_character = none

202005282252.png

「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.iniファイルの確認と修正

先程と同様に、一番下の行はコメントついて無効になっているので、下記のようにコメントアウトして、オーバーロードをしない設定に変更します。

php.ini
mbstring.func_overload = 0

202005282256.png

2.「Notice」のエラーを非表示にする

PHPのエラーには色々ありますが、「Notice」は「通知」という意味の英単語で、あまり重要ではないエラーです。「Notice」のエラー表示が出ると不便なので、表示をオフにします。
「error_reporting」と検索すると、下の行が見つかります。

php.ini
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT

この行を以下のように変更すると、「Notice」のエラーが非表示になります。

php.ini
error_reporting=E_ALL & ~E_NOTICE & ~E_STRICT

202005282316.png

MySQLのパスワードを設定する

Xamppはデフォルトだとパスワードが設定されていないので、パスワードを設定します。

1.phpMyAdminでパスワードを設定する

202005262122.png
Xamppを起動し、「Apache」と「MySQL」を起動し、「MySQL」の横の「Admin」を選びます。

202005282323.png
「MySQL」が起動するので、「ユーザーアカウント」を選びます。

202005282325.png
「localhost」の「特権を編集」を選びます。

202005282326.png
「パスワードを変更する」を選びます。

202005282327.png
パスワードを2回入力し、右下の「実行」を選びます。

202005282328.png
「'root'@'localhost' のパスワードは正しく変更されました。」と表示されれば、パスワードの設定が完了です。
Xamppを再起動し、「Apache」と「MySQL」を起動し、「MySQL」の横の「Admin」を選ぶと、以下の画面が表示され、パスワードが設定できたことが確認できます。

202005282338.png

2.「config.inc.php」にパスワードを追記

202005282342.png
「Apache」→「Config」→「phpMyAdmin(config.inc.php)」を選びます。

202005282343.png
上記の部分に先程設定したパスワードを追記します。
「Apache」と「MySQL」を起動し、「MySQL」の横の「Admin」を選ぶと、以下の画面が表示され、ログインできるようになります。
202005282344.png

以上、Xamppの初期設定についてご紹介しました。

参考サイト

php.iniファイルの確認と修正

XAMPPのmysqlのrootにパスワードを設定する方法

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Trelloのラベリング機能を自動化した[PHP7.3, Trello REST API, cron]

新型コロナウイルスの影響でリモート化した大学の講義の管理をTrelloで行っていたのだが、どうしても自動化した方がいいと思う部分があったので、自動化した。

前までの僕のリモート講義管理方法

大学 という名前のボードを作成。
~ という名前のリストを作る。
③その内部で、それぞれの曜日にある授業の講義名のカードを作り、
④受けないといけない講義動画が配信されているのが確認されたら、該当カードに赤色のラベルを貼る。
⑤講義を受け、提出物を提出した後、赤ラベルを消す

という管理方法をとっていた。

スクリーンショット 2020-05-28 18.47.34.png

どこを自動化するか

上記 ④ の、受けないといけない講義動画が配信されているのが確認されたら、該当カードに赤色のラベルを貼る。
という部分は、動画が配信される時間は決まっていたので、該当時間に自動で赤ラベルを貼ってくれるようにできそうだなと思った。

実装の流れ

①Trello Developer APIのキーとトークンを取得する
②Trello developer公式ドキュメントを参考に実装
③ ② で作成したファイルを該当時間に実行されるようcrontabを設定

①Trello Developer APIのキーとトークンを取得する

  1. まず、ブラウザ上でtrelloをログイン状態にする。

  2. ↓のURLに飛ぶと、一番上にKeyが表示される。
    https://trello.com/app-key
    また、Keyのちょうど下にTokenが取得できるurlリンクがあるのでそこをクリックすると、tokenが発行される。
    これらのkeyとtokenをメモ。

スクリーンショット 2020-05-28 19.17.02.png

②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.php

cronの設定方法に関しての詳細はここでは省略させてもらいますが、
簡単に説明すると、

#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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php.iniの上限値をなくす

php.iniのmemory_limitについて

phpで一回の処理でデフォルトの上限値を超えると,

 Allowed memory size of 268435456 bytes exhausted

こんな感じのエラーが出ます。
なので、/usr/local/etc/php/php.iniを開いて、

memory_limit = 256M //この部分を変える
memory_limit = -1

-1にすると処理の上限を外せるみたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS7にComposerをインストールしよう

はじめに

PHPにはComposerが必須だとのことなので、インストールすることにしました。

前提

過去記事のWindows10にVagrantをを入れてCentOS7をインストールしよう(123456)、
ローカルでLAMP環境を構築しよう(01234)で構築した環境を前提とします。

使用ツール

  • 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 composer

Composerをどこからでも使えるようにしよう

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/composer

Composerのインストール確認は以下のコマンドで可能です。

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. ファイアウォールとか停止する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-fpm

PHP の設定変更

# 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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は第一引数がインスタンスか例外クラスで切り分けしており、第一引数が例外クラスのときは、例外クラスがメッセージ、コードの順じゃないとエラーになるということがわかりました。
etc AccessDeniedHttpException

また andThrow は内部で andReturn を呼んでいることも知れてよかったです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

学習記録 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との相性が良い。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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.x

docxファイルを読み込む

あとはZipArchiveクラスを用いるだけです。

ZipArchive クラス

docx.jpg

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;

これで後はブラウザに表示するだけです。ただ、元のソースのままだと改行が行われなかったので、改行が行われるように修正を加えています。また、ソースを見るとまだまだ無駄なタグがあるので、それを必要に応じて置換するといいでしょう。

browse.jpg

参考にしたページ

How to extract text from word file .doc,docx,.xlsx,.pptx php

Wordのdocファイルを読み込む

docファイルはマイクロソフト社が独自で開発した規格のため、かなりの人が処理に悪戦苦闘しているようですが、実はfile関数を使って開くことができるようです。ですが、そこからのエンコードに苦戦しているようで、いろいろなサイトで方法を公開していますが、的確に処理できていた記述は上記のリンクにあった方法だけでした。

document2.jpg

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;
    }
}   

ただ、それだけだと制御文字まで表示されてしまっていたので、置換処理を施しています。

browse2.jpg

※あくまでStack Overflowでの記事なので、日本語までは対応していません。いちおう文字化けした状態では出力されるのですが、エンコードができずに苦戦しています。もし、解決方法をご存知の方はアンサーをいただけると大変助かります。

Apace POIを使用する方法もあるようですが、そもそもどうやってcentOS7にインストールしたらいいのかが詰まっており、しかも、そこからPHPと連携する方法、docファイルを取得する方法がわかっていませんし、日本語を取得できるのかもわかりませんが、業務の合間を見て分析を続けていきたいところです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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.x

docxファイルを読み込む

あとはZipArchiveクラスを用いるだけです。

ZipArchive クラス

docx.jpg

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;

これで後はブラウザに表示するだけです。ただ、元のソースのままだと改行が行われなかったので、改行が行われるように修正を加えています。また、ソースを見るとまだまだ無駄なタグがあるので、それを必要に応じて置換するといいでしょう。

browse.jpg

参考にしたページ

How to extract text from word file .doc,docx,.xlsx,.pptx php

Wordのdocファイルを読み込む

docファイルはマイクロソフト社が独自で開発した規格のため、かなりの人が処理に悪戦苦闘しているようですが、実はfile関数を使って開くことができるようです。ですが、そこからのエンコードに苦戦しているようで、いろいろなサイトで方法を公開していますが、的確に処理できていた記述は上記のリンクにあった方法だけでした。

document2.jpg

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;
    }
}   

ただ、それだけだと制御文字まで表示されてしまっていたので、置換処理を施しています。

browse2.jpg

※あくまでStack Overflowでの記事なので、日本語までは対応していません。いちおう文字化けした状態では出力されるのですが、エンコードができずに苦戦しています。もし、解決方法をご存知の方はアンサーをいただけると大変助かります。

Apache POIを使用する方法もあるようですが、そもそもどうやってcentOS7にインストールしたらいいのかが詰まっており、しかも、そこからPHPと連携する方法、docファイルを取得する方法がわかっていませんし、果たして日本語を取得できるのかどうかもわかりませんが、業務の合間を見て分析を続けていきたいところです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 '===================';
    };
    ?>
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む