查看: 6193|回复: 0
打印 上一主题 下一主题

MySQL方式操作文本数据库

[复制链接]
跳转到指定楼层
1#
发表于 2007-9-7 23:49:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个SQL解释器就能用数据库的方式来管理了。
这个解释器,能解释常用的SQL命令。你可以自行添加其他功能。
  1. <?php
  2. class DB_text {
  3. var $conn;
  4. var $classname = "db_text";
  5. var $database;
  6. function on_create() {
  7. }
  8. function connect($database_name) {
  9. $this->database = $database_name;
  10. if(! file_exists($database_name)) {
  11. $this->conn = array();
  12. $this->_close();
  13. }
  14. $fp = fopen($this->database,"r");
  15. $this->conn = unserialize(fread($fp,filesize($this->database)));
  16. fclose($fp);
  17. }
  18. function &query($query) {
  19. if(eregi("select ",$query)) return $this->_select($query);
  20. if(eregi("insert ",$query)) return $this->_insert($query);
  21. if(eregi("delete ",$query)) return $this->_delete($query);
  22. if(eregi("update ",$query)) return $this->_update($query);
  23. return array();
  24. }
  25. function fetch_row(&$result) {
  26. if(list($key,$value) = each($result))
  27. return $value;
  28. return false;
  29. }
  30. function num_rows($result) {
  31. return count($result);
  32. }

  33. /**
  34. * query的辅助函数
  35. */
  36. function _select($query) {
  37. if(eregi("(order by (.+))",$query,$regs)) {
  38. $order = $regs[2];
  39. $query = eregi_replace($regs[1],"",$query);
  40. }
  41. if(eregi("(group by (.+))",$query,$regs)) {
  42. $group = $regs[2];
  43. $query = eregi_replace($regs[1],"",$query);
  44. }
  45. eregi("select .* from ([0-9a-z_]+) *(where +(.+))?",$query,$regs);
  46. if($regs[3] != "") {
  47. $keys = $this->_where($regs[3],"\$this->conn[$regs[1]]");
  48. while(list($key,$value) = each($keys)) {
  49. $rs[] = $this->conn[$regs[1]][$value];
  50. }
  51. }else {
  52. $rs = $this->conn[$regs[1]];
  53. }
  54. if($order) {
  55. sscanf($order,"%s %s",$key,$type);
  56. if(empty($type)) $type = "asc";
  57. $this->_sort($rs,$key,$type);
  58. }
  59. return $rs;
  60. }
  61. function _insert($query) {
  62. eregi("insert +into +([0-9a-z_]+) *(.+) *values? *(.+)",$query,$regs);
  63. eval("\$key=array$regs[2];");
  64. eval("\$value=array$regs[3];");
  65. for($i=0;$i<count($key);$i++)
  66. $rs[$key[$i]] = $value[$i];
  67. $this->conn[$regs[1]][] = $rs;
  68. $this->_close();
  69. }
  70. function _update($query) {
  71. eregi("update +([0-9a-z_]+) +set *(,?.*=.*)+( +where +(.+))",$query,$regs);
  72. $regs[2] = eregi_replace(",","=",$regs[2]);
  73. $v = split("=",$regs[2]);
  74. $keys = $this->_where($regs[4],"\$this->conn[$regs[1]]");
  75. while(list($key,$value) = each($keys)) {
  76. for($i=0;$i<count($v);$i+=2)
  77. $this->conn[$regs[1]][$value][$v[$i]] = eregi_replace("'","",$v[$i+1]);
  78. }
  79. $this->_close();
  80. }
  81. function _delete($query) {
  82. eregi("delete +from +([0-9a-z_]+) *(where +(.+))?",$query,$regs);
  83. $keys = $this->_where($regs[3],"\$this->conn[$regs[1]]");
  84. while(list($key,$value) = each($keys)) {
  85. unset($this->conn[$regs[1]][$value]);
  86. }
  87. reset($this->conn[$regs[1]]);
  88. while(list($key,$value) = each($this->conn[$regs[1]])) {
  89. $ch[] = $value;
  90. }
  91. $this->conn[$regs[1]] = $ch;
  92. $this->_close();
  93. }
  94. function _where($search,$table) {
  95. $search = eregi_replace("\("," ( ",$search);
  96. $search = eregi_replace("\)"," ) ",$search);
  97. $search = eregi_replace("\+"," + ",$search);
  98. $search = eregi_replace("\*"," * ",$search);
  99. while(eregi("[^ ]([*/><!=-])",$search,$regs)) {
  100. $search = eregi_replace($regs[1]," $regs[1] ",$search);
  101. }
  102. while(eregi("([><!] +=)",$search,$regs)) {
  103. $search = eregi_replace($regs[1],eregi_replace(" ","",$regs[1]),$search);
  104. }
  105. $search = eregi_replace(" "," ",trim($search));
  106. $search = eregi_replace(" and "," && ",$search);
  107. $search = eregi_replace(" or "," || ",$search);
  108. $search = eregi_replace(" = "," == ",$search);
  109. $ar = split(" ",$search);
  110. eval("\$t=$table;");

  111. for($i=0;$i<count($ar);$i++) {
  112. if(isset($t[0][$ar[$i]]))
  113. $ar[$i] = "\$value[".$ar][$i]."]";
  114. }
  115. $expr = "\$expl=(".join(" ",$ar).");";

  116. while(list($key,$value) = each($t)) {
  117. eval($expr);
  118. if($expl)
  119. $keys[] = $key;
  120. }
  121. return $keys;
  122. }
  123. function _sort(&$ar,$key=0,$mode="desc") {
  124. global $cmp_key;
  125. $cmp_key = $key;
  126. if($mode == "asc")
  127. usort($ar,_cmp_asc);
  128. else
  129. usort($ar,_cmp_desc);
  130. }
  131. function _close() {
  132. $fp = fopen($this->database,"w");
  133. fwrite($fp,serialize($this->conn));
  134. fclose($fp);
  135. }
  136. }

  137. /** 排序键
  138. */
  139. $cmp_key = "";

  140. /** 排序用工作函数(降序 由usort()调用)
  141. */
  142. function _cmp_desc($a,$b) {
  143. global $cmp_key;
  144. if ($a[$cmp_key] == $b[$cmp_key]) return 0;
  145. return ($a[$cmp_key] > $b[$cmp_key]) ? -1 : 1;
  146. }

  147. /** 排序用工作函数(升序 由usort()调用)
  148. */
  149. function _cmp_asc($a,$b) {
  150. global $cmp_key;
  151. if ($a[$cmp_key] == $b[$cmp_key]) return 0;
  152. return ($a[$cmp_key] > $b[$cmp_key]) ? 1 : -1;
  153. }
  154. ?>

  155. 测试例:
  156. <?php
  157. //require_once "db_text.php";

  158. $conn = new DB_text;
  159. $conn->connect("text1.txt");

  160. $conn->query("insert into manage (id,title) values (10,'abcd')");
  161. $conn->query("insert into manage (id,title) values (2,'43d')");
  162. $conn->query("insert into manage (id,title) values (20,'tuu')");
  163. $conn->query("update manage set id=101,test='a' where id=10");
  164. //$conn->query("delete from manage where id='10'");
  165. //$conn->query("delete from manage where id=10 or table='code'");


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

  168. print_r($rt);

  169. ?>
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表