20200209のPHPに関する記事は18件です。

【XAMPP】PHPの制作物を任意のディレクトリで作りたい

3行で

  • httpd.conf を開く
  • DocumentRoot のディレクトリを書き換える
  • localhostにアクセス

環境

Mac

なぜ

自分の制作物を /projects とかのディレクトリ(フォルダ)にまとめているなどの理由で /XAMPP/xamppfiles/htdocs の下にPHPの制作物を入れるのがイヤだなぁという場合。

httpd.conf の中身を書き換える

/Application/XAMPP/xamppfiles/etc/httpd.conf を開いて
DocumentRoot と書かれた部分を探す。
230行目あたりにあります。

DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"

ここを任意のディレクトリに書き換える。

DocumentRoot "/Users/antk/projects/"

など。
そしたらすぐ下にある

<Directory "/Applications/XAMPP/xamppfiles/htdocs">

こちらも書き換える。

<Directory "/Users/antk/projects/">

これでOKです。

localhostにアクセスしてみる

/projects の下に /phpapp という名前のディレクトリを作って index.php というページを作った場合
http://localhost/phpapp/index.php
ってアクセスすると表示されます。

もしObjects not found! と出てくる場合はXAMPPでWeb Serverを Restart ってしてあげると出てくるかもです。

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

Laravel Eloquentの超基本的な使い方

自分用にまとめました

モデルの取得

主キーで取得

SELECT * FROM users WHERE id = 1 LIMIT 1;

:point_down:

App\User::find(1);

全件取得

SELECT * FROM posts WHERE writer_id = 1;

:point_down:

App\Post::where('writer_id', 1)->get();

1件だけ取得

whereの引数を配列にすれば、And検索できる

SELECT * FROM favorites WHERE user_id = 1 AND post_id = 1 LIMIT 1;

:point_down:

App\Favorite::where([
    'user_id' => 1,
    'post_id' => 1,
])->first();

Or検索

And検索は ->where()->where() のようにメソッドチェーンでも書ける
また、メソッドチェーンは Or検索も表せる

SELECT * FROM posts WHERE title LIKE '%Lorem' OR title LIKE '%ipsum%';

:point_down:

App\Post::where('title', 'LIKE', '%Lorem')
->orWhere('title', 'LIKE', '%ipsum%')
->get();

複雑な検索

コールバックを使用すれば複雑な条件も表せる

SELECT * FROM posts
 WHERE (title LIKE '%Lorem' OR title LIKE '%ipsum%')
  AND (created_at IS NULL OR updated_at IS NULL);

:point_down:

App\Post::where(function ($query) {
    return $query
    ->where('title', 'LIKE', '%Lorem')
    ->orWhere('title', 'LIKE', '%ipsum%');
})
->where(function ($query) {
    return $query
    ->whereNull('created_at')
    ->orWhereNull('updated_at');
})->get();

モデルの作成

INSERT INTO favorites (user_id, post_id) VALUES (1, 2);
App\Favorite::create([
    'user_id' => 1,
    'post_id' => 2,
]);

モデルの更新

UPDATE posts SET updated_at = NOW();

:point_down:

App\Post::query()->update([
    'updated_at' => \Carbon\Carbon::now(),
]);

モデルの(物理)削除

DELETE FROM favorites WHERE user_id = 1 AND post_id = 1;
App\Favorite::where([
    'user_id' => 1,
    'post_id' => 1,
])->delete();

参考ページ
https://readouble.com/laravel/6.x/ja/eloquent.html
https://stackoverflow.com/questions/19325312/how-to-create-multiple-where-clause-query-using-laravel-eloquent
https://stackoverflow.com/questions/15622710/how-to-set-every-row-to-the-same-value-with-laravels-eloquent-fluent

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

PSR-3: Logger Interface 読了

PSRとは

  • PSR(PHP Standards Recommendations)とは、PHP-FIG(PHP Framework Interop Group)が策定しているPHPコーディング規約を指す

PSR-3: Logger Interface

PSR-3: Logger Interface

This document describes a common interface for logging libraries.

The main goal is to allow libraries to receive a Psr\Log\LoggerInterface object and write logs to it in a simple and universal way. Frameworks and CMSs that have custom needs MAY extend the interface for their own purpose, but SHOULD remain compatible with this document. This ensures that the third-party libraries an application uses can write to the centralized application logs.

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

The word implementor in this document is to be interpreted as someone implementing the LoggerInterface in a log-related library or framework. Users of loggers are referred to as user.

  • このドキュメントでは、ロギングライブラリの一般的なインターフェイスについて記されている
  • 主な目的は、このライブラリがPsr\Log\LoggerInterfaceオブジェクトを受け取り、シンプルで普遍的な方法でログを書き込むことにある
  • フレームワークとCMSは、独自の目的のためにインターフェースを拡張できるが、このドキュメントとの互換性を維持する必要がある
  • これにより、アプリケーションが使用するサードパーティライブラリが集約化されたアプリケーションログに書き込むことができる
  • このドキュメントの実装者という言葉は、ログ関連のライブラリまたはフレームワークでLoggerInterfaceを実装している人として解釈する
  • いくつか登場するキーワード(MUST, MUST NOT etc...)は、RFC 2119で説明されてるような解釈とする

内容の構成は章立てされており、いくつかの章では節に当たる項目が用意されてる
引用に関しては全てPSR-1のものである
箇条書きされてる箇所は 和訳+個人の解釈 の入った内容となってる

※以下、学習の一環として自分の解釈とコードを交えた内容を記載しますが、間違いあればコメント頂けますと幸いです。早急に対応しますのでご遠慮なく。

1. 仕様

https://www.php-fig.org/psr/psr-3/#1-specification

1.1基本

The LoggerInterface exposes eight methods to write logs to the eight RFC 5424 levels (debug, info, notice, warning, error, critical, alert, emergency).

A ninth method, log, accepts a log level as the first argument. Calling this method with one of the log level constants MUST have the same result as calling the level-specific method. Calling this method with a level not defined by this specification MUST throw a Psr\Log\InvalidArgumentException if the implementation does not know about the level. Users SHOULD NOT use a custom level without knowing for sure the current implementation supports it.

  • LoggerInterfaceは、ログを8つのRFC 5424レベル(debug, info, notice, warning, error, critical, alert, emergency)に書き込むために8つのメソッドを公開してる
  • 9番目のlogメソッドは、最初の引数としてログレベルを受け取る、ログレベル定数のいずれかでこのメソッドを呼び出した場合は、そのレベル固有のメソッドを呼び出した場合と同じ結果を返さなければならない
  • この仕様で定義されていないレベルでlogメソッドを呼び出す場合は、Psr\Log\InvalidArgumentExceptionをスローする必要がある
  • ログレベルを確認せずカスタムレベルを使用してはいけない

1.2 Message

Every method accepts a string as the message, or an object with a __toString() method. Implementors MAY have special handling for the passed objects. If that is not the case, implementors MUST cast it to a string.

The message MAY contain placeholders which implementors MAY replace with values from the context array.

Placeholder names MUST correspond to keys in the context array.

Placeholder names MUST be delimited with a single opening brace { and a single closing brace }. There MUST NOT be any whitespace between the delimiters and the placeholder name.

Placeholder names SHOULD be composed only of the characters A-Z, a-z, 0-9, underscore _, and period .. The use of other characters is reserved for future modifications of the placeholders specification.

Implementors MAY use placeholders to implement various escaping strategies and translate logs for display. Users SHOULD NOT pre-escape placeholder values since they can not know in which context the data will be displayed.

  • すべてのメソッドは、メッセージとして文字列、または__toString()メソッドを持つオブジェクトを受けとることができるが、そうではない場合文字列にキャストしなければならない
  • コンテキストな配列にはプレースホルダーに置き換えることができる値が含まれてる場合がある
  • プレースホルダー名は、配列のキーに対応する必要がある
  • プレースホルダー名は、中括弧{}で区切る必要がある
  • 区切り文字とプレースホルダー名の間に空白があってはいけない
  • プレースホルダ名は、A〜Z、a〜z、0〜9、アンダースコア、およびピリオドのみで構成しなければならない
  • プレースホルダーをエスケープして表示用のログを変換することができるため、プレースホルダーを事前にエスケープしてはいけない

The following is an example implementation of placeholder interpolation provided for reference purposes only:

<?php

/**
 * Interpolates context values into the message placeholders.
 */
function interpolate($message, array $context = array())
{
    // build a replacement array with braces around the context keys
    $replace = array();
    foreach ($context as $key => $val) {
        // check that the value can be casted to string
        if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
            $replace['{' . $key . '}'] = $val;
        }
    }

    // interpolate replacement values into the message and return
    return strtr($message, $replace);
}

// a message with brace-delimited placeholder names
$message = "User {username} created";

// a context array of placeholder names => replacement values
$context = array('username' => 'bolivar');

// echoes "User bolivar created"
echo interpolate($message, $context);

1.3 コンテキスト

Every method accepts an array as context data. This is meant to hold any extraneous information that does not fit well in a string. The array can contain anything. Implementors MUST ensure they treat context data with as much lenience as possible. A given value in the context MUST NOT throw an exception nor raise any php error, warning or notice.

If an Exception object is passed in the context data, it MUST be in the 'exception' key. Logging exceptions is a common pattern and this allows implementors to extract a stack trace from the exception when the log backend supports it. Implementors MUST still verify that the 'exception' key is actually an Exception before using it as such, as it MAY contain anything.

  • 全てのメソッドは引数としてコンテキストデータを配列として受け取る
  • コンテキスト内の値に対して例外をスローしたりPHPエラー、警告、通知を発生してはいけない

1.4 ヘルパークラスとインターフェイス

The Psr\Log\AbstractLogger class lets you implement the LoggerInterface very easily by extending it and implementing the generic log method. The other eight methods are forwarding the message and context to it.

Similarly, using the Psr\Log\LoggerTrait only requires you to implement the generic log method. Note that since traits can not implement interfaces, in this case you still have to implement LoggerInterface.

The Psr\Log\NullLogger is provided together with the interface. It MAY be used by users of the interface to provide a fall-back “black hole” implementation if no logger is given to them. However, conditional logging may be a better approach if context data creation is expensive.

The Psr\Log\LoggerAwareInterface only contains a setLogger(LoggerInterface $logger) method and can be used by frameworks to auto-wire arbitrary instances with a logger.

The Psr\Log\LoggerAwareTrait trait can be used to implement the equivalent interface easily in any class. It gives you access to $this->logger.

The Psr\Log\LogLevel class holds constants for the eight log levels.

  • Psr\Log\AbstractLoggerクラスを使用して汎用的なログメソッドを実装することで、拡張したLoggerInterfaceを簡単に実装することができる
  • 他にはメッセージとコンテキストの転送を行う8つのメソッドが存在する
  • Psr\Log\LoggerTraitクラスを使用するには一般的なログメソッドを実装するだけで良いが、LoggerInterfaceを実装する必要がある
  • Psr\Log\LoggerAwareInterfaceクラスにはsetLogger(LoggerInterface $logger)メソッドのみ含まれ、フレームワークがロガーと任意のインスタンスを自動接続するために使用する
  • Psr\Log\LoggerAwareTraitクラスの特性を使用することで同等のインターフェースを任意のクラスに実装することができる($this->loggerでアクセスできる)
  • Psr\Log\LogLevelクラスは、8つのログレベルの定数を保持する

2. パッケージ

https://www.php-fig.org/psr/psr-3/#2-package

The interfaces and classes described as well as relevant exception classes and a test suite to verify your implementation are provided as part of the psr/log package.

  • インターフェースとクラス、その他関連する例外クラスと実装を検証するためのテストはpsr/logパッケージの一部として提供されてる

3. Psr\Log\LoggerInterface

https://www.php-fig.org/psr/psr-3/#3-psrlogloggerinterface

<?php

namespace Psr\Log;

/**
 * Describes a logger instance.
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function emergency($message, array $context = array());

    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function alert($message, array $context = array());

    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function critical($message, array $context = array());

    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function error($message, array $context = array());

    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function warning($message, array $context = array());

    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function notice($message, array $context = array());

    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function info($message, array $context = array());

    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function debug($message, array $context = array());

    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return void
     */
    public function log($level, $message, array $context = array());
}
  • 1. 仕様で記されてるように、LoggerInterfaceではログレベルに応じたログ内容を書き込むための8つのメソッドが実装されてる

4. Psr\Log\LoggerAwareInterface

https://www.php-fig.org/psr/psr-3/#4-psrlogloggerawareinterface

<?php

namespace Psr\Log;

/**
 * Describes a logger-aware instance.
 */
interface LoggerAwareInterface
{
    /**
     * Sets a logger instance on the object.
     *
     * @param LoggerInterface $logger
     * @return void
     */
    public function setLogger(LoggerInterface $logger);
}
  • 1. 仕様で記されてるように、LoggerAwareInterfaceではロガーと任意のインスタンスを接続するためのsetLoggerメソッドが実装されている

5. Psr\Log\LogLevel

https://www.php-fig.org/psr/psr-3/#5-psrlogloglevel

<?php

namespace Psr\Log;

/**
 * Describes log levels.
 */
class LogLevel
{
    const EMERGENCY = 'emergency';
    const ALERT     = 'alert';
    const CRITICAL  = 'critical';
    const ERROR     = 'error';
    const WARNING   = 'warning';
    const NOTICE    = 'notice';
    const INFO      = 'info';
    const DEBUG     = 'debug';
}
  • 1. 仕様で記されてるようにLogLevelクラスでは、8つのログレベル定数が定義されてる

注意

  • 冒頭でも述べたように、主に箇条書きされてる箇所については、 和訳+個人の解釈 の入った内容になっているため、参考程度の理解としていただきたい
  • また、表現に誤りがある場合、遠慮なくコメントいただけると幸いです(この内容に関しては表現の誤りは致命的なため)
  • 学習の一環としてアウトプットしたいため投稿したので、その点暖かい目で読んで頂けると嬉しい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

そろそろaws初めてみよか#3~RDSとの接続~

はじめに

前回CodeStarのIDE環境(Cloud9)からコード編集Deployまではうまく行きました。
今度はいよいよ失敗していた(=環境が整っていなかった)DB接続を試します。

RDSの作成

RDSのコンソール画面の[データベースの作成]から作成します。
01.png

今回はMariaDBにしてみました。
02-1.png
もちろん無料枠でDBインスタンス名、マスターユーザ名、マスターパスワードを入力します。
解説には@も逝けると書いてありますが、パスワードを確認欄のVaridationで弾かれるので@は無理っす
02-2.png
ここはデフォルトのまま
02-3.png
接続をDefault VPCとしました。
02-4.png
で最後に[データベースの作成]を押せば5~10分位で出来上がります。
02-5.png

RDSとの接続設定

このままではDefault VPCにCodeStarで作成したphp-laravelインスタンスとRDBインスタンスの疎通が取れません。
なぜならDefault VPCにMariaDBポートに対する接続設定が入っていないからです。これを設定していきます。

必要な情報は
- 接続元サーバとなるインスタンスのプライベートIP
- 接続先サーバで利用するポート番号

まずはCodeStarで作成したphp-laravelインスタンスのプライベートIPを確認します。
EC2ダッシュボードに移動し、インスタンスを表示します。
そうするとCodeStarのプロジェクト名-WebAppというインスタンスがいますのでそのプライベートIPをコピーしNodepadなどに書き写しておきます。
01.png

ポート番号はMariaDB標準から変えていないので3306ですね。(RDSの作成時に替えた場合はその値に)

