【PHP】じぶんコインのデータベースを作ってみよう

ここ2,3日体調不良が続いており、更新できておりませんでしたがゴロゴロしながらでも検証できるかなぁとPCを開いてみました/(^o^)\

データベースってかっこいいよね

全ID取得するAPIが提供されたので試しに自分が持ってないコイン一覧を取得するスクリプトを作ってみたのですが、愚直にcoinCountAPIを回すだけの記事になりそうなのでやめました^^(allIDで取得したIDをループでまわしてcoinCountで逐一まわしていく感じ、、、、結果だけ書くと888秒くらいで自分の持ってないコインリストは作成できたのですが、APIの呼び出し回数がコインの種類数分なので5000回近く呼び出すことに、、、、)まぁ今回はそんな無茶な呼び出しはしませんw本記事の目的はPHPで自分のコイン枚数を定期的にDBに保存していくみたいなことをしてみたいと思います。youtubeでbucknumberのPVでも流しながら試していきたいと思います。

テスト環境

よく使うのでテスト環境の記事を作っておきました

■今回用意したテストソース

/Applications/MAMP/setting/pdo.ini
/Applications/MAMP/cgi-bin/myscripts/DBconnect.php
/Applications/MAMP/cgi-bin/myscripts/webAPI.php
/Applications/MAMP/cgi-bin/myscripts/ganbaruCoinInfo.php

事前準備

テスト環境のphpMyAdminにログインして、テーブルを事前に作成しておきましょう。
左側のメニューの一番上の[New]を押下

データベース名[jibuncoin],文字コード[utf8_general_ci]にして作成

左側のメニューに[jibuncoin]データベースができるので[New]を押下してテーブルを作成

テーブルはこんな感じでつくりました。
※追記(2018/12/19):文字コードをutf8mb4_general_ciに変更しました。絵文字も利用できるのでこちらが良さそうです

設定ファイル

データベースに接続する用に接続先とかの情報を外部ファイルにまとめてみました

pdo.ini

;';' で始まる行はコメント
;接続先
host = "接続先IPとかポート番号"
;ユーザ名
user = '接続するユーザ名'
;パスワード
password = 'パスワード'

データベース接続用関数

データベース接続は今後よく使いそうなので関数にしてみました。

 <?php
    function db($dbname){
        try {
            //parse_ini_file() は、 filename で指定した ini ファイルをロードし、 連想配列としてその設定値を返します。
            //成功した場合に設定を連想配列形式で返します。 失敗した場合に FALSE を返します。
            //http://php.net/manual/ja/function.parse-ini-file.php
            //iniファイルからDBの情報を取得
            $filename = "/Applications/MAMP/setting/pdo.ini";
            $ini = parse_ini_file($filename);

            $host = $ini[host];
            $user = $ini[user];
            $password = $ini[password];

            $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.';charset=utf8mb4',$user,$password,
            array(PDO::ATTR_EMULATE_PREPARES => false));

            return $pdo;

        } catch (PDOException $e) {

            exit('データベース接続失敗。'.$e->getMessage());

        }
    }
?>

webAPI用関数

こちらのコードが冗長になりそうだったので関数にしてみました。

webAPI.php

<?php
    function wa($url){
        try {
            //cURLのセッション初期化
            $ch = curl_init();

            // オプションを設定(コメントはPHPのリファレンスから引用)
            // 取得する URL 。curl_init() でセッションを 初期化する際に指定することも可能です。
            curl_setopt($ch, CURLOPT_URL, $url); 
            // TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

            //値を取得
            return curl_exec($ch);;

        } catch (Exception $e) {

            exit('なんか失敗したっす'.$e->getMessage());

        }
    }
?>

データベースに情報書き込み!

ここからが本番ですね。エラー処理とか甘めですがとりあえず動くことが前提なのでその辺は後々作り込んで行こうと思います。実行はターミナルから行います!

ganbaruCoinInfo.php

<?php
    //Timezoneをしておく
    date_default_timezone_set('Asia/Tokyo');

    //よく使いそうなものは練習もかねて分割
    //DBに接続するやつ
    require "DBconnect.php";
    //じぶんコインAPI結果取得
    require "webAPI.php";
    $pdo = db("jibuncoin");
    
    try {
        
        $stmt = $pdo -> prepare("INSERT INTO ganbaruCoin (pKey, coinID, coinName, unit, totalCount, coinCount, userName, gDate) VALUES (:pKey, :coinID, :coinName, :unit, :totalCount, :coinCount, :userName, :gDate)");
        $stmt->bindParam(':pKey', $pKey);
        $stmt->bindParam(':coinID', $coinID);
        $stmt->bindParam(':coinName', $coinName);
        $stmt->bindParam(':unit', $unit);
        $stmt->bindParam(':totalCount', $totalCount);
        $stmt->bindParam(':coinCount', $coinCount);
        $stmt->bindParam(':userName', $userName);
        $stmt->bindParam(':gDate', $gDate);

        //WebAPIでがんばるコイン情報を取得
        $_userID = "ganbarumasu0525";
        $_coinID = "ganbarumasu0525";
        $url = "https://crypto-app.tokyo/qCoin/api/api.php?type=coinInfo&coinID=".$_coinID;
        $url2 = "https://crypto-app.tokyo/qCoin/api/api.php?type=coinCount&userID=".$_userID."&coinID=".$_coinID;

        //json_decode — JSON 文字列をデコードする
        //TRUE の場合、返されるオブジェクトは連想配列形式になります。
        $coinInfo = json_decode(wa($url),true);
        $_coinCount = wa($url2);
        
        if($coinInfo != null){
            $pKey = null;
            $coinID = $_coinID;
            $coinName = $coinInfo["coinName"];
            $unit = $coinInfo["unit"];
            $totalCount = $coinInfo["totalCount"];
            if(is_numeric($_coinCount)){
            //ちゃんと値が取得できてたらそのまま代入
                $coinCount = $_coinCount;
            }else{
            //値が取得できてなかったら-1を代入
                $coinCount = -1;
            }
            $userName = $coinInfo["userName"];
            $gDate = date('Y-m-d H:i:s');
    
            $stmt->execute();
        }else{
            echo "値がうまく取得できませんでした!";
        }
        
    } catch (PDOException $e) {

        exit('書き込み失敗。'.$e->getMessage());

    }

?>

実行方法
ターミナルから以下コマンドを実行しました。(環境に合わせて変更してください)

ganbaru$ cd /Applications/MAMP/cgi-bin/myscripts
ganbaru$ pwd
/Applications/MAMP/cgi-bin/myscripts
ganbaru$ php ganbaruCoinInfo.php

実行結果(正常に行が追加されました!)

定期実行

この情報を定期的に収集したいのでcronという機能を使いたいと思います。詳細については各自調べてみてください(丸投げw)。

5分おきに[php ganbaruCoinInfo.php]実行するcronがこちら。

*/5 * * * * php /Applications/MAMP/cgi-bin/myscripts/ganbaruCoinInfo.php

ちゃんと取得できてますね!

感想

5分おきにがんばるコインの情報を保存していくスクリプトが完成しました!やったね。これを利用してリアルタイムにグラフ化とかできたら面白そうだなぁと思ってます。できたら楽しそうですね。ある程度データ収集できたらサーバ側にも同じような仕組みを組み込みたいと思います!また面白そうな世界が広がりそうです!

サーバ側にも同じ仕組み仕込みました

これでPC立ち上げっぱなしじゃなくても24時間データ収集できるようになったと思います!皆さんのエアドロ待ってますw

コメント