您的位置:首页网页设计PHP实例 → 自己动手做一个SQL解释器

自己动手做一个SQL解释器

时间:2004/11/7 3:30:00来源:本站整理作者:蓝点我要评论(0)

自己动手做一个SQL解释器

在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个SQL解释器就能用数据库的方式来管理了。

这个解释器,能解释常用的SQL命令。你可以自行添加其他功能。




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
      $rs[$key[$i]] = $value[$i];

    $this->conn[$regs[1]][] = $rs;

    $this->_close();

  }

  function _update($query) {

    eregi("update +([0-9a-z_]+) +set *(,?.*=.*)+( +where +(.+))",$query,$regs);

    $regs[2] = eregi_replace(",","=",$regs[2]);

    $v = split("=",$regs[2]);

    $keys = $this->_where($regs[4],"\$this->conn[$regs[1]]");

    while(list($key,$value) = each($keys)) {

      for($i=0;$i
        $this->conn[$regs[1]][$value][$v[$i]] = eregi_replace("'","",$v[$i+1]);

    }

    $this->_close();

  }

  function _delete($query) {

    eregi("delete +from +([0-9a-z_]+) *(where +(.+))?",$query,$regs);

    $keys = $this->_where($regs[3],"\$this->conn[$regs[1]]");

    while(list($key,$value) = each($keys)) {

      unset($this->conn[$regs[1]][$value]);

    }

    reset($this->conn[$regs[1]]);

    while(list($key,$value) = each($this->conn[$regs[1]])) {

      $ch[] = $value;

    }

    $this->conn[$regs[1]] = $ch;

    $this->_close();

  }

  function _where($search,$table) {

    $search = eregi_replace("\("," ( ",$search);

    $search = eregi_replace("\)"," ) ",$search);

    $search = eregi_replace("\+"," + ",$search);

    $search = eregi_replace("\*"," * ",$search);

    while(eregi("[^ ]([*/>
      $search = eregi_replace($regs[1]," $regs[1] ",$search);

    }

    while(eregi("([>
      $search = eregi_replace($regs[1],eregi_replace(" ","",$regs[1]),$search);

    }

    $search = eregi_replace("  "," ",trim($search));

    $search = eregi_replace(" and "," && ",$search);

    $search = eregi_replace(" or "," || ",$search);

    $search = eregi_replace(" = "," == ",$search);

    $ar = split(" ",$search);

    eval("\$t=$table;");



    for($i=0;$i
      if(isset($t[0][$ar[$i]]))

        $ar[$i] = "\$value[".$ar][$i]."]";

    }

    $expr = "\$expl=(".join(" ",$ar).");";

   

    while(list($key,$value) = each($t)) {

      eval($expr);

      if($expl)

        $keys[] = $key;

    }

    return $keys;

  }

  function _sort(&$ar,$key=0,$mode="desc") {

    global $cmp_key;

    $cmp_key = $key;

    if($mode == "asc")

      usort($ar,_cmp_asc);

    else

      usort($ar,_cmp_desc);

  }

  function _close() {

    $fp = fopen($this->database,"w");

    fwrite($fp,serialize($this->conn));

    fclose($fp);

  }

}



/** 排序键

*/

$cmp_key = "";



/** 排序用工作函数(降序 由usort()调用)

*/

function _cmp_desc($a,$b) {

  global $cmp_key;

  if ($a[$cmp_key] == $b[$cmp_key]) return 0;

  return ($a[$cmp_key] > $b[$cmp_key]) ? -1 : 1;

}



/** 排序用工作函数(升序 由usort()调用)

*/

function _cmp_asc($a,$b) {

  global $cmp_key;

  if ($a[$cmp_key] == $b[$cmp_key]) return 0;

  return ($a[$cmp_key] > $b[$cmp_key]) ? 1 : -1;

}

?>



测试例:




//require_once "db_text.php";



$conn = new DB_text;

$conn->connect("text1.txt");



$conn->query("insert into manage (id,title) values (10,'abcd')");

$conn->query("insert into manage (id,title) values (2,'43d')");

$conn->query("insert into manage (id,title) values (20,'tuu')");

$conn->query("update manage set id=101,test='a' where id=10");

//$conn->query("delete from manage where id='10'");

//$conn->query("delete from manage where id=10 or table='code'");





//$rt = $conn->query("select * from manage where id=101 or table='code' group by 1 order by 1 asc");

$rt = $conn->query("select * from manage group by 1 order by id desc");



print_r($rt);



?>






相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 我的php文件怎么打开_php运算符怎么写 php 如何生成静态页面的函数PHP生成图片缩略图PHP session常见问题集锦及解决办法PHP实现同步远程Mysql

人气排行 DEDE在文章列表文章没有缩略图的不显示图片php+mysq修改用户密码我的php文件怎么打开_如何打开php文件的办法FCKeditor的配置和使用方法使用dedecms建站教程PHP+Ajax实现分页技术图片存储与浏览一例Linux+Apache+PHP+MySQLPHP生成图片缩略图