RDSがぶら下がっているVPCからアクセスしましょうか。
Amazon RDSのダッシュボードに移り、データベースメニューからDB識別子のリンクをクリックします。
02.png
03.png
ここに出てくるVPC-セキュリティグループのリンクをクリックします。
04.png
EC2ダッシュボードのネットワーク&セキュリティ>セキュリティーグループにフィルターがかかった状態で遷移します。
画面下部のインバウンドをクリックし、先ほどのプライベートIPとポート番号を指定します。
05.png

RDSとの接続確認

では、CodeStarのプロジェクトのインスタンスにTeraTermで接続します。
初期状態ではmysqlのモジュールも入っていないのでインストールします。
※PHP実行サーバーに入れたくない!ってセキュリティ意識の高い方は別の運用用EC2を立ち上げ操作を行ってください。
 その際は、上のRDSとの接続で指定したインバウンドの他に運用用EC2のプライベートIPも定義してあげます。

コマンドが入っていないことの確認(笑)
-hで指定するホスト名はRDSダッシュボードのデータベース識別子を選択した後の画面にでるエンドポイントのホスト名です。

[ec2-user@ip-172-31-29-127 phplaravel]$ mysql -u admin -p -h laravel-db.culgyynq9ap1.us-east-2.rds.amazonaws.com
-bash: mysql: command not found
[ec2-user@ip-172-31-29-127 phplaravel]$ sudo yum install -y mysql
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                | 2.1 kB     00:00
amzn-updates                                             | 2.5 kB     00:00
Resolving Dependencies
--> Running transaction check
---> Package mysql.noarch 0:5.5-1.6.amzn1 will be installed
--> Processing Dependency: mysql55 >= 5.5 for package: mysql-5.5-1.6.amzn1.noarch
--> Running transaction check
---> Package mysql55.x86_64 0:5.5.62-1.23.amzn1 will be installed
--> Processing Dependency: real-mysql55-libs(x86-64) = 5.5.62-1.23.amzn1 for package: mysql55-5.5.62-1.23.amzn1.x86_64
--> Processing Dependency: mysql-config for package: mysql55-5.5.62-1.23.amzn1.x86_64
--> Running transaction check
---> Package mysql-config.x86_64 0:5.5.62-1.23.amzn1 will be installed
---> Package mysql55-libs.x86_64 0:5.5.62-1.23.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch        Version                  Repository         Size
================================================================================
Installing:
 mysql             noarch      5.5-1.6.amzn1            amzn-main         2.7 k
Installing for dependencies:
 mysql-config      x86_64      5.5.62-1.23.amzn1        amzn-updates       49 k
 mysql55           x86_64      5.5.62-1.23.amzn1        amzn-updates      7.5 M
 mysql55-libs      x86_64      5.5.62-1.23.amzn1        amzn-updates      816 k

Transaction Summary
================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 8.3 M
Installed size: 31 M
Downloading packages:
(1/4): mysql-5.5-1.6.amzn1.noarch.rpm                      | 2.7 kB   00:00
(2/4): mysql-config-5.5.62-1.23.amzn1.x86_64.rpm           |  49 kB   00:00
(3/4): mysql55-libs-5.5.62-1.23.amzn1.x86_64.rpm           | 816 kB   00:00
(4/4): mysql55-5.5.62-1.23.amzn1.x86_64.rpm                | 7.5 MB   00:00
--------------------------------------------------------------------------------
Total                                              9.9 MB/s | 8.3 MB  00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : mysql55-libs-5.5.62-1.23.amzn1.x86_64                        1/4
  Installing : mysql-config-5.5.62-1.23.amzn1.x86_64                        2/4
  Installing : mysql55-5.5.62-1.23.amzn1.x86_64                             3/4
  Installing : mysql-5.5-1.6.amzn1.noarch                                   4/4
  Verifying  : mysql-5.5-1.6.amzn1.noarch                                   1/4
  Verifying  : mysql-config-5.5.62-1.23.amzn1.x86_64                        2/4
  Verifying  : mysql55-libs-5.5.62-1.23.amzn1.x86_64                        3/4
  Verifying  : mysql55-5.5.62-1.23.amzn1.x86_64                             4/4

Installed:
  mysql.noarch 0:5.5-1.6.amzn1

Dependency Installed:
  mysql-config.x86_64 0:5.5.62-1.23.amzn1   mysql55.x86_64 0:5.5.62-1.23.amzn1
  mysql55-libs.x86_64 0:5.5.62-1.23.amzn1

Complete!
[ec2-user@ip-172-31-29-127 phplaravel]$ 

気を取り直してもう一度。今度はちゃんと接続できました。

[ec2-user@ip-172-31-29-127 phplaravel]$ mysql -u admin -p -h laravel-db.culgyynq9ap1.us-east-2.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 234
Server version: 5.5.5-10.2.21-MariaDB-log Source distribution

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

これでCodeStarのインスタンスからRDSへの接続が可能となりました。

RDSにデータベースを作成する

ここはMariaDBのコマンドなので覚書です。

mysql> CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| laravel            |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

mysql> \q
Bye

これでlaravel用のDBのガワができました。
本当はマスターユーザではなくLaravel用データベース接続ユーザを作るべきでしょうが
そこはスルーしました。

いよいよphp artisan migrate

ここまで来たらいよいよlaravelからDBをmigrateしてやります。
デフォルトの接続設定がローカルホストでしたのでまずは.envを書き換えます。

[ec2-user@ip-172-31-29-127 ~]$ cd /var/www/phplaravel/
[ec2-user@ip-172-31-29-127 phplaravel]$ cat .env
APP_ENV=local
APP_KEY=base64:CHANGEMECHANGEMECHANGEMECHANGEMECHANGEMECHA=
APP_DEBUG=false
APP_LOG_LEVEL=error
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=
[ec2-user@ip-172-31-29-127 phplaravel]$

これを書き換えます。具体的には以下の様にします。

Env Value
DB_CONNECTION mysql
DB_HOST laravel-db.culgyynq9ap1.us-east-2.rds.amazonaws.com
DB_PORT 3306
DB_DATABASE laravel
DB_USERNAME admin
DB_PASSWORD ***********
[ec2-user@ip-172-31-29-127 phplaravel]$ vi .env
[ec2-user@ip-172-31-29-127 phplaravel]$ cat .env
APP_ENV=local
APP_KEY=base64:CHANGEMECHANGEMECHANGEMECHANGEMECHANGEMECHA=
APP_DEBUG=false
APP_LOG_LEVEL=error
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=laravel-db.culgyynq9ap1.us-east-2.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=admin
DB_PASSWORD=***********

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=
[ec2-user@ip-172-31-29-127 phplaravel]$

ではお待ちかねのartisan migrate

[ec2-user@ip-172-31-29-127 phplaravel]$ php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
[ec2-user@ip-172-31-29-127 phplaravel]$

はい。これでWeb+DBの環境は整いました!

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

ComposerでPlease provide a valid cache pathとなったときの対応スクリプト

https://qiita.com/ponsuke0531/items/f0b68546068ac8922665 を一発でできるスクリプトを書いた。

$ /var/www/laravel# find config/ -type f | xargs grep storage_path \
| grep framework | sed -e 's/^.*storage_path//' \
| tr -d ",\(\)'" | awk '{ print "storage/"$0 }' | xargs mkdir -p
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Moodle 3.8 マニュアル - 10000 以上のインストール

原文

10000 以上のインストール

10000 人以上のユーザーのために Moodle のインストールをケータリングしている(あるいはしようとしている)のならここにあなたの学校の情報を追加してください。

内容

1 アルゼンチン
2 オーストリア
3 カナダ
4 中国
5 コロンビア
6 チェコ共和国
7 フランス
8 ドイツ
9 インド
10 アイルランド
11 ジャマイカ
12 メキシコ
13 ニュージーランド
14 パレスチナ
15 フィリピン
16 ポルトガル
17 南アフリカ
18 スペイン
19 スウェーデン
20 台湾
21 トリニダード・トバゴ
22 イギリス
23 アメリカ合衆国
24 ベネズエラ

1 アルゼンチン

  • LIRWeb(UniversidadCatólicaArgentina-Laboratorio deInformáticay Redes)アルゼンチンで教育用のオープンソースソフトウェアを実装した最初の大学。 2006年以降、600以上のアクティブなコースでMoodleを公式に使用しています。サービスは、新しい教育機能と追加の教育機能を取り入れて成長を続けました。

LIRWebチーム。

2 オーストリア

  • Moodle(TUWEL)ユーザー統計2009年9月25日-ウィーン工科大学(TUウィーン)

-19.250人のユーザー(生徒と教師)
-13.400人の学生がコースに登録
-コースに登録された1.030人の教師
-1日あたり5000人以上のアクティブユーザー

私たちの使命は「人々のためのテクノロジー」です。私たちの研究を通じて「科学的卓越性を開発」し、教育を通じて「包括的な能力を高めます」。

http://moodle.uni-graz.at/

3 カナダ

  • アサバスカ大学-カナダを代表する遠隔教育およびオンライン大学:カナダのオープン大学。年間約30,000人の学生にサービスを提供しています。 Athabascaは、MoodleをWebCT Vista(つまり、最上位バージョン)の代わりに単一のプラットフォームとして採用することを決定しました。詳細については、プレスリリースをご覧ください。

  • シャーブルック大学-シャーブルック大学は、高齢者向け大学に登録している約9,000人を含む、100か国以上から37,000人以上の学生を歓迎しています。シャーブルック大学の学生人口の85%以上がシャーブルック郊外から来ています。シャーブルック大学の従業員数は6,700人です。ケベックの教員の10%を占めています。

4 中国

5 コロンビア

  • PolitécnicoGrancolombiano 12,000人以上のユーザー-ボゴタキャンパス-1380コース-462教師 全国のバーチャル教育でほぼ7,000人のユーザー-265コース-122教師 Moodle 1.9.5

6 チェコ共和国

7 フランス

  • レンヌ大学2-オートブルターニュ-1400コースで20,000〜30,000ユーザー
    毎月8,000人の異なるユーザーが接続
    実際に関与した300人の教師
    LDAPおよびEsup-Portail(uPortalに基づく)との統合。
    CASを介した認証

    UniversitéToulouse 1 Capitole-800コースの18,000ユーザー、Moodle 1.9.11+
    実際に関与した300人の教師
    LDAPおよびEsup-Portailとの統合(uPortalに基づく)
    CASを介した認証

8 ドイツ

  • ベルリン工科大学-402コースの10,400ユーザー(更新:2007年6月7日)
    テスト期間の後、インストラクターと学生向けの情報システム(ISIS)が2006年9月に開始されました。

    ダルムシュタット工科大学-〜3,000コースの〜25,000ユーザー。 2009年以降のMoodleの使用(更新:09.04.2014)

    BergischeUniversitätWuppertal-〜4600コースの〜16000ユーザー(更新:2012年5月15日)

9 インド

  • AMIEは、イン​​ドのケララにある住居AMIE研究所であり、LIMCA Book of Recordsに130全インドランクで掲載されており、AMIEのコーチングとIITおよびNITの高等教育に最適です。

10 アイルランド

11 ジャマイカ

