做自己的PHP语法解释器,自己动手做一个SQL解释器

自己动手做一个SQL解释器

更新时间:2006年10月09日 00:00:00   作者:

自己动手做一个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);

?>

相关文章

1a1b05c64693fbf380aa1344a7812747.png

我的论坛源代码(八)...2006-10-10

4f55910a645b073bc4fc65dc10dc14bd.png

十天学会php之第六天...2006-10-10

0ea3c7666119d5615e582f823fb3fad6.png

Oracle 常见问题解答...2006-10-10

4f96a78db829b1556ff16de21e013c7a.png

其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异,您最好找本将SQL的书看看。我在这里只介绍一些基本的,其实我也就只懂这些了2006-10-10

8cc1031babc6aff2319f1c6af8544aa0.png

本节主要介绍字符串中字符的访问、整理字符串以及字符串的转码。2011-04-04

0c932a99bb7b6f23c937db507070cc7b.png

http协议里控制浏览器缓存的头有三个Cache-Control,Expires,Last-Modified2010-02-02

cca732bf65a93ed2ec0ac80c638460fe.png

随机广告显示(PHP函数)...2006-10-10

2d9f31f2af7b675a3d153d2b7f1035a7.png

建立文件交换功能的脚本(一)...2006-10-10

b452cee8ec5cd9e58ab98eba17281e59.png

基于mysql的论坛(5)...2006-10-10

f4838ec7e2d4da28e0b57d4e852dadd4.png

今天小编就为大家分享一篇关于PHP htmlentities()函数用法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-02-02

最新评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值