Download CounterをWPプラグイン、PHP:Mysql、ファイル 形式で作成する[第四回]

第三回で作った(改造した)DLカウンターをMySql(Sql)対応にしてみます。
DLしたIPとDLファイル名、時間を記録してPHPで集計表示します。

まずはPHPでMySqlに接続してDATABASE一覧を得ます。

<?php
$host = 'mysql:host=localhost';
$user = 'root';
$pass = 'yourpassword';

try{
    //Sql connect
    $db = new PDO($host,$user,$pass);

    //view databases
    $sql = 'SHOW DATABASES';
    $results = $db->query($sql);

    //$results array echos
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        echo $result[0]."<br>";
    }

    //connect close
    $db = null;
}catch(PDOException $e){
    echo "DB connect failure..." . PHP_EOL;
    echo $e->getMessage();
    exit;
}

ちなみにMySqlがインストールされている事が前提です。
これでDB一覧が得られます。

次にこれの応用で一覧の中に設定したDBが既にあるか判定します。
これは一覧を得るところに指定のものがあったらフラグを立てるという仕様にします

    //array loop
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        //Does the database exist
        if($result[0]==$db_name){
            $exist=true;
        }
    }

これで判定できました。
ではDBが見つかった場合は追記。なかった場合はDBを追加し、テーブルを作ります。
ただ、ここでポイントはINSERT文などに直接変数を入れて実行させることができないのでひと手間必要です。
次のコードを見てください。

    //main
    if($exist){
        $sql = 'use '.$db_name;
        if($db->query($sql)){
            $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
            $sql = $db->prepare($sql);
            $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
            $sql->execute($param);	
        }else{
            echo "Donot use detabase....";
        }
    }else{
        //create database
        $sql = 'CREATE DATABASE '.$db_name;
        if($db->query($sql)){
            $sql = 'use '.$db_name;
                if($db->query($sql)){
                    $sql = 'create table '.$tb_name.' (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,ip varchar(32),filename varchar(2048),dt int(10))';
                    if($db->query($sql)){
                        $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
                        $sql = $db->prepare($sql);
                        $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
                        $sql->execute($param);
                    }else{
                        echo "Donot create table...";
                    }
                }else{
                    echo "Donot use detabase....";
                }
            }else{
                echo 'Donot create database....';
            }
        }

‘INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)’を見てください。
INSERT文を作っているのですが何か変ですよね?:ipって何だ?
これは変数を入れる位置を示した空の値をここでは代入してINSERT文を作ります。
で、array(‘:ip’=>$get_ip,’:file’=>$get_filename,’:time’=>$get_timestamp);で配列を作って後から変数を代入しないとダメなんです。
う~ん。難しい。

ここまでのコード

<?php
////////////////////////////////////////////////
//File DownLoad Counter
//(c)2020 WSPRI J.Amano
//
//https://wspri.dip.jp/
////////////////////////////////////////////////

//変更可能箇所//////////////////////////////////

//password
$pass = "wspri";
//LogoType
$logoType= "https://wspri.dip.jp/wordpress/wp-content/uploads/2020/05/rogo_l.jpg";
//database name
$db_name="dlcount_db";
//table name
$tb_name="count_table";
//sql info
$host = 'mysql:host=localhost';
$user = 'root';
$pass = 'yourpass';

//以下は変更しないでください////////////////////
$exist= false;
$get_ip=$_SERVER["REMOTE_ADDR"];
$get_filename="test";
$get_timestamp=time();
try{
    //Sql connect
    $db = new PDO($host,$user,$pass);

    //view databases
    $sql = 'SHOW DATABASES';
    $results = $db->query($sql);

    //array loop
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        //Does the database exist
        if($result[0]==$db_name){
            $exist=true;
        }
    }
    //main
    if($exist){
        $sql = 'use '.$db_name;
        if($db->query($sql)){
            $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
            $sql = $db->prepare($sql);
            $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
            $sql->execute($param);
        }else{
            echo "Donot use detabase....";
        }
    }else{
        //create database
        $sql = 'CREATE DATABASE '.$db_name;
        if($db->query($sql)){
            $sql = 'use '.$db_name;
            if($db->query($sql)){
                $sql = 'create table '.$tb_name.' (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,ip varchar(32),filename varchar(2048),dt int(10))';
                if($db->query($sql)){
                    $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
                    $sql = $db->prepare($sql);
                    $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
                    $sql->execute($param);
                }else{
                    echo "Donot create table...";
                }
            }else{
                echo "Donot use detabase....";
            }
        }else{
            echo 'Donot create database....';
        }
    }

    //connect close
    $db = null;
}catch(PDOException $e){
    echo "DB connect failure..." . PHP_EOL;
    echo $e->getMessage();
    exit;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です