12 メキシコ

  • Apuntes enlíneaは、教育の革新と改善のための3年間のプロジェクト(メキシコ国立自治大学(UNAM)の教育プログラム(イノバシオンとメジョラミエントデラエンセニャンザ:アポヨプログラム:PAPIME PE203311)によって資金提供されました。 2017年8月の時点で、135のコースに登録された11495獣医学部の学部生と卒業生のビデオ講義、オーディオブック、オンラインノートを保持しています。

13 ニュージーランド

14 パレスチナ

  • Al-Quds University-900以上のコースで12,000人以上のユーザー。 Al-Quds Universityは2004年にmoodleの使用を開始しました。

15 フィリピン

  • フィリピン大学ディリマン校の大学仮想学習環境[UVLe-uvle.up.edu.ph]は、約22,000人の学生と教職員向けに高度にカスタマイズされたMoodleです。 UVLeは、UP Diliman Interactive Learning Centerによって維持管理されています。関連するが別個のインストールはovle.upd.edu.phにあります。

  • Ateneo de Zamboanga大学-10,000人以上の教員、スタッフ、学生(2002年からMoodleの使用を開始)

  • 農業および漁業向けのeラーニング2007年にMoodleの使用を開始しました。2013年2月現在、LAMP経由のMoodle 1.9+の単一インスタンスに13950人以上の登録ユーザーがいます。さまざまな農業および漁業のトピックに関する証明書コースと無料のデジタルリソースを提供しています。すべてのオンラインコースは、ローリングモードでスケジュールされたSCORMで行われます。サイトは、国の農業省の農業訓練研究所によって維持されています。

  • http://online.benilde.edu.ph -De La Salle-15000人以上のユーザーの教職員と学生を持つサンベニルデ大学(2004年からmoodleの使用を開始)

16 ポルトガル

17 南アフリカ

  • グラハムズタウンのロードス大学は、550人以上の教師を含む1万人以上の登録ユーザーと現在接続している機関LMS RUとして、Moodleのインスタンスを実行しています。

18 スペイン

  • Universitat JaumeI。2004年以降の公式VLE。2009年2月に実在ユーザー13.600人(学生12500人、教師1.100人)、アクティブコース1.300人。Moodle1.9.x。

  • 2005年9月にカタルーニャ大学のLa Universitat Politecnica deCataluñaが3.000人の学生を対象にMoodleのパイロットインストールを開始しました。 2006年9月に、古いキャンパスからMoodleへの移行が完了し、30.00人以上の学生が参加します。ElキャンパスAtenea 4は、Moodle 1.4.5を実行し、2006年9月にMoodle 1.5.3に更新されます。独自の情報システム。
    学術管理情報システム「Prisma」との統合。
    Internalmail(UPCでも開発)は、電子メールの内部システムとして使用されます。
    upcライブラリシステムとのMoodle統合。
    スペインの大学評価システムへのMoodleの評価の適応。
    そして他のもの

  • ロヴィラ大学とヴィルジリ大学は、3学年にわたってMoodleを使用しています。現在のバージョン1.5.4+は、簡単に1.6.4+に更新される予定です。 2007年3月、22701人のユーザーが登録し、3500のコースで約を作成しました。
    学術管理情報システムとの統合
    共同LDAPユーザーのディレクトリとの統合
    定期的に使用される平均504コース(少なくとも1週間に1回のログ)
    1日に少なくとも1回、平均3200人の学生がログイン
    少なくとも週に1回、平均7200人の学生がログイン
    10500人のユーザー(教師と学生)が先月中に少なくとも1回アクセス(2007年3月26日のデータ)

  • ラスパルマスデグランカナリア大学(ULPGC)-約24.000ユーザー。 1800コース。 4年前に少数のコースのテストパイロットプロジェクトとしてMoodle 1.4を開始しました。現在、ULPGCのすべてのコースの基本サービスとして提供されています。55の公式EUタイトルと、さらに5つのWebのみで提供されています。
    LDAP認証でバージョン1.6.3を使用しています
    カスタムモジュール:ULPGCAssignmentおよびULPGCDialogUe、大幅に変更されたAppointment / Scheduler
    小規模なチームアクティビティ用のカスタムグループ/スコープ(グループ割り当てなど)
    通常の集中使用は、コース/生徒の60%によってランク付けされます。

  • バルセロナ大学-7.300コースの60.000ユーザー。プロジェクトとして2006年9月に開始されたUB Moodleサイトは、来年9月すべてにオープンします。

  • エストレマドゥーラ大学-約15000人のユーザー。 700コース。

  • アンダルシアブレンデッドラーニング.Junta deAndalucíaの生涯学習サービスの.VLE。実際(2009/2010)1600コースおよび25000前後。それらの間で1500人の教師。来年は35000人のユーザーが期待されています。このVLEは、混合学習用に開発された教材へのオープンアクセスを提供するLifeLong Learning VLEで補完されます。

19 スウェーデン

Linnaeus University-2011年には35.000人の学生と2.000人の従業員-2.000 Moodleコースでは23.000人のMoodleユーザー。

20 台湾

  • 東海大学

    17,000以上の登録ユーザー
    1日で16,000人のユーザーがログイン(最大)
    学期あたり3,000コース
    シングルサインオンのためのnovell ichanとの統合
    学校支援システムとの統合

私たちのmoodleウェブサイト:[1]

21 トリニダード・トバゴ

  • 西インド大学セントオーガスティンキャンパス

    22,000以上の登録ユーザー
    学期ごとに500以上のコース
    1500人以上の教師

2006年からMoodleを使用しています。

22 イギリス

  • The Open University(OU)-遠隔教育に特化した英国で唯一の大学。彼らには約150,000人の学部生と30,000人以上の大学院生がいます。 2010年10月現在、OUのMoodleデータベースには、700,000以上のユーザーと7,000のコースが含まれています。

  • OpenLearn Open Universityのオープンコンテンツイニシアチブ。 2006年5月にウェブサイトの開発が開始され、2006年10月にサイトが開設されました。これは、ウィリアムアンドフローラヒューレット財団からの助成金によって支援されました。 2008年4月までに、5,400時間の学習コンテンツがオンラインで利用可能になります。現在、10,000人を超えるユニークユーザーがいます。

  • グラスゴー大学-20,000人の学生(16,000人の学部生、4,000人の大学院生)、6,000人のスタッフ、20,000人のMoodleユーザー(2008年1月現在)を擁する英国の老舗(設立1451年)かつ有名な研究大学。 Novellとの統合にLDAPを使用し、ユーザー認証にカスタムMISシステムを使用します。彼らのサイトは、適切なテーマ設定を容易にし、サーバー間のバランスを単純化するために、学部ごとに1つのMoodleサイトで構成されています。

23 アメリカ合衆国

  • セントラルピードモントコミュニティカレッジ(CPCC)は、カリキュラムと企業および継続教育の両方にmoodleを使用しています。カリキュラムについては、教員が時間をかけてmoodleに移行するときにBlackboardと並行して実行されます。現在、多くの管理者がこのオプションを好んでいますが、Moodleのみに移行する計画はありません。サーバーには30,000程度のユーザーがいますが、実際のアクティブユーザーの数は大きく異なります。ハイブリッドクラスとフルオンラインクラスの両方に使用されます。 Corporate and Continuing Educationは独自のブランドインスタンスを実行し、遠隔教育にはmoodleのみを使用します。 GED、成人教育、カリキュラム、およびノー​​スカロライナ州シャーロット周辺の7つのキャンパスがサービスを提供する他の分野をカバーする合計約80,000人の学生がいます。

  • サンフランシスコ州立大学(SFSU)は3年以上にわたってmoodleを使用しています。メインキャンパスと拡張学習大学(CEL)にmoodleを使用しています。カリキュラムについては、教員が時間の経過とともにmoodleに移行するにつれて、moodleはBlackboardと並行して実行されていました(SFSUは、2007年6月30日現在、Blackboardを公式に段階的に廃止しました)。サーバーの合計ユーザー数は89K(2007年5月5日現在)で、これらの89Kユーザーのうち、28Kが現在アクティブであると見なされています。コースに関しては、データベースには合計57Kのコースがあり、そのうち約53Kがアクティブと見なされています。また、MoodleをSIMS / Rシステムと統合しました(http://www.sfsu.edu/sims/overview.htmを参照)。また、1つのコースに1,300人以上の学生が参加するコースがあり、多くのクイズ(20以上)とクイズの試みがあります。 SFSUの学生人口は、学部学生、大学院生、最初の専門学生までをカバーしています。

  • StraighterLineは2012年からMoodleを使用して、アメリカ教育評議会の単位として推奨される60の大学レベルの一般教育コースを提供しています。コースは、学生に柔軟で低コストの大学単位の選択肢を提供するために、自己ペースで配信するように設計されています。コースは、米国の75を超える地域認定機関での編入により受け入れられます。

24 ベネズエラ

カテゴリ:インストール管理者
メインページ

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

Use of undefined constant 〇〇 - assumed '〇〇' (this will throw an Error in a future version of PHP)のエラー

問題

Use of undefined constant 〇〇 - assumed '〇〇' (this will throw an Error in a future version of PHP)

というエラーに遭遇した。

解決法

英語で書いてあるとおり
上記の〇〇の部分を '' や ”” で囲っていないことが原因なので確認をする

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

Moodle 3.8 マニュアル - メインページ

原文

メインページ

Docs overview ► Moodle Docs 3.8

はじめよう

さらなるクイックガイド >>

  • Manage your course
  • Set up your course
  • Add students
  • Track progress
  • Upload files

さらに先生へ >>

  • Add activities
  • Use assignments to assess
  • Discuss in forums
  • Test students with a quiz
  • Peer-assess with a workshop

さらに活動へ >>

  • What's new
  • For teachers
  • For students
  • For admins
  • Mobile

新しい機能のリスト >>

さらに管理者へ >>

  • Moodle app
  • View app features
  • Keep up-to-date with notifications
  • Create mobile-friendly courses
  • Add more app features

さらに Moodle アプリへ >>

カテゴリ:インストール管理者

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

Moodle 3.8 マニュアル - 5000 以上のインストール

このページには、国ごとに5,000から10,000人のユーザーがいるMoodleサイトへの説明とリンクがあります。
内容

1 ベルギー
2 クロアチア(フルヴァツカ)
3 フィンランド
4 ナイジェリア
5 スロベニア
6 南アフリカ
7 アメリカ

1 ベルギー

  • KSGWL、Wetteren、Oost-Vlaanderen、10のmoodleインストールで5,000以上の100コース。 Moodleは、デュアル240 2gig RAMの単一サーバーで実行されます。私たちは学校で独自のホスティングを行っています。現在、2400人のアクティブユーザーがいます。

2 クロアチア(フルヴァツカ)

  • ザグレブ大学人文社会科学部-Omega sustav ucenja na daljinuは、学部全体のeラーニングシステムとして使用されています。現在、7.500以上のユーザーと1100以上のコースで1.9.9安定版を実行しています。 LDAP認証。

3 フィンランド

  • ラハティ応用科学大学またはラハデンアンマティコルケアコルは、フィンランドのラハティにあります。約5,400人の学生と、Reppu(フィンランド語で「バックパック」)というMoodleインストールがあります。

  • Kemi-Tornio応用科学大学と多くの中等学校を含むLappia教育連盟には、合計5000人以上のアクティブな学生がいる3つのMoodleインストールがあります。

4 ナイジェリア

  • 連邦工科大学アキュレ、FUTA Elearning Express、アクア州、オンド州-2008年からMoodleをブレンディッドラーニングティーチングシステムに使用しています。このインスタレーションは、年間10,000人以上の学生によって使用されています。

5 スロベニア

  • リュブリャナ大学芸術学部、2006年5月からMoodleを使用。約8000人以上のスタッフと学生アカウント、900人以上のコース。単一のLAMPサーバーで実行。

6 南アフリカ

  • Liberty Lifeのトレーニング部門は、2008年以降、Windowsプラットフォーム(IIS、Windows Server、MSSQL)でMoodle 1.9のインスタンスであるWealth Learning Universityを運営しています。2009年10月現在、ユーザー数は7500〜約50の製品および業界関連のコース。

7 アメリカ

  • Luther College、IA、Decorah、USA今期6,000+ 300コース(FALL-2005)1年半から1年の間、単一サーバーでMoodleを使用。 512 MBのRAMのみがインストールされており、パフォーマンスが低下することはないため、疑いもありませんでした。

  • 米国ペンシルバニア州ランカスター、ペンマナー学区400以上のコースで約5000人のスタッフと学生アカウント。 Moodleは2003年春から使用されており、幼稚園から12年生までの学生/教師向けの仮想教室プラットフォームとして利用されています。単一のIntelサーバー上のLAMPプラットフォーム。

  • GAP Technologies、Online Course Evaluations、Buffalo NY、USA-Moodleと統合して、コース評価を完了するためのシームレスなポータルを提供します。

カテゴリ:インストール管理者
メインページ

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

Laravel の make:model をいい感じに使いたい

こんにちはみなさん

Laravelは割と自由に書かせてくれるので、今作っている分を実装するには楽なんですが、全体として実装が微妙にブレることがあるので、後々変な不整合が出そうで怖くなります。
CakePHPはそのあたりをルールによって縛っていて、よりコード量が少なくなるほど彼らの提供する正しい実装になるようになっています。
まあ、何が言いたいかって言うと、自分の実装をあまり信用していないので、ある程度自動生成してもらえれば、やりやすいんじゃないかなぁって思った次第。

そんなわけで、Laravelで大事なコマンドである make:model に注目していきます。

三行で

  • Laravel artisan コマンドの make:model でモデルを自動生成
  • make:model のオプションで必要なファイルのガワを作れる
  • モデルの名前空間を変えたい場合はコマンド自作して上書き

make:model の基本

make:modelEloquentモデルの自動生成コマンドです。

php artisan make:model Post

これを実行すると、app直下に以下のファイルが生成されます。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

app直下に入れたくない場合は名前空間含めて名前を付ける必要があります。

php artisan make:model Entities/Post

これで、app/Entities配下にPost.phpが生成されます。名前空間も合わせて作られています。

make:model のオプションで付随したファイルを自動生成

モデルというのは、プロダクトの中心にあるものですので、こいつをもとにしていろんな処理を作っていくことになると思っています。モデルを作ったら、そいつを取得するためのコントローラやデータベースの作成、テスト用のファクトリーとかを作っていくことになるわけですが、そういうのはモデルと一緒に作ってしまえばいいのではと考えるわけです。

どんなオプションがあるかは -h オプションで見れます。

php artisan make:model -h
Description:
  Create a new Eloquent model class

Usage:
  make:model [options] [--] <name>

Arguments:
  name                  The name of the class

Options:
  -a, --all             Generate a migration, factory, and resource controller for the model
  -c, --controller      Create a new controller for the model
  -f, --factory         Create a new factory for the model
      --force           Create the class even if the model already exists
  -m, --migration       Create a new migration file for the model
  -p, --pivot           Indicates if the generated model should be a custom intermediate table model
  -r, --resource        Indicates if the generated controller should be a resource controller
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

まあ、all使えばいいのでは、ってことです。

-m: マイグレーションを一緒に作る

EloquentモデルはORMなので、たいていなにかのテーブルとひも付きます。また、Eloquentモデルは、テーブル名の指定がない場合は自身の名前の複数形のテーブルを参照するのですが、そのあたりを考えたくない場合は、その規約にあった名前のテーブルのマイグレーションを予め作っておくのが吉です。

というわけで、マイグレーションを一緒に作ります。

# php artisan make:model Post -m
Model created successfully.
Created Migration: 2020_01_19_073425_create_posts_table

すると、以下のようなファイルができています。

databases/migrations/2020_01_19_073425_create_posts_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

本当はDjangoみたいにモデルの方でデータ型を指定したいところですが。。。こっちのほうがいい部分もあるので、一概にどっちがいいとは言えませんな。

-f: ファクトリーを一緒に作る

モデルを作ったら、そいつのファクトリーを一緒に作っておくのがマナーってやつですよね(????)。
それならいっそ、モデルと一緒に作っちゃえばいいでしょう。

# php artisan make:model Post -f
Model created successfully.
Factory created successfully.

これで次のファイルができています。

paratest/database/factories/PostFactory.php
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Post;
use Faker\Generator as Faker;

$factory->define(Post::class, function (Faker $faker) {
    return [
        //
    ];
});

まあ、ただの空箱ですが。

-c: コントローラを一緒に作る

Webアプリは、極論、Webのリソースに対する操作になりますので、中心となるモデルをどんなふうにいじるかを決定するコントローラを一緒に作る場合があります。
それなら、やっぱり一緒に作っちゃうのが良いのではってことになります。

# php artisan make:model Post -c
Model created successfully.
Controller created successfully.

これででいるわけですが。。。

paratest/app/Http/Controllers/PostController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    //
}

もう少し、こう、scaffolding じみた感じに色々作ってくれていいのだが。。。

-r: リソースコントローラも一緒に作る

-cオプションだと、ただの空箱コントローラが作られましたが、-rオプションを付ければリソースコントローラを作ることができます。

fully.
root@334281a14de2:/var/www# php artisan make:model Post -r
Model created successfully.
Controller created successfully.

コンソールの結果は何も変わりませんが、出力結果が変わります。

paratest/app/Http/Controllers/PostController.php
<?php

namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function show(Post $post)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function edit(Post $post)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Post $post)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function destroy(Post $post)
    {
        //
    }
}

ここまで作ってくれるのなら、デフォルトのコードも作ってくれればいいのに。。。
もちろん、これを作っただけでは動かないので、あとでrouterに登録するのを忘れないようにしましょう。
Route::resource('post', 'PostController');で行けるはずです。

-a: -m, -f, -r 全部入り

ここまでやってきたやつを全部入れるのなら、-aオプションが便利です。

# php artisan make:model Post -a
Model created successfully.
Factory created successfully.
Created Migration: 2020_01_19_081214_create_posts_table
Controller created successfully.

モデル名さえ決めていれば、残りのファイルは一括自動生成!
これが楽だと思います。

もちろん、プロダクトが成長していき、単純な構造ではすまなくなってしまえば、このようにコントローラまで一緒に全部作るというのは厳しいこともあるかもですが、仮説検証のようなとりあえず試してみたいというときであればこれで良いのではと思います。

初期の名前空間を変える

make:modelはモデル名を指定すると、そのままapp直下にクラスファイルが生成されるわけですが、これがLaravelの教えだとしても、個人的にはモデルにそれなりの名前空間をつけておきたいところ。
例えば、モデルは必ずApp\Entitiesに入れるというのであれば、毎回モデルを作るごとにEntities\ModelNameって入力するのは面倒です。

なので、こんなコードをapp/Console/Commands配下に入れます。

MyMakeModel.php
<?php

namespace App\Console\Commands;

use Illuminate\Foundation\Console\ModelMakeCommand;

class MyMakeModel extends ModelMakeCommand
{
    protected function getDefaultNamespace($rootNamespace)
    {
        return $rootNamespace.'\Entities';
    }
}

あとは、普通にphp artisan make:model ModelNameというコマンドを叩くだけで、先に設定した名前空間付きのモデルが作られます。
なお、-r-fなどで、リソースコントローラやファクトリを一緒に作った場合は、モデルの名前空間もちゃんと踏襲してくれていますので、おすすめです。

まとめ

というわけで、Laravelにおけるモデルの自動生成のちょっとした使い方を見てみました。自分でやってて、割と発見があったかなぁという印象です。
機械的に作れるところはとっとと自動生成しちゃって、肝心のモデルの設計を頑張ろうってところでしょうか。

今回はこんなところです。

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

PHPの -> をいつもタイポするのでPHPStormのLive Templateを設定した話

PHPのメソッド呼び出しの -> っていつもタイポしませんか?
^>(隣のキーを押してしまう) とか -.(シフトキー押せてない) とか。

というわけで PHPStrom の Live Template 機能を使って - からスペースキーで -> にしてくれるというのをやってみました。

Preferences から Editor -> Live Templates で設定。

貼り付けた画像_2020_02_09_15_51.png

新しく作るときは他のすでにあるテンプレートを参考にすると良さそうです。

