站长论坛

标题: MySQL方式操作文本数据库 [打印本页]

作者: tznktg    时间: 2007-9-7 23:49
标题: MySQL方式操作文本数据库
在一些小型的应用中,完全没有必要使用大型数据库软件。自己做一个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. ?>
复制代码





欢迎光临 站长论坛 (https://tzlink.com/bbs/) Powered by Discuz! X3.2