【PHP】PHPをbatのようにローカルスクリプトとして使う(2)~DBアクセス編~

【ツールの概要】
PHPに慣れている方にとっては当たり前のことですが、batやVBSのようにサーバー内部の処理を行わせます。
・(1)から進んで、DB「MySQL」へアクセスします。
スクリプトの書き方としては、まずは小規模でVBSとかで親しみやすい関数型みたいな感じです。

【環境(使っている環境)】
Windows 10 Pro (Serverでも動くはず)
PHP 5.6以降?
MySQL 8.0(5.6と5.5とかでも動くはず)

MySQL導入】
(1) MySQLのサイトからダウンロードしてインストールします。
 <インストール参考サイト>
  MySQL :: Download MySQL Community Server
  MySQL入門者でもわかる!3ステップのインストール方…|Udemy メディア
(2) PHPと同様に環境変数PATHを通しておく。→コマンドプロンプトで「mysql -uroot -p」と打ってパスワード入力画面が出るようにしておく。
(3) ここでは、「sample」スキーマ(データベース)を作成して、「user」テーブルを以下の画像のように作っておく。
f:id:hagure_m:20190415000857p:plain

PHPの設定】
php.iniの以下を変更する。
 ・「;extension_dir = "ext"」→「extension_dir = "ext"」 コメントアウトをなくしてextフォルダを参照させる。
 ・「;extension=pdo_mysql」→「extension=pdo_mysql」 コメントアウトをなくしてPDO(MySQL)を有効にする。
可能ならログ出力も有効にして、コマンドプロンプトphp -vを起動したときにエラーが出ていないようにする。

PHP(引数にして実行するPHPファイル(test.php))】

<?php
require_once "D:\\phptest\\common1.php" ;

logging('test.php 起動');

$query = 'SELECT * FROM user WHERE id=2;';
$all = mysqlconnect($query);

// 「//」でコメントアウトしているところはデータが複数ある場合にこうしたら取れるよ的なアレ
// i=0;
// foreach ($all as $data){
//    $id[i] = $data['id'];
//    $name[i] = $data['name'];
//    $address[i] = $data['address'];
//    i++;
// }

// echo (int)$id[0].' '.(string)$name[0].' '.(string)$address[0];
echo (int)$all[0]['id']."\r\n"
    .(string)$all[0]['name']."\r\n"
    .(string)$all[0]['address'];

PHP(関数を記載するPHP(common1.php))】

<?php
define("mysql_schema", "mysql:dbname=sample");
define("mysql_user", "root");
define("mysql_password", "root");

function logging($str)
{
    error_log(date("[Y/m/d H:i:s] ") .rtrim($str). "\r\n", 3, "D:\\phptest\\test_log.txt");
}

function mysqlconnect($query)
{
    try {
        $dbh = new PDO(
             mysql_schema
            ,mysql_user
            ,mysql_password
            ,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
        );
        $sql = $dbh->prepare($query);
        $stmt = $sql->execute();

        if (!$stmt) {
            logging('結果!とれませんでした!!');
            print_r('MySQLエラー_'.$dbh->errorInfo());
        }
        $all = $sql->fetchAll();
        $sql = null;  
        return $all;
    } catch (PDOException $e) {
        logging('error_'.$e->getMessage());
    }
}


【使用方法】
・それぞれソースをコピペして拡張子を「.php」にして、これは「D:\phptest\」に保存します。
・それぞれのファイルパス、フォルダパスに不備がないようにします。アクセス権も注意!
phpコマンドプロンプトで実行します。 →例:「php D:\phptest\test.php

【説明】
PHPファイルを実行すると、require_onceで「common1.php」をrequireします(え。
requireしたことで、「logging」関数を呼び出せるので、そこでログ処理をします。これで「[2019/04/14 14:44:48] test.php 起動」な感じでロギングが簡単にできます。
requireしたことで、「mysqlconnect」関数も呼び出せるので、クエリ文字列を渡すことで、SQLを実行してfetchしたデータを返す関数を実行します。
「'SELECT * FROM user WHERE id=2;'」はざっくり「userテーブルから*(全部)のカラムのデータをセレクトしゃがれ、あ、行はid=2のデータをな!」的な感じです。(こういうところで使う場合は*は良くないけど)
PDOはPHP標準の拡張機能の一つでデータベースとの接続を容易に行えるクラスのことです(参考文献参照)。
ここでは「define」でユーザ名とか対象スキーマ(DB)とかを定義しています。(defineは定数として定義するので、使用するときは「$」が要りません)
DB接続の方法は初心者にはなかなか難しいところですが、オプションとかをキチンと調べるとPDOを利用した接続に落ち着くので理解を頑張ってください(え
結果的に、mysqlconnect関数は二次元配列を呼び出し元へ返します。
そして最後にechoで標準出力に各値を出力します。

 <実行イメージ>
 f:id:hagure_m:20190415004742p:plain


【総評】
正直これだけの説明だとつまずくことも多いと思います。
PHPの設定は「php.ini」、MySQLの設定は「my.ini」をいじって、MySQLはとにかくDBやテーブルをいじってコマンドになれることしかないとおもわれます。
エラー内容からネットを検索すればなんとかなるはず。。だと思います。
これが上手くできるようになれば、会社のMySQLサーバからバッチで定期的にデータを好きなように取得して加工して、、とかが現実的になってきます。


【参考サイト】
PHP: エラーおよびエラー処理 - Manual

PHP: PDO - Manual

PHPでデータベースに接続するときのまとめ - Qiita