もうこれでタイポしません。スペースキーは大きいのです。

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

phpでgoogle homeを簡易音楽プレイヤー(1曲再生)に

始めに

google home notifierというnodejsのアプリケーションを使うことで、google homeに言葉をしゃべらせたり、音声ファイルの再生ができたりします。いろいろと音声ファイルを試してみると、mp3だけでなく、wavや、m4aファイルも再生できることがわかりました。そこで、常時動作させているraspberry piのサーバにitunesでため込んだCDのファイルを置いて、再生するスクリプトをphpで作ってみました。しかし、当方Web周りのプログラミング経験は皆無であり、phpの本も持っていません。webの情報だけで簡単にできるところまでやってみました。

参考サイト

Google Homeにプッシュ発話をさせる、Raspberry Pi 3へのgoogle-home-notifierの最新導入手順

gooogle homeで時報を知らせる

php文法サイト 多数

目次

  • 準備するもの
  • セットアップ
  • あとがき
  • スクリプト

準備するもの

  • ラズベリーパイ raspbianがインストールされているもの
  • google home
  • itunesに保存されている楽曲ファイル(DRMがないもの)

セットアップ

raspbianがセットアップされたラズベリーパイを準備します。検証にはraspberry pi 3にraspbian busterをインストールしました。これにまずphpスクリプト実行環境をインストールします。
まずはapache2
$ sudo apt install apache2

次にphp一式
$ sudo apt install php7.0 php-cgi libapache2-mod-php php-common php-pear

確認します。

$ cd /var/www/html
$ sudo vi phpinfo.php

phpinfo.php
<?php
phpinfo();
?>

この状態でブラウザで以下のURLでアクセスすると、
http://<raspberry pi のIPアドレス>/phpinfo.php

以下が表示されたらOKです。

無題.png

次にgoogle home notifierをこれ(Google Homeにプッシュ発話をさせる)に従い、インストールします。サイトでのインストール先は~/Development/ghn/ですが、これを~/work/にインストールしております。

インストールがうまくいっているかの確認として、以下のことをします。

$ cd ~/work/node_modules/google-home-notifier/
$ node example.js

他のウインドウから
$ curl -X POST http://localhost:8080/google-home-notifier -d "text=おはよう"

これでgoogle homeが「おはよう」としゃべるはずです。

次にexample.jsを実行しているウィンドウでCtrl-cで実行を停止します。
以前のgoogle home notifierのexample.jsでは、音声ファイルの再生もついていたのですが、最新版ではなくなっているためには、example.jsを変更する必要があります。
viなどでexample.jsを開き、以下のように変更をします。

