【 tulaoshi.com - PHP 】
                             
                               自己动手做一个SQL解释器
在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个SQL解释器就能用数据库的方式来管理了。
这个解释器,能解释常用的SQL命令。你可以自行添加其他功能。
<?php
class DB_text {
  var $conn;
  var $classname = "db_text";
  var $database;
  function on_create() {
  }
  function connect($database_name) {
    $this-database = $database_name;
    if(! file_exists($database_name)) {
      $this-conn = array();
      $this-_close();
    }
    $fp = fopen($this-database,"r");
    $this-conn = unserialize(fread($fp,filesize($this-database)));
    fclose($fp);
  }
  function &query($query) {
    if(eregi("select ",$query)) return $this-_select($query);
    if(eregi("insert ",$query)) return $this-_insert($query);
    if(eregi("delete ",$query)) return $this-_delete($query);
    if(eregi("update ",$query)) return $this-_update($query);
    return array();
  }
  function fetch_row(&$result) {
    if(list($key,$value) = each($result))
      return $value;
    return false;
  }
  function num_rows($result) {
    return count($result);
  }
  /**
   * query的辅助函数
   */
  function _select($query) {
    if(eregi("(order by (.+))",$query,$regs)) {
      $order = $regs[2];
      $query = eregi_replace($regs[1],"",$query);
    }
    if(eregi("(group by (.+))",$query,$regs)) {
      $group = $regs[2];
      $query = eregi_replace($regs[1],"",$query);
    }
    eregi("select .* from ([0-9a-z_]+) *(where +(.+))?",$query,$regs);
    if($regs[3] != "") {
      $keys = $this-_where($regs[3],"$this-conn[$regs[1]]");
      while(list($key,$value) = each($keys)) {
        $rs[] = $this-conn[$regs[1]][$value];
      }
    }else {
      $rs = $this-conn[$regs[1]];
    }
    if($order) {
      sscanf($order,"%s %s",$key,$type);
      if(empty($type)) $type = "asc";
        $this-_sort($rs,$key,$type);
    }
    return $rs;
  }
  function _insert($query) {
    eregi("insert +into +([0-9a-z_]+) *(.+) *values? *(.+)",$query,$regs);
    eval("$key=array$regs[2];");
    eval("$value=array$regs[3];");
    for($i=0;$i<count($key);$i++)
      $rs[$key[$i]] = $value[$i];
    $this-conn[$regs[1]][] = $rs;
    $this-_close();
  }
  function _update($query) {
    eregi("update +([0-9a-z_]+) +set *(,?.*=.*)