My own database abstraction class

Back in 2006 July, I decided that all other database classes are not worth it, and created my own one, incorporating best features from MySQL and PHP world. It resulted in this brilliant code, which I showed to few colleagues, and got such quote:

i like your nonframework. it gives a fuzzy feeling to the poor souls that think they need an abstraction layer. — Kristian Köhntopp

This was written using TIC pattern and can be used in variety of applications:

class MyDB {
  var $conn = null;

  function MyDB($database=null,$user='root',
                $password='',$host='localhost') {
    $this->conn=mysql_connect($host,$user,$password) and
    $database?mysql_select_db($database, $this->conn):null;
  }

  function _escape($s) {
    return mysql_real_escape_string($s,$this->conn);
  }

  function _quote($s) {
    return "'" . $this->_escape($s) . "'";
  }

  function __call($method,$arguments) {
    $query=preg_replace_callback('([A-Z]|\d+)',
      create_function('$s',
         'return " ".strtolower($s[0]);'),
         $method);
    $query=str_replace(' everything ',' * ',$query);
    $first=array_shift($arguments);
    if ($first) {
      if (is_array($first)) {
        $query .= ' (' . implode(',',
                            array_map(array(&$this,'_escape'),
                            $first)) . ') ';
      } else {
        while($argument = array_shift($arguments)) {
          $first = preg_replace('/\?/',
                     $this->_quote($argument),$first,1);
        }
        $query .= $first;
      }
    }
    $ret=array();
    $res=mysql_query($query,$this->conn);
    if (!$res) { print mysql_error(); exit(); }
    while($row=mysql_fetch_assoc($res)) {
      $ret[]=$row;
    }
    return $ret;

  }
}

$x = new MyDB('test');
$x->selectEverythingFromMytableWhereIdIn(" (?,?,?) ","a'b",2,3);
$x->SelectBlahFromMytableWhereIdIn(array(1,2,3));
$x->InsertIntoBlahValues(array(1,2,3));
$x->truncateBlah();

Now I wonder where I should build community for this, Google Code or Sourceforge? Or should that be the darling MySQL Forge.

As I started digging my stuff from history, I also managed to upload my past six month pictures to flickr too – including Vienna, Taipei and few other trips.

This entry was posted in mysql, wikitech and tagged , , . Bookmark the permalink.

10 Responses to My own database abstraction class

  1. Chionsas says:

    haha, brilliant! :D

  2. Nerijus B says:

    Nice!

  3. A says:

    Is this an abstraction class ???
    Yeah brilliant, hahahahahahaha

  4. Nerijus B says:

    Try replace function MyDB to
    public function __construct($db = null,..

    function MyDB is php4 construct, not php5

  5. prickett says:

    Yeah, your right. Most DB abstraction libraries out there use up more memory then the rest of a CMS’s code when rendering a page.

    Take pear DB, it uses about 300KB, and MDB2 around 800KB to include the class!

  6. Mindė says:

    Please, don’t even try to build a “community”. The class is awful. I don’t even want to image how complex queries would look like..

  7. Hashar says:

    Does your API support sub selects and union ? You also forgot to optimize your code with ‘//’.

  8. jimbo bimo says:

    rails (active record) has this for years. i have to work with some php coders, and it’s funny to look at their opinions about this class, sorry, but some hardcore php guys just looks so lame with their inside box, phu, sorry inside php thinking.

    about lib, its ok, keep working on it.

  9. Imran Nazar says:

    Love it, I absolutely love it. It could do with a decent UPDATE syntax though.

  10. Pingback: BlogHouse » Blog Archive » PHP izvirtības