example.js(before)
  if (text){
    try {
      googlehome.notify(text, function(notifyRes) {
        console.log(notifyRes);
        res.send(deviceName + ' will say: ' + text + '\n');
      });
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }
example.js(after)
  if (text){
    try {
      if (text.startsWith('http')){
        var mp3_url = text;
        googlehome.play(mp3_url, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will play sound from url: ' + mp3_url + '\n');
        });
      } else {
        googlehome.notify(text, function(notifyRes) {
          console.log(notifyRes);
          res.send(deviceName + ' will say: ' + text + '\n');
        });
      }
    } catch(err) {
      console.log(err);
      res.sendStatus(500);
      res.send(err);
    }

try { ... }の中を音声ファイルのURLで再生するように追加いたします。

確認です。テスト用の音声ファイルを/var/www/html/に置きます。ここではtest.wavというファイルを置きます。

$ sudo cp test.wav /var/www/html/

このファイルはURL上から見ることができるようになるので、raspberry piの端末から

$ curl -X POST http://localhost:8080/google-home-notifier -d "text=http://<raspberry piのアドレス>/test.wav"

と入力すると、google homeからtest.wavが再生されます。

ここまで来ましたら、example.jsをサービスとして自動起動するように変更します。
参考サイトはgooogle homeで時報を知らせるです。

まず、先ほど起動したnode example.jsを停止します。
次に、サービスファイルを用意いたします。
$ sudo vi /etc/systemd/system/googlehomenotifier.service

googlehomenotifier.service
[Unit]
Description=google-home-notifier Server
After=syslog.target network-online.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/node example.js
Restart=on-failure
RestartSec=10
KillMode=process
WorkingDirectory=/home/pi/work/node_modules/google-home-notifier

[Install]
WantedBy=multi-user.target

ファイル中のExecStartのnodeのパスは which nodeで出てくるパスを指定して下さい。
WorkingDirectoryは先ほどエディットしたexample.jsがあるディレクトリの絶対パスを指定します。

ファイルが準備できたら
$ sudo systemctl start googlehomenotifier
$ sudo systemctl enable googlehomenotifier
確認として
$ sudo systemctl status googlehomenotifier
Active: active (running)
と表示されていれば、問題なく動作しています。
もう一度curlして動作を確認します。
$ curl -X POST http://localhost:8080/google-home-notifier -d "text=http://<raspberry piのアドレス>/test.wav"

次に音楽ファイルを準備します。
今回itunesで保存しているファイルを一式コピーします。
今回は/home/piの下にitunes/Musicを配置します。
itunes以外のファイルで構成する場合は、itunes/Music以下は、アーティスト/アルバム/XXX.mp3 などのように、3段目に音楽ファイルが来るように構成してください。

その後、itunesディレクトリがURLで見ることができるように、シンボリックリンクを張ります。
$ cd /var/www/html
$ sudo ln -s /home/pi/itunes .

これでやっと簡易音楽プレイヤーの準備が整いました。

今回作成したphpスクリプトplayer.phpを一番下に示します。これを/var/www/html/に置きます。あとは、ブラウザから http:///player.php にアクセスすると、アーティスト一覧が出ます。アーティストをクリックすると、アルバム名の一覧、アルバム名をクリックすると、曲リストがでるので、クリックすると、音楽がgoogle homeから流れるはずです。

あとがき

何せ、phpを書いたことがないphp初心者がwebの検索に頼って作ったスクリプトなので、いろいろツッコミどころ満載と思います。テストと中身の整理等含めて1日くらいの時間でやりました。もっと短くなる、とかツッコミ大歓迎です。

スクリプト

player.php
<body>
<?php
setlocale(LC_ALL, 'ja_JP.UTF-8');
ini_set('display_errors', 1);
session_start();
$_SESSION['pathstr'] = "";
$arr_artist = [];
$arr_album = [];
$arr_track = [];
$ip_address = "XX.XX.XX.XX";  # raspberry piのアドレスを設定
$music_dir = "/home/pi/itunes/Music";  # 音楽ファイルディレクトリの場所を設定

function get_names_of_dir($path) {
  $arr_dir = [];
  foreach(glob($path.'*') as $file){
    if(is_dir($file)){
      $pathdata = pathinfo($file);
      $arr_dir[] = $pathdata["basename"];
    }
  }
  return $arr_dir;
}

function get_names_of_file($path) {
  $arr_file = [];
  foreach(glob($path.'*') as $file){
    if(is_file($file)){
      $pathdata = pathinfo($file);
      $arr_file[] = $pathdata["basename"];
    }
  }
  return $arr_file;
}

function get_path_from_changed_name($arr_path,$name) {
  foreach($arr_path as $tmp) {
    $tmp2 = str_replace("[","",$tmp);
    $tmp3 = str_replace("]","",$tmp2);
    $tmp4 = str_replace(" ","",$tmp3);
    if (strcmp($tmp4, $name) ==  0) { break; }
  }
  return $tmp;
}

chdir($music_dir);
$arr_artist = get_names_of_dir("");

if (isset($_POST["artist"])||isset($_POST["track_back"])) {
  if (isset($_POST["artist"])) {
    $artist =  htmlspecialchars($_POST["artist"], ENT_QUOTES, "UTF-8");
  }
  else {
    $artist =  htmlspecialchars($_POST["track_back"], ENT_QUOTES, "UTF-8");
  }
  $pathstr = get_path_from_changed_name($arr_artist,$artist) ;
  $pathstr = $pathstr.'/';
  $arr_album = get_names_of_dir($pathstr);
}

if (isset($_POST["album"])) {
  $artist_album =  htmlspecialchars($_POST["album"], ENT_QUOTES, "UTF-8");
  $artist = substr($artist_album,0,strpos($artist_album, "_"));
  $album = substr(strrchr($artist_album, "_"),1);

  $pathstr = get_path_from_changed_name($arr_artist,$artist) ;
  $pathstr = $pathstr.'/';
  $arr_album = get_names_of_dir($pathstr);

  $add_pathstr = get_path_from_changed_name($arr_album,$album) ;
  $pathstr = $pathstr.$add_pathstr.'/';
  $pathstr = str_replace("[","\[",$pathstr);
  $pathstr = str_replace("]","\]",$pathstr);
  $arr_track = get_names_of_file($pathstr);
}

if (isset($_POST["track"])) {
  $artist_album_track =  htmlspecialchars($_POST["track"], ENT_QUOTES, "UTF-8");
  $track = substr(strrchr($artist_album_track, "_"),1);
  $artist = substr($artist_album_track,0,strpos($artist_album_track, "_"));
  $artist_album = substr($artist_album_track,0,strrpos($artist_album_track, "_"));
  $album = substr(strrchr($artist_album, "_"),1);

  $pathstr = get_path_from_changed_name($arr_artist,$artist) ;
  $pathstr = $pathstr.'/';
  $arr_album = get_names_of_dir($pathstr);

  $add_pathstr = get_path_from_changed_name($arr_album,$album) ;
  $pathstr = $pathstr.$add_pathstr.'/';
  $pathstr = str_replace("[","\[",$pathstr);
  $pathstr = str_replace("]","\]",$pathstr);
  $arr_track = get_names_of_file($pathstr);

  $add_pathstr = get_path_from_changed_name($arr_track,$track) ;
  $pathstr = $pathstr.$add_pathstr;
  $pathstr = str_replace(" ","\ ",$pathstr);

  exec( "curl -X POST http://localhost:8080/google-home-notifier -d text=http://localhost/itunes/Music/".$pathstr) ;
}

?>
<form action="" method="POST">
  <?php
    if (isset($album)) {
      echo $artist."<br/>";
      echo $album."<br/>";
      foreach($arr_track as $tmp) {
        $tmp2 = str_replace("[","",$tmp);
        $tmp3 = str_replace("]","",$tmp2);
        $var_track = str_replace(" ","",$tmp3); ?>
        <input type="submit" name="track" value=<?php echo $artist."_".$album."_".$var_track ?>  /> <br/>
  <?php
      } ?>
      <input type="submit" name="track_back" value=<?php echo $artist ?> >
  <?php
    }
   elseif (isset($artist)) {
      echo $artist."<br/>";
      foreach($arr_album as $tmp) {
        $tmp2 = str_replace("[","",$tmp);
        $tmp3 = str_replace("]","",$tmp2);
        $var_album = str_replace(" ","",$tmp3); ?>
        <input type="submit" name="album" value=<?php echo $artist."_".$var_album ?>  /> <br/>
  <?php
      } ?>
      <input type="submit" name="album_back" value="artist">
  <?php
    }
    else {
      foreach($arr_artist as $tmp) {
      $var_artist = str_replace(" ","",$tmp); ?>
      <input type="submit" name="artist" value=<?php echo $var_artist ?>  /> <br/>
  <?php
      }
    } ?>
</form>
</body>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PDO】PHPでデータベースに接続する方法【INSERT編】

この記事では、《PHPでデータベースに接続する方法》について、
僕が学習した内容をまとめています。

  • PDOって何なの?
  • PHPでデータベースにどうやって接続するの?
  • データベースに登録したユーザーを検索する機能を実装したい

こういった疑問に答えます。

※本記事は、自分で学習したことのまとめ用として書いています。
尚、PHPの解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。

PDOの基礎

school-2.jpg

現在、PHPでデータベースに接続する際は、『PDO』を使う方法が主流です。そこで、PDOの基本的な使い方を解説していきます。

概要:PDOとは?

PDO』とは『PHP Data Objects』の略で、ざっくり言うと…

PHPからデータベースへいい感じにアクセスしてくれるもの

です。

通常データベースサーバーへのアクセスは、以下のようなデータベース固有のドライバが使用されます。

  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle
  • MS SQL Server etc…

ですが・・・

PDOを使用することにより、接続するデータベースにかかわらず、同じ操作でデータにアクセスすることが可能になります。

PDOを使ってPHPでデータベースに接続する方法【ユーザー検索】

startup-1.jpg

PDOを使ってデータベースに接続しユーザー検索するのは、下記の手順で行います。

  1.  PDOクラスをインスタンス化
  2.  プリペアドステートメントを準備する
  3.  値をバインドする
  4.  プリペアドステートメントを実行する
  5.  SELECTの結果を取得する

それでは、ひとつずつ見ていきましょう。

Step①:PDOクラスをインスタンス化

PDOクラスをインスタンス化して、データベースに接続します。

$pdo = new PDO(
    'DSN',
    'ユーザーネーム',
    'パスワード',
    'オプション'
);

上記の通り、インスタンス化するときに引数に必要な情報を記述することで、データベースに接続できます。

※データベースに接続する際は、例外処理を記述する必要がありますが、現時点ではデータベースへ接続する箇所だけ見ていきます。

また、コンストラクタには、以下のような引数を指定します。

  • DSN (Data Source Name) ※必須
  • ユーザー名
  • パスワード
  • オプション

それぞれ簡単に解説していきます。

DSN (Data Source Name) ※必須

データベースに接続するために必要な情報です。
以下に各データベース製品に応じたDSNの書き方が掲載されています.

≫ PHP Manual – PDOクラスのデータベース別DSN一覧

例えば、MySQLの場合は以下のように記述します。

pdo = new PDO(
    'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
    'ユーザー名',
    'パスワード',
    'オプション'
);

● mysql:host
ホスト名またはIPアドレスを指定します。

● dbname
データベース名を指定します。基本的には必須ですが、データベースを後で USE test のようにSQL文で選択する場合は、省略することができます。

● charset
文字セットを指定します。SET NAMES とするのは避けて、ここで指定するべきです。UTF-8ではなくutf8であることに注意してください。ハイフンは入りません。

ユーザー名

ユーザー名を指定します。ルート権限を使う場合は、デフォルトで root です。

パスワード

パスワードを指定します。ルート権限を使う場合は、デフォルトで空白にします。

オプション

接続時のオプションを連想配列で渡します。
オプションについては、次で詳しく解説します。

インスタンス化するときにオプションを設定する方法

データベースに接続するコードを思い出してください。

pdo = new PDO(
    'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
    'ユーザー名',
    'パスワード',
    'オプション'
);

上記のように、PDOクラスをインスタンス化する際にオプションを記述することが可能です。

オプションは連想配列で指定し、下記のような記述になります。

pdo = new PDO(
    'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
    'ユーザー名',
    'パスワード',
    [
        PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE = PDO::FETCH_ASSOC
    ]
);

また、よく使われるオプションについては、以下の通りです。

  1.  PDO::ATTR_ERRMODE
  2.  PDO::ATTR_DEFAULT_FETCH_MODE

ひとつずつ簡単に解説していきます。

オプション①:PDO::ATTR_ERRMODE

SQLでエラーが起こった際の処理について設定します。
尚、デフォルトでは “PDO::ERRMODE_SILENT” と設定されています。

  • PDO::ERRMODE_EXCEPTION
    設定すると、例外(PDOException)を投げてくれます。基本的にこれを選択しておきます。
  • PDO::ERRMODE_WARNING
    設定すると、E_WARNINGメッセージを出力します。 この設定が返すのはE_WARNINGなので、スクリプトは停止されません。
  • PDO::ERRMODE_SILENT
    デフォルトのエラー設定。エラー内容は保持しているが、エラーメッセージは出力しません。

オプション②:PDO::ATTR_DEFAULT_FETCH_MODE

fetchメソッドや、fetchAllメソッドで引数が省略された場合のフェッチスタイル(配列のパターン)を設定します。
尚、デフォルトでは “PDO::FETCH_BOTH” と設定されています。

  • PDO::FETCH_ASSOC
    カラム名をキーとする連想配列を返します。基本的にこれを選択しておきます。
  • PDO::FETCH_BOTH
    カラム名と、0から始まるカラム番号をキーとする配列を返します。
  • PDO::FETCH_NUM
    0から始まるカラム番号をキーとする配列を返します。
  • PDO::FETCH_OBJ
    カラム名と同名のプロパティを有するオブジェクトを返します。

Step②:プリペアドステートメントを準備する

executeメソッドによって実行されるプリペアドステートメントを準備します。

  • プレースホルダ
    ユーザが入力した内容を後から挿入するために、予め確保した場所のこと。
  • プリペアドステートメント
    SQL文で値がいつでも変更できるように、変更する箇所だけ変数のようにしたSQL文を作る仕組みのことです。 通常「プリペアドステートメント」は「プレースホルダ」を使うために作られます。

プレースホルダには…

  • 疑問符プレースホルダ
  • 名前付きプレースホルダ

の2種類がありますが、仮にこれらが混ざってしまうと…

SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

が発生するので、どちらか片方を選択してください。

尚、ここでは『名前付きプレースホルダ』についてのみ解説します。

名前付きプレースホルダ

  • :を頭につけ、半角英数字とアンダースコアにて構成
  • バインド時の頭の:は省略可能

PDOクラスのprepareメソッドを使い、SQL文を実行する準備を行います。

prepareメソッドは、返り値としてPDOStatementのインスタンスを返します。

仮に、データベースサーバーが文を準備できなかった場合、 prepareメソッドは FALSE を返すか、例外(PDOException)をスローします。(エラー処理の方法に依存します)

下記では、作成されたインスタンスを変数$stmtに代入しています。

$spl = (
    'INSERT INTO
        'テーブル名'(USER_ID, USER_NAME, PASSWORD)
    VALUES
        (:USER_ID, :USER_NAME, :PASSWORD)'
);

$stmt = $pdo->prepare($sql);

Step③:値をバインドする

値をバインドするには、bindValueメソッドまたはbindParamメソッドを使います。
ここでは、bindValueを使って値をバインドします。

bindValueメソッドを使うときは、下記のように記述します。

bindValue(パラメータ, バインドする値, データ型;

第1引数には、『パラメータ』を指定します。
パラメータは、『名前付きプレースホルダ』の場合は『:パラメータ』となります。

また・・・

『疑問符プレースホルダ』の場合は、『1からはじまる値』になります。

第2引数には、『バインドする値』を指定します。

第3引数には、『データ型』を指定します。
データ型は、定義済み定数を指定します。

ちなみに・・・

主な定義済み定数は、下記の通りです。

  • PDO::PARAM_BOOL ⇨ 真偽型
  • PDO::PARAM_NULL ⇨ NULL型
  • PDO::PARAM_INT ⇨ 整数型
  • PDO::PARAM_STR ⇨ 文字列型 (デフォルト設定)

デフォルトでは、 PDO::PARAM_STR が指定されているので、何も指定しないとデフォルト値になります。

『名前付きプレースホルダ』を用いた場合は、下記のように記述します。

// パラメータ
$spl = ('
    SELECT USER_ID, USER_ID, PASSWORD
    FROM テーブル名
    WHERE USER_ID = :USER_ID AND USER_ID = :USER_NAME AND PASSWORD = :PASSWORD'
);

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

Step④:プリペアドステートメントを実行する

プリペアドステートメントを実行するには、executeメソッドを使います。

// パラメータ
$spl = ('
    SELECT USER_ID, USER_ID, PASSWORD
    FROM テーブル名
    WHERE USER_ID = :USER_ID AND USER_ID = :USER_NAME AND PASSWORD = :PASSWORD'
);

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

// 実行
$stmt->execute();

Step⑤:SELECTの結果を取得する

データを取得するには、下記の2つの方法があります。

  1.  fetchメソッドでデータを取得する
  2.  fetchAllメソッドでデータを取得する

それでは、ひとつずつ見ていきましょう。

方法①:fetchメソッドでデータを取得する

fetchメソッドは、該当するデータを配列として1行のみ取得します。

また・・・

該当するデータがない場合は常に FALSE を返します。

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

// 実行
$stmt->execute();

// 結果を取得する
$row = $prepare->fetch();

方法②:fetchAllメソッドでデータを取得する

fetchAllメソッドは、該当する全てのデータを配列として返します。

取得結果がゼロ件だった場合は空の配列を返し、 失敗した場合は FALSE を返します。

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

// 実行
$stmt->execute();

// 結果を取得する
$row = $prepare->fetchAll();

まとめ:基本コーディング

そして、まとめると、下記が書き方のテンプレになります。

<?php

try {

    // リクエストから得た変数をチェックする等の処理
    $user_id = "ここにユーザーIDが入ります";
    $user_name = "ここにユーザー名が入ります";
    $password = "ここにパスワードが入ります";

    // データベース接続設定
    $pdo = new PDO(
        'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
        'ユーザー名',
        'パスワード',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    );

    // パラメータ
    $spl = (
        'SELECT USER_ID, USER_ID, PASSWORD
        FROM テーブル名
        WHERE USER_ID = :USER_ID AND USER_ID = :USER_NAME AND PASSWORD = :PASSWORD'
    );

    // プリペアドステートメントを用意
    $stmt = $pdo->prepare($sql);

    // 値をバインドする
    $stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
    $stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
    $stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

    // 実行
    $stmt->execute();

    // 結果を取得する
    $row = $prepare->fetch();

} catch (PDOException $e) {

    // エラー処理

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

Moodle 3.8 マニュアル - 1000 以上のインストール

原文

1000 以上のインストール

このページには 1000 から 5000 の間の Moodle サイトの国の記述とリンクがあります。
内容

1 アルゼンチン
2 オーストラリア
3 ベルギー
4 カナダ
5 カタロニア
6 チョコ共和国
7 フィンランド
8 イタリア
9 日本
10 オランダ
11 ノルウェー
12 スペイン
13 スイス
14 イギリス
15 アメリカ合衆国

1 アルゼンチン

  • Universidad Austral-キャンパスバーチャルUAは2009年からMoodleを大学院および学部コースの混合および遠隔学習に採用しました。約200人の教師と3000人以上の生徒がいます。

2 オーストラリア

  • バーモントセカンダリーカレッジ-[1]は2004年から大学のイントラネット、ポータル、eラーニングとして使用されています。教師と7〜12歳の生徒で構成される約1500人のユーザーがいます。 Moodleの使用はオプションですが、すべての学習領域とスタッフ管理で180を超えるコースが作成されています。大学内のすべてのイベントはカレンダーに常に追加され、学校コミュニティに通知されます。

  • リバービューのセントイグナティウスカレッジ-[2]-オーストラリア、シドニーのイエズス会カレッジ、学生1,600人。 2007年にMoodleを採用しました。

3 ベルギー

  • Sint-Ritacollege私たちは12〜18歳の生徒向けの学校です。現在、データベースには約1600人のアクティブユーザーと130のコースが含まれています。バージョン1.0.8以降、常に最新のMoodleコードを実行しています。

4 カナダ

  • ノースコースト遠隔教育学校私たちは、ブリティッシュコロンビア州北部の幼稚園から高校生までの遠隔教育学校です。現在、150以上のコースに約2000人のユーザーがいます。 2011年8月からMoodleを使用しています。

    5 カタロニア

  • TERRASSA IES-TERRASSA IES MOODLE-テラッサ中等教育機関。 1300人以上のユーザーがいます。

6 チェコ共和国

  • マサリク大学芸術学部、ブルノ-ELF、合計16,000人以上のユーザー、2006年春学期に4,000人以上のアクティブユーザー、600人以上のコース。 2003年4月からMoodleを使用しています。

  • ブルノ-マサリク大学教育学部-ムードリンクa、合計23,000人以上のユーザー、2011年春学期にアクティブなユーザー3,400人以上、登録可能なコース合計900人以上、昨年中に更新された220コース。 2004年からMoodleを使用し、現在はShibboleth SSOで1.8.xを使用しています。

7 フィンランド

  • Tampere PolytechnicまたはTampereen ammattikorkeakoulu(www.tamk.fi)は、フィンランドのタンペレにある約5000の学生カレッジまたは「応用科学大学」です。私たちのmoodleインストールでは、約2500人のアクティブな学生を受け入れています。

8 イタリア

  • ローマ大学「ローマトレ」-Laboratorio di Tecnologie Audiovisiveは、3700人以上の学生を持つ2つの学部をホストしています。 (2009年4月9日)

9 日本

  • 函館大学-[3]

  • 京都産業大学-[4]日本で最初にMoodleのすべてのコースをホストする大学。

  • 大阪国際大学-[5] 3000人以上のユーザー。

  • 札幌学院大学-[6] Moodleを使用した約40のアクティブコースと、出席のためにそれを使用した150のコース。 3000人以上の登録ユーザー。 LDAPを使用して、5000人の生徒全員が標準の学校IDとパスワードでログインできるようになりました。 1000人の生徒が入学時にMoodleを使用して英語のプレースメントテストを受けます。

10 オランダ

  • 私たちは5000人の学校、1つのサーバー、9つの場所で、Moodleをほぼ3年間使用しています:https://studiewijzerplus.nl 毎学年、ユーザー数のカウントと自動カウンター(ペニーに感謝!)現在3103を指しています

11 ノルウェー

  • ASP Hedmark-pdl.asp-hedmark.no 20の小学校と中学校のある地域には、2000以上のユーザーがインストールされています。 PDL =デジタル学習用プラットフォーム。

12 スペイン

  • CICEI-情報社会のためのイノベーションセンター。現在、幅広いアプリケーションをカバーする72コースで1,042人のユーザーを持つ実稼働Moodleサーバーがあります(2006年2月6日現在)。

  • IES Ingeniero de la Cierva-職業および中等学校Ingeniero de la Ciervaの仮想eラーニング環境、パティーニョ(ムルシア)に設置。現在、1500人以上のユーザーが登録されており、250を超える仮想コースがあります。このサービスは、利他的な方法で、学校のコンピュータサイエンス部門によって完全にサポートおよび維持されています。 2005年にM.A.I.Mによってインストールされ、ムルシア州で使用される最初のeラーニング環境の1つになりました。

13 スイス

  • センターfri-tic-カントンドフリブールのICT統合センター。現在、2000人以上のユーザーと約130のコースで、幼稚園から高校までの教師と生徒向けに1つのmoodleを実行しています。 Center fri-ticは、特定の学校向けに他の9つのmoodleインストールもホストしています。

14 イギリス

  • アルトンカレッジ-2,500人以上のアクティブユーザーがいるビーコン6番目のフォームカレッジ。

  • Egglescliffe School and Sixth Form-2,000人以上のアクティブなムードラーと345のコースがあり、その使用がこのガーディアンの記事の基礎となった専門芸術学校

  • グロスターシャーカレッジ-南西にある一般的なFEカレッジであり、約5,000人のユーザーと約800人のユーザーがいる、英国の多くのMoodleイベントで発表しました。

  • ロンドンのゴールドスミスカレッジ-2,500人以上のアクティブユーザー。 2004年の会議でのこのプレゼンテーションも参照してください。

  • サネットカレッジ-「中規模の一般的なFEカレッジ」。このFerlのケーススタディで文書化されているとおり、Moodleを使用

  • ウェストノッティンガムシャーカレッジ-イーストミッドランズのFEカレッジ。

  • 準備:Life in the United Kingdom Test-Life in the UK Test専用の無料Webサイト。

15 アメリカ合衆国

  • McMurry Universityには、2005年6月にパイロットプロジェクトとして最初に開始されたMoodleインスタンスがいくつかあります。McMurryは、United Methodist教会に所属する小さな(1400 FTE)学部のみの機関です。現在、メインインスタンスは1700人のユーザー(650人がアクティブ)、約60人のインストラクター、および約180人のアクティブコースをサポートしています。

  • ワーナーサザンカレッジは、シンプルなウェブボードシステムから完全な学習管理システムに移行するための実験として、2005年初頭にMoodleの使用を開始しました。実験は非常にうまくいき、2005年秋にMoodleへの完全な移行が完了しました。現在、ワーナーサザンカレッジには、1200人以上の登録ユーザー(500人以上のアクティブな学生、50人以上のインストラクター、80人以上のコース、2つのMoodleインスタンスがあり、システム管理者)は、従来のサイトベースの学生と完全なオンライン学生の両方に準学士号、学士号、および修士号プログラムを提供します。ワーナーサザンカレッジは、神の教会に所属する小さな学校であり、サザンアソシエーションオブカレッジアンドスクールズの認定を受けています。

  • ウェストショアコミュニティカレッジのデータベースには、現在2,000人未満の登録ユーザーが登録されており、Blackboardシステムの潜在的な代替手段として開始されました。私たちのサイトは3年間活動しており、現在、私たちは唯一のLMSとしてMoodleに完全に移行しています。移行は遅かった(そして時々少し苦痛だった)が、今はここにいるので、事態は非常にうまくいきました。

  • Evergreen State Collegeには4,000人以上の登録ユーザーがいます。学校は2005-2006学年からMoodleを使用しています。 CASを認証に使用し、バナーとMoodle IMSプラグインのカスタマイズバージョン上に構築されたカスタムインターフェースを介してバナーから登録を取得します。

  • アリゾナメディカルトレーニングインスティテュートは、アリゾナ州メサにある最前線の医療従事者の教育者です。 2010年から、Moodleを通じて混合学習コースと継続教育クレジットを提供しています。

カテゴリ:インストール管理者
メインページ

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

そろそろaws初めてみよか#2~CodeStarによるコード修正からDeployまで~

はじめに

そろそろaws初めてみよか~まずは触ってみた~で紹介したようにawsの海をもがいている訳ですが(笑)

CodeStarの環境が整ったので試しにコードを編集しCommitしてDeployまで流れるか確認
その後、DBのmigrateをしてみようと思います。
結果からお伝えすると、
- コードCommitからDeployまではOK
- DBのmigrateはNG
でした。

コード編集からDeployまで

Cloud9(IDE)を利用してコードを修正、それをGit CommitしてDeployまでの流れを確認しました。

CodeStarからプロジェクトを選択し、Cloud9を起動します。
暫くするとGitからPullしてきますので確認します。

今回は簡単にWelcomePageのタイトルを修正します。
修正と言っても「!!」を後ろにつけただけという(笑)

01.png

AWSのGitにCommitします。

ec2-user:~/environment $ cd php-laravel/
ec2-user:~/environment/php-laravel (master) $ git add .
ec2-user:~/environment/php-laravel (master) $ git commit -m 'change Title'
[master 42bc467] change Title
 Committer: EC2 Default User <ec2-user@ip-172-31-20-112.us-east-2.compute.internal>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 1 insertion(+), 1 deletion(-)
ec2-user:~/environment/php-laravel (master) $ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 435 bytes | 435.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0)
To https://git-codecommit.us-east-2.amazonaws.com/v1/repos/php-laravel
   a0c0157..42bc467  master -> master
ec2-user:~/environment/php-laravel (master) $ 

すると勝手にDeployまで走っている様子がパイプラインの画面から確認できます。

02.png

実際のアプリケーションを確認するにはCodeStarダッシュボードの「アプリケーションのエンドポイント」をクリック

03.png

見辛いですが、タイトルが変わってます(笑)

04.png

こんな感じで開発していくのは分かるのですが…
本番環境とローカル環境のずれを前回確認しているのでどうやって実際に使っていくのかは
まだイメージできていません(^^;

DBとの接続

環境の確認

CodeStarによりプロジェクトを作成すると実行するインスタンスとCloud9(IDE)用のインスタンスが生成されます。
興味があるのは実行するインスタンス側なのでEC2ダッシュボード画面からインスタンス「php-laravel-WebApp」の「パブリック DNS (IPv4)」にTeraTermで接続します。
※ちなみに前回の記事ではプロジェクト名を「laravel」としてましたが、何度か削除に失敗して「php-laravel」としています。
 関連するリソースが綺麗に消えてくれなくて困っています(笑)


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-172-31-29-127 ~]$ cd /var/www/phplaravel/
[ec2-user@ip-172-31-29-127 phplaravel]$ ls
app        composer.json  database     package.json  resources   storage
artisan    composer.lock  gulpfile.js  phpunit.xml   routes      tests
bootstrap  config         index.php    public        server.php  vendor
[ec2-user@ip-172-31-29-127 phplaravel]$ php artisan migrate


  [Illuminate\Database\QueryException]
  could not find driver (SQL: select * from information_schema.tables where t
  able_schema = homestead and table_name = migrations)



  [PDOException]
  could not find driver

えっと...could not find driverって


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-172-31-29-127 ~]$ cd /var/www/phplaravel/
[ec2-user@ip-172-31-29-127 phplaravel]$ ls -alF
total 220
drwxr-xr-x 12 ec2-user ec2-user   4096 Feb  9 00:01 ./
drwxr-xr-x  8 root     root       4096 Feb  8 19:11 ../
drwxr-xr-x  6 ec2-user ec2-user   4096 Feb  9 00:01 app/
-rw-r--r--  1 ec2-user ec2-user   1646 Feb  9 00:01 artisan
drwxr-xr-x  3 ec2-user ec2-user   4096 Feb  9 00:01 bootstrap/
-rw-r--r--  1 ec2-user ec2-user   1283 Feb  9 00:01 composer.json
-rw-r--r--  1 ec2-user ec2-user 130327 Feb  9 00:00 composer.lock
drwxr-xr-x  2 ec2-user ec2-user   4096 Feb  9 00:01 config/
drwxr-xr-x  5 ec2-user ec2-user   4096 Feb  9 00:01 database/
-rw-r--r--  1 ec2-user ec2-user    543 Feb  9 00:01 .env
-rw-r--r--  1 ec2-user ec2-user    543 Feb  9 00:00 .env.example
-rw-r--r--  1 ec2-user ec2-user     61 Feb  9 00:01 .gitattributes
-rw-r--r--  1 ec2-user ec2-user     80 Feb  9 00:01 .gitignore
-rw-r--r--  1 ec2-user ec2-user    558 Feb  9 00:01 gulpfile.js
-rw-r--r--  1 ec2-user ec2-user   1776 Feb  9 00:01 index.php
-rw-r--r--  1 ec2-user ec2-user    390 Feb  9 00:00 package.json
-rw-r--r--  1 ec2-user ec2-user    930 Feb  9 00:01 phpunit.xml
drwxr-xr-x  5 ec2-user ec2-user   4096 Feb  9 00:01 public/
drwxr-xr-x  5 ec2-user ec2-user   4096 Feb  9 00:01 resources/
drwxr-xr-x  2 ec2-user ec2-user   4096 Feb  9 00:01 routes/
-rw-r--r--  1 ec2-user ec2-user    563 Feb  9 00:01 server.php
drwxrwxr-x  5 ec2-user apache     4096 Feb  9 00:01 storage/
drwxr-xr-x  2 ec2-user ec2-user   4096 Feb  9 00:01 tests/
drwxr-xr-x 32 ec2-user ec2-user   4096 Feb  9 00:01 vendor/
[ec2-user@ip-172-31-29-127 phplaravel]$ more .env
APP_ENV=local
APP_KEY=base64:CHANGEMECHANGEMECHANGEMECHANGEMECHANGEMECHA=
APP_DEBUG=false
APP_LOG_LEVEL=error
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=
[ec2-user@ip-172-31-29-127 phplaravel]$

「.env」を覗くとローカルホストの「mysql」って書いてあります(汗
でもmysql入ってないし…


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-172-31-29-127 ~]$ rpm -qa | grep mysql
[ec2-user@ip-172-31-29-127 ~]$ 

そんな訳で追加インストール

無いのならインストールするしかないのでまずはPDOのmysqlをインストールしました。
$ sudo yum install -y php73-mysqlnd

するとPDOの例外が変わりましたね。
[PDOException]
SQLSTATE[HY000] [2002] Connection refused

DB_DATABASE、DB_USERNAME、DB_PASSWORDが違うので、これで正解です(笑)

[ec2-user@ip-172-31-29-127 phplaravel]$ sudo yum list *mysql*
Loaded plugins: priorities, update-motd, upgrade-helper
Available Packages
MySQL-python26.x86_64                          1.2.3-11.14.amzn1    amzn-main
MySQL-python27.x86_64                          1.2.3-11.14.amzn1    amzn-main
apr-util-mysql.x86_64                          1.5.4-6.18.amzn1     amzn-main
collectd-mysql.x86_64                          5.8.0-2.19.amzn1     amzn-main
dovecot-mysql.x86_64                           1:2.2.10-5.17.amzn1  amzn-main
exim-mysql.x86_64                              4.92-1.25.amzn1      amzn-updates
freeradius-mysql.x86_64                        2.2.6-7.16.amzn1     amzn-main
libdbi-dbd-mysql.x86_64                        0.8.3-5.1.5.amzn1    amzn-main
lighttpd-mod_authn_mysql.x86_64                1.4.53-1.36.amzn1    amzn-updates
lighttpd-mod_mysql_vhost.x86_64                1.4.53-1.36.amzn1    amzn-updates
mod_auth_mysql.x86_64                          1:3.0.0-18.10.amzn1  amzn-main
mysql.noarch                                   5.5-1.6.amzn1        amzn-main
mysql-bench.noarch                             5.5-1.6.amzn1        amzn-main
mysql-common.noarch                            5.5-1.6.amzn1        amzn-main
mysql-config.x86_64                            5.5.62-1.23.amzn1    amzn-updates
mysql-connector-java.noarch                    1:5.1.12-2.10.amzn1  amzn-main
mysql-connector-odbc.x86_64                    5.1.11-1.12.amzn1    amzn-main
mysql-devel.noarch                             5.5-1.6.amzn1        amzn-main
mysql-embedded.noarch                          5.5-1.6.amzn1        amzn-main
mysql-embedded-devel.noarch                    5.5-1.6.amzn1        amzn-main
mysql-libs.noarch                              5.5-1.6.amzn1        amzn-main
mysql-server.noarch                            5.5-1.6.amzn1        amzn-main
mysql-test.noarch                              5.5-1.6.amzn1        amzn-main
mysql51.x86_64                                 5.1.73-8.72.amzn1    amzn-main
mysql51-bench.x86_64                           5.1.73-8.72.amzn1    amzn-main
mysql51-common.x86_64                          5.1.73-8.72.amzn1    amzn-main
mysql51-devel.x86_64                           5.1.73-8.72.amzn1    amzn-main
mysql51-embedded.x86_64                        5.1.73-8.72.amzn1    amzn-main
mysql51-embedded-devel.x86_64                  5.1.73-8.72.amzn1    amzn-main
mysql51-libs.i686                              5.1.73-8.72.amzn1    amzn-main
mysql51-libs.x86_64                            5.1.73-8.72.amzn1    amzn-main
mysql51-server.x86_64                          5.1.73-8.72.amzn1    amzn-main
mysql51-test.x86_64                            5.1.73-8.72.amzn1    amzn-main
mysql55.x86_64                                 5.5.62-1.23.amzn1    amzn-updates
mysql55-bench.x86_64                           5.5.62-1.23.amzn1    amzn-updates
mysql55-devel.x86_64                           5.5.62-1.23.amzn1    amzn-updates
mysql55-embedded.x86_64                        5.5.62-1.23.amzn1    amzn-updates
mysql55-embedded-devel.x86_64                  5.5.62-1.23.amzn1    amzn-updates
mysql55-libs.i686                              5.5.62-1.23.amzn1    amzn-updates
mysql55-libs.x86_64                            5.5.62-1.23.amzn1    amzn-updates
mysql55-server.x86_64                          5.5.62-1.23.amzn1    amzn-updates
mysql55-test.x86_64                            5.5.62-1.23.amzn1    amzn-updates
mysql56.x86_64                                 5.6.46-1.35.amzn1    amzn-updates
mysql56-bench.x86_64                           5.6.46-1.35.amzn1    amzn-updates
mysql56-common.i686                            5.6.46-1.35.amzn1    amzn-updates
mysql56-common.x86_64                          5.6.46-1.35.amzn1    amzn-updates
mysql56-devel.x86_64                           5.6.46-1.35.amzn1    amzn-updates
mysql56-embedded.x86_64                        5.6.46-1.35.amzn1    amzn-updates
mysql56-embedded-devel.x86_64                  5.6.46-1.35.amzn1    amzn-updates
mysql56-errmsg.x86_64                          5.6.46-1.35.amzn1    amzn-updates
mysql56-libs.i686                              5.6.46-1.35.amzn1    amzn-updates
mysql56-libs.x86_64                            5.6.46-1.35.amzn1    amzn-updates
mysql56-server.x86_64                          5.6.46-1.35.amzn1    amzn-updates
mysql56-test.x86_64                            5.6.46-1.35.amzn1    amzn-updates
mysql57.x86_64                                 5.7.28-1.14.amzn1    amzn-updates
mysql57-common.i686                            5.7.28-1.14.amzn1    amzn-updates
mysql57-common.x86_64                          5.7.28-1.14.amzn1    amzn-updates
mysql57-devel.x86_64                           5.7.28-1.14.amzn1    amzn-updates
mysql57-embedded.x86_64                        5.7.28-1.14.amzn1    amzn-updates
mysql57-embedded-devel.x86_64                  5.7.28-1.14.amzn1    amzn-updates
mysql57-errmsg.x86_64                          5.7.28-1.14.amzn1    amzn-updates
mysql57-libs.i686                              5.7.28-1.14.amzn1    amzn-updates
mysql57-libs.x86_64                            5.7.28-1.14.amzn1    amzn-updates
mysql57-server.x86_64                          5.7.28-1.14.amzn1    amzn-updates
mysql57-test.x86_64                            5.7.28-1.14.amzn1    amzn-updates
nagios-plugins-mysql.x86_64                    1.4.16-5.8.amzn1     amzn-main
perl-DBD-MySQL.x86_64                          4.023-5.17.amzn1     amzn-main
perl-DBD-MySQL55.x86_64                        4.023-5.23.amzn1     amzn-main
perl-DBD-MySQL56.x86_64                        4.023-5.21.amzn1     amzn-main
perl-DateTime-Format-MySQL.noarch              0.04-18.2.amzn1      amzn-main
perl-Time-Piece-MySQL.noarch                   0.05-20.2.amzn1      amzn-main
php-ZendFramework-Db-Adapter-Mysqli.noarch     1.12.20-1.12.amzn1   amzn-main
php-ZendFramework-Db-Adapter-Pdo-Mysql.noarch  1.12.20-1.12.amzn1   amzn-main
php-mysql.x86_64                               5.3.29-1.8.amzn1     amzn-main
php-mysqlnd.x86_64                             5.3.29-1.8.amzn1     amzn-main
php54-mysql.x86_64                             5.4.45-1.75.amzn1    amzn-main
php54-mysqlnd.x86_64                           5.4.45-1.75.amzn1    amzn-main
php55-mysqlnd.x86_64                           5.5.38-2.119.amzn1   amzn-main
php56-mysqlnd.x86_64                           5.6.40-1.143.amzn1   amzn-updates
php70-mysqlnd.x86_64                           7.0.33-1.32.amzn1    amzn-updates
php71-mysqlnd.x86_64                           7.1.33-1.43.amzn1    amzn-updates
php72-mysqlnd.x86_64                           7.2.26-1.19.amzn1    amzn-updates
php73-mysqlnd.x86_64                           7.3.13-1.22.amzn1    amzn-updates
rsyslog-mysql.x86_64                           5.8.10-9.26.amzn1    amzn-main
ruby-mysql.x86_64                              2.8.2-1.11.amzn1     amzn-main

[ec2-user@ip-172-31-29-127 phplaravel]$ sudo yum install -y php73-mysqlnd
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
--> Running transaction check
---> Package php73-mysqlnd.x86_64 0:7.3.13-1.22.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package            Arch        Version                 Repository         Size
================================================================================
Installing:
 php73-mysqlnd      x86_64      7.3.13-1.22.amzn1       amzn-updates      336 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 336 k
Installed size: 812 k
Downloading packages:
php73-mysqlnd-7.3.13-1.22.amzn1.x86_64.rpm                 | 336 kB   00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : php73-mysqlnd-7.3.13-1.22.amzn1.x86_64                       1/1
  Verifying  : php73-mysqlnd-7.3.13-1.22.amzn1.x86_64                       1/1

Installed:
  php73-mysqlnd.x86_64 0:7.3.13-1.22.amzn1

Complete!

[ec2-user@ip-172-31-29-127 phplaravel]$ php artisan migrate


  [Illuminate\Database\QueryException]
  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_s
  chema.tables where table_schema = homestead and table_name = migrations)



  [PDOException]
  SQLSTATE[HY000] [2002] Connection refused


