PHP用の最薄DBアクセスクラス作った

投稿日: 2011年05月19月

PHPのDBアクセスクラス(PostgreSQL用)を書いた。

コンセプトは「薄い」ラッパークラスであること。

ちなみに目的は未だにPEAR DBを使ってたサイトの改修。

最薄のラッパーを書こうとすると自然にこうなる。逆にこれ以上をやるならMDB2とかADOdbとかPDO使えばいいと思われ。

なぜ車輪の再開発したかというと

  • DBアクセスの抽象化はしておきたかった
  • レンサバだとPDO使えない可能性がある
  • (動作が)軽い
  • (容量が)軽い
  • ファイル数を増やさずに済む。この1ファイルだけ。

使い方

<?php

require_once 'database.php'; 

$db = new Database
$res = $db->connect('host=db.example.com dbname=hoge user=hoge password=******');
if($res === false){
  echo 'db connect error!';
  exit;
}

// プリペアドクエリの場合
$res = $db->execute('SELECT * FROM people WHERE name=$1', array('hajime'));
// プリペアドクエリじゃない場合
// $res = $db->query("SELECT * FROM people WHERE name='hajime'");
if($res === false){
  echo 'query error!';
  exit;
}

while(($data = $db->fetch()) !== false){
  print_r($data);
}

クラスのソース

<?php

class Database
{
    private $_handle = null;
    private $_resource = null;

    function connect($connection_string)
    {
        $this->_resource = null;
        $this->_handle = @pg_connect($connection_string);
        if($this->_handle === false){
            $this->_handle = NULL;
            return false;
        }

        return true;
    }

    function query($sql)
    {
        $this->_resource = null;
        $res = @pg_query($this->_handle, $sql);
        if($res === false){
            return false;
        }

        $this->_resource = $res;

        return true;
    }

    function execute($sql, $params = array())
    {
        $this->_resource = null;
        $res = @pg_prepare($this->_handle, '', $sql);
        if(!$res){
            return false;
        }

        $res = @pg_execute($this->_handle, '', $params);
        if($res === false){
            return false;
        }

        $this->_resource = $res;

        return true;
    }

    function fetch()
    {
        return @pg_fetch_assoc($this->_resource);
    }

    function getOne($sql, $params = array())
    {
        $res = $this->execute($sql, $params);
        if($res === false){
            return false;
        }

        foreach($this->fetch() as $v){
            return $v;
        }

        return false;
    }

    function getRow($sql, $params = array())
    {
        $res = $this->execute($sql, $params);
        if($res === false){
            return false;
        }

        return $this->fetch();
    }

    function affectedRows()
    {
        return @pg_affected_rows($this->_resource);
    }

    function getLastError()
    {
        return @pg_last_error($this->_resource);
    }
}

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