【PHP】mysqli操作クラス【DB操作】

phpでデータベースを扱う際に使っているmysqliオブジェクトの操作クラス。オブジェクト指向的に言えばラッパークラスとなる(のかな?)。

/*
* MyDBクラス
*/
class MyDB
{
    public $mysqli; // mysqliオブジェクト
    public $mode;   // 戻り値の形式:"json" or "array"(連想配列)
    public $count;  // SQLによって取得した行数 or 影響した行数

    // コンストラクタ
    function __construct($mode = "array") 
    {
        $this->mode = $mode;

        // DB接続
        $this->mysqli = new mysqli(DB接続情報['host'], DB接続情報['username'], DB接続情報['passwd'], DB接続情報['dbname']);
        if ($this->mysqli->connect_error) {
            echo $this->mysqli->connect_error;
            exit;
        } else {
            $this->mysqli->set_charset("utf8mb4");
        }
    }

    // デストラクタ
    function __destruct()
    {
        // DB接続を閉じる
        $this->mysqli->close();
    }

    function begin_tran(){
        $this->mysqli->begin_transaction();
    }

    function commit(){
        $this->mysqli->commit();        
    }

    function rollback(){
        $this->mysqli->rollback();        
    }
    function close(){
        $this->__destruct();     
    }

    // SQL実行(SELECT/INSERT/UPDATE/DELETE に対応)
    function query($sql)
    {
        // SQL実行
        $result = $this->mysqli->query($sql);
        // エラー
        if ($result === FALSE) {
            // エラー内容
            $error = $this->mysqli->errno.": ".$this->mysqli->error;
            // 戻り値
            $rtn = array(
                'status' => FALSE,
                'count'  => 0,
                'result' => "",
                'error'  => $error
            );
            if($this->mode == "array")
                return $rtn;
            else
                return json_encode($rtn); // JSON形式で返す(デフォルト)
        }

        // SELECT文以外
        if($result === TRUE) {
            // 影響のあった行数を格納
            $this->count = $this->mysqli->affected_rows;
            // 戻り値
            $rtn = array(
                'status' => TRUE,
                'count'  => $this->count,
                'result' => "",
                'error'  => ""
            );
            if($this->mode == "array")
                return $rtn;
            else
                return json_encode($rtn); // JSON形式で返す(デフォルト)
        } 
        // SELECT文
        else {
            // SELECTした行数を格納
            $this->count = $result->num_rows;
            // 連想配列に格納
            $data = array();
            while ($row = $result->fetch_assoc()) {
                $data[] = $row;
            }
            // 結果セットを閉じる
            $result->close();
            // 戻り値
            $rtn = array(
                'status' => TRUE,
                'count'  => $this->count,
                'result' => $data,
                'error'  => ""
            );
            if($this->mode == "array")
                return $rtn;
            else
                return json_encode($rtn); // JSON形式で返す(デフォルト)
        }
    }

    // 文字列をエスケープする
    function escape($str)
    {
        return $this->mysqli->real_escape_string($str);
    }
}

接続情報は定数で別に宣言していただければすぐに使えます。
「******」は環境毎に変えてください。

define('DB接続情報', array('host'     =>'******',
                          'username' =>'******',
                          'passwd'   =>'******', 
                          'dbname'   =>'******', 
                          'port'     =>'******')
);

使い方はこんな感じです。

$db = new MyDB(); // 上記で作成したクラスのインスタンスを作成
$db->begin_tran(); // トランザクション開始
$result = $db->query("select * from `table`"); // クエリ(SQL)の実行

// 以下クエリ実行結果を使って判定と後続処理を行う
if ($result ["status"] == false ){
	echo '失敗';
}else if($result ["count"] < 1 ){
	echo '0件';
}else{
	foreach($result ["result"] as $key=>$row){
		// 取得したテーブルの行単位で処理を行う場合
	}
}

クエリ実行結果は連想配列(array('status’=>[bool], 'count’ => [int], 'result’ => [object], 'error’ => [string])となっているので、これらを使って判定と後続処理を行ってください。

あとコンストラクタで文字コードを指定しているので、そこも注意してください。昔これでハマりました・・・

最後に

これは確かネットで見つけたものを少しいじって使っていたような。でもそのサイトのURLがわかんなかったので、いつか見つかればリンクを張らせていただきます。申し訳ありません。
やっぱネットで見つけて使わせていただいているものはURLをメモっとかないといけないと再認識させられました。

ほな、また