[ec2-user@ip-172-31-29-127 phplaravel]$

RDS(DBサーバ)と接続する準備は整ったのでまたキャプチャー取り始めます(笑)

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

そろそろaws初めてみよか#2

はじめに

そろそろaws初めてみよかで紹介したようにawsの海をもがいている訳ですが(笑)

CodeStarの環境が整ったので試しにコードを編集しCommitしてDeployまで流れるか確認
その後、DBのmigrateをしてみようと思います。
結果からお伝えすると、
- コードCommitからDeployまではOK
- DBのmigrateはNG
でした。

コード編集からDeployまで

Cloud9(IDE)を利用してコードを修正、それをGit CommitしてDeployまでの流れを確認しました。

CodeStarからプロジェクトを選択し、Cloud9を起動します。
暫くするとGitからPullしてきますので確認します。

今回は簡単にWelcomePageのタイトルを修正します。
修正と言っても「!!」を後ろにつけただけという(笑)

01.png

AWSのGitにCommitします。

ec2-user:~/environment $ cd php-laravel/
ec2-user:~/environment/php-laravel (master) $ git add .
ec2-user:~/environment/php-laravel (master) $ git commit -m 'change Title'
[master 42bc467] change Title
 Committer: EC2 Default User <ec2-user@ip-172-31-20-112.us-east-2.compute.internal>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 1 insertion(+), 1 deletion(-)
ec2-user:~/environment/php-laravel (master) $ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 435 bytes | 435.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0)
To https://git-codecommit.us-east-2.amazonaws.com/v1/repos/php-laravel
   a0c0157..42bc467  master -> master
ec2-user:~/environment/php-laravel (master) $ 

すると勝手にDeployまで走っている様子がパイプラインの画面から確認できます。

02.png

実際のアプリケーションを確認するにはCodeStarダッシュボードの「アプリケーションのエンドポイント」をクリック

03.png

見辛いですが、タイトルが変わってます(笑)

