专题栏目
  • 濠电姷鏁搁崑鐐哄垂鐠轰警娼栫紓浣股戦崣蹇涙煕閹炬瀚惔濠囨煙閸忚偐鏆橀柛鏂块閻e灚绗熼埀顒勫箖濡ゅ懎鎹舵い鎾跺剱閳ь剙鐭傞弻娑㈡倷閼碱剛楔闂佽鍠栫紞濠傜暦閸洘鐓ラ悗锝庝憾娴硷拷
  • 闂傚倸鍊风粈渚€骞夐敓鐘参﹂柣鎰暩閻棗銆掑锝呬壕閻庤娲╃紞渚€鐛鈧鍫曞箣閻樼數宓侀梺鑽ゅ枑缁瞼绮旈崜浣虹=闁规崘顕х粻姘辨喐濠婂牆鍚规俊銈呮噺閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹
  • 缂傚倸鍊搁崐椋庣矆娓氣偓钘濆ù鍏兼綑閸ㄥ倿鏌i姀鐘差棌闁轰礁妫濋弻锝夊籍閸屾艾浠橀梺娲诲幗椤ㄥ﹪寮婚悢琛″亾濞戞瑡缂氱紒鐘成戠换娑㈠礂閸忕⒈妫冮梺璇″枛閸㈡煡鍩㈡惔銈囩杸闁圭虎鍨版禍楣冩煕濠靛嫬鍔ょ紒鎲嬬畵閺岀喖顢涢崱妤勫婵炲牜鍋婂铏规崉閵娿儲鐝㈤梺鐟板殩閹凤拷
  • 闂傚倷娴囧畷鐢稿窗閹扮増鍋¢弶鍫氭櫅缁躲倕螖閿濆懎鏆欐俊顐C妴鎺戭潩閿濆懍澹曟俊銈囧Х閸嬫劙宕戦幘鏂ユ斀闁绘ḿ绮☉褎绻涚仦鍌氣偓婵嗙暦閵忋倕绠虫俊銈呭暙瑜板嫰姊洪幖鐐插妧闁告劏鏅滈鍕磽閸屾瑦绁版い鏃€鍔欓獮蹇涙晸閿燂拷
  • 闂傚倸鍊风粈渚€骞夐敓鐘参﹂柣鎰▕濞撳鏌熼悜妯烩拻闁告宀稿娲垂椤曞懎鍓扮紓浣稿閸嬬喖骞夌粙娆惧悑闁搞儮鏅濇径鍕⒑鐠団€崇€婚悘鐐跺Г椤斿倹绻濈喊澶岀?闁稿绋掗弲鍫曟偩瀹€鈧惌鎾绘煟閹惧磭鐦嶉柛锔诲幗閸忔粓姊洪崹顕呭剰妞ゅ骏鎷�
  • 您现在的位置: 军旅同心-旅游自驾-军旅文学 >> 读书赏析 >> 学习园地 >> 电脑网络 >> 技术文章 >> 正文
    自己动手做一个SQL解释器
    作者:采集员 文章来源:来源于网络 点击数:637 更新时间:2005-9-10 14:36:38
    自己动手做一个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 *(,?.*=.*)+( +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<count($v);$i+=2)
            $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,$regs)) {
          $search = eregi_replace($regs[1]," $regs[1] ",$search);
        }
        while(eregi("([><!] +=)",$search,$regs)) {
          $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<count($ar);$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;
    }
    ?>

    测试例:
    <pre>
    <?php
    //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);

    ?>
    </pre>


    更多
    免责声明:作品版权归所属媒体与作者所有!!本站刊载此文不代表同意其说法或描述,仅为提供更多信息。如果您认为我们侵犯了您的版权,请告知!本站立即删除。有异议请联系我们。
    文章录入:烟灰缸    责任编辑:烟灰缸 
  • 上一篇文章:
  • 下一篇文章:
  • 高级搜索
       
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 网站地图 | 版权申明 | 网站公告 | 管理登录 |