04.png

こんな感じで開発していくのは分かるのですが…
本番環境とローカル環境のずれを前回確認しているのでどうやって実際に使っていくのかは
まだイメージできていません(^^;

DBとの接続

環境の確認

CodeStarによりプロジェクトを作成すると実行するインスタンスとCloud9(IDE)用のインスタンスが生成されます。
興味があるのは実行するインスタンス側なのでEC2ダッシュボード画面からインスタンス「php-laravel-WebApp」の「パブリック DNS (IPv4)」にTeraTermで接続します。
※ちなみに前回の記事ではプロジェクト名を「laravel」としてましたが、何度か削除に失敗して「php-laravel」としています。
 関連するリソースが綺麗に消えてくれなくて困っています(笑)


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-172-31-29-127 ~]$ cd /var/www/phplaravel/
[ec2-user@ip-172-31-29-127 phplaravel]$ ls
app        composer.json  database     package.json  resources   storage
artisan    composer.lock  gulpfile.js  phpunit.xml   routes      tests
bootstrap  config         index.php    public        server.php  vendor
[ec2-user@ip-172-31-29-127 phplaravel]$ php artisan migrate


  [Illuminate\Database\QueryException]
  could not find driver (SQL: select * from information_schema.tables where t
  able_schema = homestead and table_name = migrations)



  [PDOException]
  could not find driver

えっと...could not find driverって


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-172-31-29-127 ~]$ cd /var/www/phplaravel/
[ec2-user@ip-172-31-29-127 phplaravel]$ ls -alF
total 220
drwxr-xr-x 12 ec2-user ec2-user   4096 Feb  9 00:01 ./
drwxr-xr-x  8 root     root       4096 Feb  8 19:11 ../
drwxr-xr-x  6 ec2-user ec2-user   4096 Feb  9 00:01 app/
-rw-r--r--  1 ec2-user ec2-user   1646 Feb  9 00:01 artisan
drwxr-xr-x  3 ec2-user ec2-user   4096 Feb  9 00:01 bootstrap/
-rw-r--r--  1 ec2-user ec2-user   1283 Feb  9 00:01 composer.json
-rw-r--r--  1 ec2-user ec2-user 130327 Feb  9 00:00 composer.lock
drwxr-xr-x  2 ec2-user ec2-user   4096 Feb  9 00:01 config/
drwxr-xr-x  5 ec2-user ec2-user   4096 Feb  9 00:01 database/
-rw-r--r--  1 ec2-user ec2-user    543 Feb  9 00:01 .env
-rw-r--r--  1 ec2-user ec2-user    543 Feb  9 00:00 .env.example
-rw-r--r--  1 ec2-user ec2-user     61 Feb  9 00:01 .gitattributes
-rw-r--r--  1 ec2-user ec2-user     80 Feb  9 00:01 .gitignore
-rw-r--r--  1 ec2-user ec2-user    558 Feb  9 00:01 gulpfile.js
-rw-r--r--  1 ec2-user ec2-user   1776 Feb  9 00:01 index.php
-rw-r--r--  1 ec2-user ec2-user    390 Feb  9 00:00 package.json
-rw-r--r--  1 ec2-user ec2-user    930 Feb  9 00:01 phpunit.xml
drwxr-xr-x  5 ec2-user ec2-user   4096 Feb  9 00:01 public/
drwxr-xr-x  5 ec2-user ec2-user   4096 Feb  9 00:01 resources/
drwxr-xr-x  2 ec2-user ec2-user   4096 Feb  9 00:01 routes/
-rw-r--r--  1 ec2-user ec2-user    563 Feb  9 00:01 server.php
drwxrwxr-x  5 ec2-user apache     4096 Feb  9 00:01 storage/
drwxr-xr-x  2 ec2-user ec2-user   4096 Feb  9 00:01 tests/
drwxr-xr-x 32 ec2-user ec2-user   4096 Feb  9 00:01 vendor/
[ec2-user@ip-172-31-29-127 phplaravel]$ more .env
APP_ENV=local
APP_KEY=base64:CHANGEMECHANGEMECHANGEMECHANGEMECHANGEMECHA=
APP_DEBUG=false
APP_LOG_LEVEL=error
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=
[ec2-user@ip-172-31-29-127 phplaravel]$

「.env」を覗くとローカルホストの「mysql」って書いてあります(汗
でもmysql入ってないし…


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-172-31-29-127 ~]$ rpm -qa | grep mysql
[ec2-user@ip-172-31-29-127 ~]$ 

そんな訳で追加インストール

無いのならインストールするしかないのでまずはPDOのmysqlをインストールしました。
$ sudo yum install -y php73-mysqlnd

するとPDOの例外が変わりましたね。
[PDOException]
SQLSTATE[HY000] [2002] Connection refused

DB_DATABASE、DB_USERNAME、DB_PASSWORDが違うので、これで正解です(笑)

[ec2-user@ip-172-31-29-127 phplaravel]$ sudo yum list *mysql*
Loaded plugins: priorities, update-motd, upgrade-helper
Available Packages
MySQL-python26.x86_64                          1.2.3-11.14.amzn1    amzn-main
MySQL-python27.x86_64                          1.2.3-11.14.amzn1    amzn-main
apr-util-mysql.x86_64                          1.5.4-6.18.amzn1     amzn-main
collectd-mysql.x86_64                          5.8.0-2.19.amzn1     amzn-main
dovecot-mysql.x86_64                           1:2.2.10-5.17.amzn1  amzn-main
exim-mysql.x86_64                              4.92-1.25.amzn1      amzn-updates
freeradius-mysql.x86_64                        2.2.6-7.16.amzn1     amzn-main
libdbi-dbd-mysql.x86_64                        0.8.3-5.1.5.amzn1    amzn-main
lighttpd-mod_authn_mysql.x86_64                1.4.53-1.36.amzn1    amzn-updates
lighttpd-mod_mysql_vhost.x86_64                1.4.53-1.36.amzn1    amzn-updates
mod_auth_mysql.x86_64                          1:3.0.0-18.10.amzn1  amzn-main
mysql.noarch                                   5.5-1.6.amzn1        amzn-main
mysql-bench.noarch                             5.5-1.6.amzn1        amzn-main
mysql-common.noarch                            5.5-1.6.amzn1        amzn-main
mysql-config.x86_64                            5.5.62-1.23.amzn1    amzn-updates
mysql-connector-java.noarch                    1:5.1.12-2.10.amzn1  amzn-main
mysql-connector-odbc.x86_64                    5.1.11-1.12.amzn1    amzn-main
mysql-devel.noarch                             5.5-1.6.amzn1        amzn-main
mysql-embedded.noarch                          5.5-1.6.amzn1        amzn-main
mysql-embedded-devel.noarch                    5.5-1.6.amzn1        amzn-main
mysql-libs.noarch                              5.5-1.6.amzn1        amzn-main
mysql-server.noarch                            5.5-1.6.amzn1        amzn-main
mysql-test.noarch                              5.5-1.6.amzn1        amzn-main
mysql51.x86_64                                 5.1.73-8.72.amzn1    amzn-main
mysql51-bench.x86_64                           5.1.73-8.72.amzn1    amzn-main
mysql51-common.x86_64                          5.1.73-8.72.amzn1    amzn-main
mysql51-devel.x86_64                           5.1.73-8.72.amzn1    amzn-main
mysql51-embedded.x86_64                        5.1.73-8.72.amzn1    amzn-main
mysql51-embedded-devel.x86_64                  5.1.73-8.72.amzn1    amzn-main
mysql51-libs.i686                              5.1.73-8.72.amzn1    amzn-main
mysql51-libs.x86_64                            5.1.73-8.72.amzn1    amzn-main
mysql51-server.x86_64                          5.1.73-8.72.amzn1    amzn-main
mysql51-test.x86_64                            5.1.73-8.72.amzn1    amzn-main
mysql55.x86_64                                 5.5.62-1.23.amzn1    amzn-updates
mysql55-bench.x86_64                           5.5.62-1.23.amzn1    amzn-updates
mysql55-devel.x86_64                           5.5.62-1.23.amzn1    amzn-updates
mysql55-embedded.x86_64                        5.5.62-1.23.amzn1    amzn-updates
mysql55-embedded-devel.x86_64                  5.5.62-1.23.amzn1    amzn-updates
mysql55-libs.i686                              5.5.62-1.23.amzn1    amzn-updates
mysql55-libs.x86_64                            5.5.62-1.23.amzn1    amzn-updates
mysql55-server.x86_64                          5.5.62-1.23.amzn1    amzn-updates
mysql55-test.x86_64                            5.5.62-1.23.amzn1    amzn-updates
mysql56.x86_64                                 5.6.46-1.35.amzn1    amzn-updates
mysql56-bench.x86_64                           5.6.46-1.35.amzn1    amzn-updates
mysql56-common.i686                            5.6.46-1.35.amzn1    amzn-updates
mysql56-common.x86_64                          5.6.46-1.35.amzn1    amzn-updates
mysql56-devel.x86_64                           5.6.46-1.35.amzn1    amzn-updates
mysql56-embedded.x86_64                        5.6.46-1.35.amzn1    amzn-updates
mysql56-embedded-devel.x86_64                  5.6.46-1.35.amzn1    amzn-updates
mysql56-errmsg.x86_64                          5.6.46-1.35.amzn1    amzn-updates
mysql56-libs.i686                              5.6.46-1.35.amzn1    amzn-updates
mysql56-libs.x86_64                            5.6.46-1.35.amzn1    amzn-updates
mysql56-server.x86_64                          5.6.46-1.35.amzn1    amzn-updates
mysql56-test.x86_64                            5.6.46-1.35.amzn1    amzn-updates
mysql57.x86_64                                 5.7.28-1.14.amzn1    amzn-updates
mysql57-common.i686                            5.7.28-1.14.amzn1    amzn-updates
mysql57-common.x86_64                          5.7.28-1.14.amzn1    amzn-updates
mysql57-devel.x86_64                           5.7.28-1.14.amzn1    amzn-updates
mysql57-embedded.x86_64                        5.7.28-1.14.amzn1    amzn-updates
mysql57-embedded-devel.x86_64                  5.7.28-1.14.amzn1    amzn-updates
mysql57-errmsg.x86_64                          5.7.28-1.14.amzn1    amzn-updates
mysql57-libs.i686                              5.7.28-1.14.amzn1    amzn-updates
mysql57-libs.x86_64                            5.7.28-1.14.amzn1    amzn-updates
mysql57-server.x86_64                          5.7.28-1.14.amzn1    amzn-updates
mysql57-test.x86_64                            5.7.28-1.14.amzn1    amzn-updates
nagios-plugins-mysql.x86_64                    1.4.16-5.8.amzn1     amzn-main
perl-DBD-MySQL.x86_64                          4.023-5.17.amzn1     amzn-main
perl-DBD-MySQL55.x86_64                        4.023-5.23.amzn1     amzn-main
perl-DBD-MySQL56.x86_64                        4.023-5.21.amzn1     amzn-main
perl-DateTime-Format-MySQL.noarch              0.04-18.2.amzn1      amzn-main
perl-Time-Piece-MySQL.noarch                   0.05-20.2.amzn1      amzn-main
php-ZendFramework-Db-Adapter-Mysqli.noarch     1.12.20-1.12.amzn1   amzn-main
php-ZendFramework-Db-Adapter-Pdo-Mysql.noarch  1.12.20-1.12.amzn1   amzn-main
php-mysql.x86_64                               5.3.29-1.8.amzn1     amzn-main
php-mysqlnd.x86_64                             5.3.29-1.8.amzn1     amzn-main
php54-mysql.x86_64                             5.4.45-1.75.amzn1    amzn-main
php54-mysqlnd.x86_64                           5.4.45-1.75.amzn1    amzn-main
php55-mysqlnd.x86_64                           5.5.38-2.119.amzn1   amzn-main
php56-mysqlnd.x86_64                           5.6.40-1.143.amzn1   amzn-updates
php70-mysqlnd.x86_64                           7.0.33-1.32.amzn1    amzn-updates
php71-mysqlnd.x86_64                           7.1.33-1.43.amzn1    amzn-updates
php72-mysqlnd.x86_64                           7.2.26-1.19.amzn1    amzn-updates
php73-mysqlnd.x86_64                           7.3.13-1.22.amzn1    amzn-updates
rsyslog-mysql.x86_64                           5.8.10-9.26.amzn1    amzn-main
ruby-mysql.x86_64                              2.8.2-1.11.amzn1     amzn-main

[ec2-user@ip-172-31-29-127 phplaravel]$ sudo yum install -y php73-mysqlnd
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
--> Running transaction check
---> Package php73-mysqlnd.x86_64 0:7.3.13-1.22.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package            Arch        Version                 Repository         Size
================================================================================
Installing:
 php73-mysqlnd      x86_64      7.3.13-1.22.amzn1       amzn-updates      336 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 336 k
Installed size: 812 k
Downloading packages:
php73-mysqlnd-7.3.13-1.22.amzn1.x86_64.rpm                 | 336 kB   00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : php73-mysqlnd-7.3.13-1.22.amzn1.x86_64                       1/1
  Verifying  : php73-mysqlnd-7.3.13-1.22.amzn1.x86_64                       1/1

Installed:
  php73-mysqlnd.x86_64 0:7.3.13-1.22.amzn1

Complete!

[ec2-user@ip-172-31-29-127 phplaravel]$ php artisan migrate


  [Illuminate\Database\QueryException]
  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_s
  chema.tables where table_schema = homestead and table_name = migrations)



  [PDOException]
  SQLSTATE[HY000] [2002] Connection refused


[ec2-user@ip-172-31-29-127 phplaravel]$

RDS(DBサーバ)と接続する準備は整ったのでまたキャプチャー取り始めます(笑)

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

PHP 上級試験範囲 PDFまとめ

PDFライブラリ

HaruPDFは、オープンソースの外部ライブラリであるlibHaruを使用してPDFファイルを作成する。
PDFlibは、商用の外部ライブラリであるPDFlibを使用してPDFファイルを作成する。
MPFPDFTCPDFはPDFを作成するクラスライブラリで、スクリプト中にインクルードするだけで使用できる。
この4つのPDFライブラリの中でTCPDFのみ、HTMLをもとにPDFを作成することができる。

MPFPDF

MPFPDFの簡単なPDFドキュメントの作成

MPFPDFライブラリを使用して書いた簡単なPDFドキュメントのコード

php
// MBFPDFライブラリの読み込み
require("../fpdf/mbfpdf.php");

// MBFPDFクラスのインスタンスを生成
$pdf = new MBFPDF();

// マルチバイト対応のフォントを追加登録
$pdf->addMBFont(GOTHIC, 'SJIS');

// ページを追加
$pdf->addPage();

// 出力するフォントを設定
$pdf->setFont(GOTHIC, 'B', 16);

// テキストをドキュメント上に配置
$pdf->cell(40, 10, "Hello!");

// 内容をブラウザに送信
$pdf->output();

MBFPDFのPDFドキュメント作成に使用する座標系について

MBFPDFライブラリを使用したPDFドキュメントの作成は、原点(0,0)から作業が開始される。
PDFドキュメントの原点は、ページ中央ではなくそのページの左上の角。

cell()ln()を使用して、指定した量だけ改行したりすることで、座標を移動することができる。
その際、座標を表す単位には、以下のいずれかを指定できる。

  • インチ
  • ポイント
  • ミリメートル
  • センチメートル

座標を表す単位はMBFPDF()コンストラクタメソッドのオプションに指定する。

MBFPDFでのcell()とln()

cell()

cell()は、ページ上にセル(特定の範囲を表す短形のこと)を描画することができる。
以下、できること。

  • 幅や高さ、枠線を指定することができる。
  • テキストを書き込むことができる。
  • 描画後の改行を指定することができる。

ln()

ln()は、改行を行う。

以下、できること。

  • 座標位置を改行することができる。引数に高さを指定することで指定した量だけ下方向に移動することができる。

  • lnでは、改行を行うためx座標は左マージンの位置(x座標が0)になる。

MBFPDFのコンストラクタについて

MBFPDF()コンストラクタメソッドで指定できるパラメータは以下の3つである。

  • 用紙の方向
  • 座標の単位
  • ページのサイズ

MBFPDFライブラリで使用できるフォントの属性について

setFont()では、フォントの種類とスタイルとサイズを指定することができる。
以下の3種類。

  • 太字(B)
  • 下線(U)
  • 斜体(I)

MBFPDFライブラリで使用できるフォントやテキストについて

MBFPDFライブラリでは、フォント定義ファイルがあれば、任意のフォントを含めることができる。
フォントを追加するにはaddFont()を使用する。
テキストの色を変えるにはsetTextColor()を使用する。テキストの色の指定は、赤、緑、青の3原色をそれぞれ数値で指定するが、2番目、3番目を省略することができる。

MBFPDFライブラリを使用してPDFを作成する際のヘッダやフッタについて

ヘッダやフッタは、MBFPDFクラスを継承したクラスを作成し、header()fooder()をオーバーライドして作成する。
なお、親クラスではheader()やfooter()は、空のメソッドとして定義されている。また、header()やfooter()は、ページ出力を行うoutput()呼び出し時に自動的に呼ばれるため、特に意識する必要はない。
現在のページ番号はpageNow()で参照することができる。
一方、総ページ数については、aliasNbPages()を使用することで、{nb}という文字列が総ページ数に置換される。
{nb}という文字列はaliasNbPages()メソッドを呼び出すことで総ページ数に置換されるため、いつでも総ページ数に置換さっれるわけではない。

MBFPDFライブラリを使用してPDFを作成する際の画像の追加

MBFPDFライブラリで画像ファイルを追加するには、使いたい画像ファイルを用意し、image()メソッドを呼び出すことで、PDFに画像を配置できる。

MBFPFライブラリを使用してPDFを作成する際の内部リンク

MBFPDFライブラリを使用して内部リンクを作成するには、まずaddLink()を呼び出してリンク識別子を取得する。取得したリンク識別子は、リンクの開始位置とリンクの移動先を指定する際に使用する。
リンクの開始位置は、リンク識別子をwrite()image()cell()メソッドの引数のリンク部分に指定することで作成する。作成したPDFではクリックできる部分となる。
一方、リンクの移動先はsetLink()をリンク識別子を指定して呼び出すことにより決定する。移動したいリンク先のページの出力部分でsetLink()を呼び出すことにより、内部リンク先のページが決定する。

MBFPFライブラリを使用してPDFを作成する際の外部リンク

MBFPDFライブラリを使用して外部URLへのリンクを作成するには、write()image()cell()の引数のリンク先の外部URLを文字列として渡す。内部リンクのように識別子は必要ない。

参照

徹底攻略 PHP5 技術者認定 [上級] 試験問題集 [PJ0-200]対応

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

【PDO】PHPでデータベースに接続する方法【SELECT編】

この記事では、《PHPでデータベースに接続する方法》について、
僕が学習した内容をまとめています。

  • PDOって何なの?
  • PHPでデータベースにどうやって接続するの?
  • データベースに登録したユーザーを検索する機能を実装したい

こういった疑問に答えます。

※本記事は、自分で学習したことのまとめ用として書いています。
尚、PHPの解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。

PDOの基礎

school-2.jpg

現在、PHPでデータベースに接続する際は、『PDO』を使う方法が主流です。そこで、PDOの基本的な使い方を解説していきます。

概要:PDOとは?

『PDO』とは『PHP Data Objects』の略で、ざっくり言うと…

PHPからデータベースへいい感じにアクセスしてくれるもの

です。

通常データベースサーバーへのアクセスは、以下のようなデータベース固有のドライバが使用されます。

  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle
  • MS SQL Server etc…

ですが・・・

PDOを使用することにより、接続するデータベースにかかわらず、同じ操作でデータにアクセスすることが可能になります。

pdo_php_01.png

ざっくりのイメージ図ですが、PDOはこんな感じの仕事をしているかと思います。

--- MEMO ---
冒頭で『PDO(PHP Data Objects)』を一言で説明すると…
PHPからデータベースへいい感じにアクセスしてくれるもの
と説明しましたが、PDO以外にもdbxなど、データベースに抽象的にアクセスしてくれるものがいくつかあります。
使うデータベース抽象化レイヤによって、対応しているデータベースの種類や処理速度などが異なります。なので、PDO以外にも興味がある方はググってみてください。

PDOを使ってPHPでデータベースに接続する方法【ユーザー検索】

startup-1.jpg

PDOを使ってデータベースに接続しユーザー検索するのは、下記の手順で行います。

1.  PDOクラスをインスタンス化
2.  プリペアドステートメントを準備する
3.  値をバインドする
4.  プリペアドステートメントを実行する
5.  SELECTの結果を取得する

それでは、ひとつずつ見ていきましょう。

Step①:PDOクラスをインスタンス化

PDOクラスをインスタンス化して、データベースに接続します。

$pdo = new PDO(
    'DSN',
    'ユーザーネーム',
    'パスワード',
    'オプション'
);

上記の通り、インスタンス化するときに引数に必要な情報を記述することで、データベースに接続できます。

※データベースに接続する際は、例外処理を記述する必要がありますが、現時点ではデータベースへ接続する箇所だけ見ていきます。

また、コンストラクタには、以下のような引数を指定します。

  • DSN (Data Source Name) ※必須
  • ユーザー名
  • パスワード
  • オプション

DSN (Data Source Name) ※必須

データベースに接続するために必要な情報です。
以下に各データベース製品に応じたDSNの書き方が掲載されています.

≫ PHP Manual – PDOクラスのデータベース別DSN一覧

例えば、MySQLの場合は以下のような書き方をします。

pdo = new PDO(
    'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
    'ユーザー名',
    'パスワード',
    'オプション'
);

● mysql:host
ホスト名またはIPアドレスを指定します。ローカル環境で動かす場合は、省略しても問題ない場合が多いです。

● dbname
データベース名を指定します。基本的には必須ですが、データベースを後で USE test のようにSQL文で選択する場合は、省略することができます。

● charset
文字セットを指定します。SET NAMES とするのは避けて、ここで指定するべきです。UTF-8ではなくutf8であることに注意してください。ハイフンは入りません。

ユーザー名

ユーザー名を指定します。ルート権限を使う場合は、デフォルトで root です。

パスワード

パスワードを指定します。ルート権限を使う場合は、デフォルトで空白にします。

オプション

接続時のオプションを連想配列で渡します。キーはあらかじめ用意されている定数を取ります。値はあらかじめ用意されている定数以外に、論理値・文字列などの一般的な値も取り得ます。
なお、オプションの内容については次で触れますので、詳しい解説はスルーします。

インスタンス化するときにオプションを設定する方法

データベースに接続するコードを思い出してください。

pdo = new PDO(
    'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
    'ユーザー名',
    'パスワード',
    'オプション'
);

PDOクラスをインスタンス化するときにオプションを記述することが可能です。
PDOを使う上で、例外を投げるかどうかなど様々な機能があり、その機能を使うか使わないかをオプションで設定します。

オプションは連想配列で指定します。(わからない方はググってください。)
下記のような記述になります。

pdo = new PDO(
    'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
    'ユーザー名',
    'パスワード',
    [
        PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE = PDO::FETCH_ASSOC
    ]
);

また、よく使われるオプションについては、以下の通りです。

1. PDO::ATTR_ERRMODE
2. PDO::ATTR_DEFAULT_FETCH_MODE

ひとつずつ簡単に解説していきます。

オプション①:PDO::ATTR_ERRMODE

SQL実行でエラーが起こった際にどう処理するかを指定します。
なお、デフォルトでは “PDO::ERRMODE_SILENT” と設定されています。

  • PDO::ERRMODE_EXCEPTION を設定すると例外をスローしてくれます。基本的にこれを選択しておきます。
  • PDO::ERRMODE_WARNING はSQLで発生したエラーをPHPのWarningとして報告します。
  • PDO::ERRMODE_SILENT は何も報告しません。

オプション②:PDO::ATTR_DEFAULT_FETCH_MODE

PDOStatement::fetchメソッドや、PDOStatement::fetchAllメソッドで引数が省略された場合や、ステートメントがforeach文に直接かけられた場合のフェッチスタイルを設定します。
なお、デフォルトでは “PDO::FETCH_BOTH” と設定されています。

  • PDO::FETCH_BOTH
    カラム番号とカラム名の両方をキーとする連想配列で取得する。
  • PDO::FETCH_NUM
    カラム番号をキーとする配列で取得する。
  • PDO::FETCH_ASSOC
    カラム名をキーとする連想配列で取得する。なお、これが一番ポピュラーな設定です。
  • PDO::FETCH_OBJ
    カラム名をプロパティとする基本オブジェクトで取得する。

Step②:プリペアドステートメントを準備する

ユーザー入力を受け取ってSQL文を動的に生成する場合は、プリペアドステートメントとプレースホルダを使わなければなりません.

  • プレースホルダ
    ユーザが入力した内容を後から挿入するために、予め確保した場所のこと。
  • プリペアドステートメント
    SQL文で値がいつでも変更できるように、変更する箇所だけ変数のようにしたSQL文を作る仕組みのことです。 通常「プリペアドステートメント」は「プレースホルダ」を使うために作られます。

プレースホルダには2種類あり、疑問符プレースホルダを使う方法と、名前付きプレースホルダを使う方法があります。

仮にこれらが混ざってしまうと…

SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

が発生するので、どちらか一方のみを選択してください。

尚、ここでは『名前付きプレースホルダ』についてのみ解説します。『疑問符プレースホルダ』についても知りたい方は個人的にググってみてください。

名前付きプレースホルダ

  • :を頭につけ、半角英数字とアンダースコアにて構成する
  • バインド時の頭の:は省略することが出来る

PDOクラスのprepareメソッドを使い、SQL文を実行する準備を行います。
prepareメソッドの返り値としてPDOStatementのインスタンスを受け取ります。
prepareメソッドを使うとPDOStatementをインスタンス化し、作成したインスタンスを返します。
そのため、作成されたインスタンスを変数(下記の記述では$stmt)に代入します。

$spl = (
    'INSERT INTO
        'テーブル名'(USER_ID, USER_NAME, PASSWORD)
    VALUES
        (:USER_ID, :USER_NAME, :PASSWORD)'
);
$stmt = $pdo->prepare($sql);

Step③:値をバインドする

値をバインドするには、PDOStatement::bindValueまたはPDOStatement::bindParamを使います。ここでは、bindValueを使って値をバインドします。

bindValueメソッドを使うときは、下記のように記述します。

bindValue(パラメータID, バインドする値, データ型;

第1引数にはパラメータIDを指定します。
パラメータID、は名前付きプレースホルダの場合は『:名前』となります。また、疑問符プレースホルダの場合は、『1からはじまる値』になります。

第2引数にはバインドする値を指定します。値は直接入力するか、変数を入れて指定します。

第3引数にはデータ型を指定します。
データ型は、PDO::PARAM_からはじまる定義済み定数を指定します。主な定義済み定数は下記になります。

  • PDO::PARAM_STR(デフォルト)⇨ 文字列型
  • PDO::PARAM_INT ⇨ 整数型
  • PDO::PARAM_BOOL ⇨ 真偽型
  • PDO::PARAM_NULL ⇨ NULL型

デフォルトでは、PDO::PARAM_STRが指定されており、省略すると(何も指定しないと)デフォルト値になります。

また、ここで注意すべきは、第3引数に指定したデータ型に必ず変換される訳ではないという点です。

具体例を出して解説すると、例えば下記の記述したとします。

$price = '100';

$prepare = $dbh->prepare('SELECT name FROM fruit WHERE price = ?');
$prepare->bindValue(1, $price, PDO::PARAM_INT);

$priceには '100' という文字列を代入しています。
bindValueの第3引数でPDO::PARAM_INTと整数型を指定していますが、結果的に文字列として処理されてしまいます。

なので・・・

整数型に型変換したいのであればキャストする必要があります。
文字列以外の型を指定するときは、第2引数に型を明示するのが無難で、下記のように記述します。

$price = '100';

$prepare = $dbh->prepare('SELECT name FROM fruit WHERE price = ?');
$prepare->bindValue(1, (int)$price, PDO::PARAM_INT);

第2引数に(int)と記述し、型キャストをしています。
実際に名前付きプレースホルダを用いた場合を見ていきましょう。

// パラメータ
$spl = ('
    SELECT USER_ID, USER_ID, PASSWORD
    FROM テーブル名
    WHERE USER_ID = :USER_ID AND USER_ID = :USER_NAME AND PASSWORD = :PASSWORD'
);

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

// 実行
$stmt->execute();

Step⑤:SELECTの結果を取得する

データを取得するには、下記のような方法があります。

1. fetchメソッドでデータを取得する
2. fetchAllメソッドでデータを取得する

方法①:fetchメソッドでデータを取得する

fetchメソッドは該当するデータを1件のみ配列として返します。そして、該当するデータがない場合はfalseを返します。

また・・・

ループ処理をすることで該当する全てのデータを取得することもできます。
fetchメソッドを使って取得したデータを変数$resultに代入します。

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

// 実行
$stmt->execute();

// 結果を取得する
$row = $prepare->fetch();

方法②:fetchAllメソッドでデータを取得する

fetchAllメソッドは、該当する全てのデータを配列として返します。
fetchメソッドを使って取得したデータを変数$resultに代入します。

// プリペアドステートメントを用意
$stmt = $pdo->prepare($sql);

// 値をバインドする
$stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
$stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
$stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

// 実行
$stmt->execute();

// 結果を取得する 
$row = $prepare->fetchAll(); 

基本コーディング

そして、まとめると、下記が書き方のテンプレになります。

<?php 

try { 
    // リクエストから得たスーパーグローバル変数をチェックするなどの処理

    // データベースに接続
    $pdo = new PDO(
        'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
        'ユーザー名',
        'パスワード',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    ); 

    // パラメータ 
    $spl = (
        'SELECT USER_ID, USER_ID, PASSWORD)
        FROM テーブル名
        WHERE USER_ID = :USER_ID AND USER_ID = :USER_NAME AND PASSWORD = :PASSWORD'
    );

    // プリペアドステートメントを用意
    $stmt = $pdo->prepare($sql);

    // 値をバインドする
    $stmt->bindValue(':USER_ID', $user_id, PDO::PARAMS_STR);
    $stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
    $stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);

    // 実行
    $stmt->execute(); 

    // 結果を取得する
    $row = $prepare->fetch();

} catch (PDOException $e) {

    // エラー処理

}

まとめ

panorama-2.jpg

PDOについて基礎の基礎は理解できたかと思います。
今回はPDOでデータベースに接続する方法の解説なので、例外処理などについては触れていません。
なので、より深く、より正確に理解するために下記の記事も読んでください。

また・・・

POSTなどでユーザーから値を受け取るときは、入力された値を必ずチェックする必要があります。
なので、下記の記事も読んでおきましょう。

そもそも、GETやPOSTを理解していない方は、下記を読んでください。

そして・・・

下記にPHP関連の記事をまとめていますので、初心者の方はぜひご覧ください。

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