<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[自己动手做一个SQL解释器]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[代码编程]]></category>
<pubDate>Wed, 11 Oct 2006 23:47:05 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	这是从别的地方看到的，俺还不会写这么无聊的东西<br/><br/>&lt;?php<br/><br/>class DB_text {<br/> &nbsp;var $conn;<br/> &nbsp;var $classname = &quot;db_text&quot;;<br/> &nbsp;var $database;<br/> &nbsp;function on_create() {<br/> &nbsp;}<br/> &nbsp;function connect($database_name) {<br/> &nbsp; &nbsp;$this-&gt;database = $database_name;<br/> &nbsp; &nbsp;if(! file_exists($database_name)) {<br/> &nbsp; &nbsp; &nbsp;$this-&gt;conn = array();<br/> &nbsp; &nbsp; &nbsp;$this-&gt;_close();<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;$fp = fopen($this-&gt;database,&quot;r&quot;);<br/> &nbsp; &nbsp;$this-&gt;conn = unserialize(fread($fp,filesize($this-&gt;database)));<br/> &nbsp; &nbsp;fclose($fp);<br/> &nbsp;}<br/> &nbsp;function &amp;query($query) {<br/> &nbsp; &nbsp;if(eregi(&quot;select &quot;,$query)) return $this-&gt;_select($query);<br/> &nbsp; &nbsp;if(eregi(&quot;insert &quot;,$query)) return $this-&gt;_insert($query);<br/> &nbsp; &nbsp;if(eregi(&quot;delete &quot;,$query)) return $this-&gt;_delete($query);<br/> &nbsp; &nbsp;if(eregi(&quot;update &quot;,$query)) return $this-&gt;_update($query);<br/> &nbsp; &nbsp;return array();<br/> &nbsp;}<br/> &nbsp;function fetch_row(&amp;$result) {<br/> &nbsp; &nbsp;if(list($key,$value) = each($result))<br/> &nbsp; &nbsp; &nbsp;return $value;<br/> &nbsp; &nbsp;return false;<br/> &nbsp;}<br/> &nbsp;function num_rows($result) {<br/> &nbsp; &nbsp;return count($result);<br/> &nbsp;}<br/><br/> &nbsp;/**<br/> &nbsp; * query的辅助函数<br/> &nbsp; */<br/> &nbsp;function _select($query) {<br/> &nbsp; &nbsp;if(eregi(&quot;(order by (.+))&quot;,$query,$regs)) {<br/> &nbsp; &nbsp; &nbsp;$order = $regs[2];<br/> &nbsp; &nbsp; &nbsp;$query = eregi_replace($regs[1],&quot;&quot;,$query);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;if(eregi(&quot;(group by (.+))&quot;,$query,$regs)) {<br/> &nbsp; &nbsp; &nbsp;$group = $regs[2];<br/> &nbsp; &nbsp; &nbsp;$query = eregi_replace($regs[1],&quot;&quot;,$query);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;eregi(&quot;select .* from ([0-9a-z_]+) *(where +(.+))?&quot;,$query,$regs);<br/> &nbsp; &nbsp;if($regs[3] != &quot;&quot;) {<br/> &nbsp; &nbsp; &nbsp;$keys = $this-&gt;_where($regs[3],&quot;&#92;$this-&gt;conn[$regs[1]]&quot;);<br/> &nbsp; &nbsp; &nbsp;while(list($key,$value) = each($keys)) {<br/> &nbsp; &nbsp; &nbsp; &nbsp;$rs[] = $this-&gt;conn[$regs[1]][$value];<br/> &nbsp; &nbsp; &nbsp;}<br/> &nbsp; &nbsp;}else {<br/> &nbsp; &nbsp; &nbsp;$rs = $this-&gt;conn[$regs[1]];<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;if($order) {<br/> &nbsp; &nbsp; &nbsp;sscanf($order,&quot;%s %s&quot;,$key,$type);<br/> &nbsp; &nbsp; &nbsp;if(empty($type)) $type = &quot;asc&quot;;<br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_sort($rs,$key,$type);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;return $rs;<br/> &nbsp;}<br/> &nbsp;function _insert($query) {<br/> &nbsp; &nbsp;eregi(&quot;insert +into +([0-9a-z_]+) *(.+) *values? *(.+)&quot;,$query,$regs);<br/> &nbsp; &nbsp;eval(&quot;&#92;$key=array$regs[2];&quot;);<br/> &nbsp; &nbsp;eval(&quot;&#92;$value=array$regs[3];&quot;);<br/> &nbsp; &nbsp;for($i=0;$i&lt;count($key);$i++)<br/> &nbsp; &nbsp; &nbsp;$rs[$key[$i]] = $value[$i];<br/> &nbsp; &nbsp;$this-&gt;conn[$regs[1]][] = $rs;<br/> &nbsp; &nbsp;$this-&gt;_close();<br/> &nbsp;}<br/> &nbsp;function _update($query) {<br/> &nbsp; &nbsp;eregi(&quot;update +([0-9a-z_]+) +set *(,?.*=.*)+( +where +(.+))&quot;,$query,$regs);<br/> &nbsp; &nbsp;$regs[2] = eregi_replace(&quot;,&quot;,&quot;=&quot;,$regs[2]);<br/> &nbsp; &nbsp;$v = split(&quot;=&quot;,$regs[2]);<br/> &nbsp; &nbsp;$keys = $this-&gt;_where($regs[4],&quot;&#92;$this-&gt;conn[$regs[1]]&quot;);<br/> &nbsp; &nbsp;while(list($key,$value) = each($keys)) {<br/> &nbsp; &nbsp; &nbsp;for($i=0;$i&lt;count($v);$i+=2)<br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;conn[$regs[1]][$value][$v[$i]] = eregi_replace(&quot;&#039;&quot;,&quot;&quot;,$v[$i+1]);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;$this-&gt;_close();<br/> &nbsp;}<br/> &nbsp;function _delete($query) {<br/> &nbsp; &nbsp;eregi(&quot;delete +from +([0-9a-z_]+) *(where +(.+))?&quot;,$query,$regs);<br/> &nbsp; &nbsp;$keys = $this-&gt;_where($regs[3],&quot;&#92;$this-&gt;conn[$regs[1]]&quot;);<br/> &nbsp; &nbsp;while(list($key,$value) = each($keys)) {<br/> &nbsp; &nbsp; &nbsp;unset($this-&gt;conn[$regs[1]][$value]);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;reset($this-&gt;conn[$regs[1]]);<br/> &nbsp; &nbsp;while(list($key,$value) = each($this-&gt;conn[$regs[1]])) {<br/> &nbsp; &nbsp; &nbsp;$ch[] = $value;<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;$this-&gt;conn[$regs[1]] = $ch;<br/> &nbsp; &nbsp;$this-&gt;_close();<br/> &nbsp;}<br/> &nbsp;function _where($search,$table) {<br/> &nbsp; &nbsp;$search = eregi_replace(&quot;&#92;(&quot;,&quot; ( &quot;,$search);<br/> &nbsp; &nbsp;$search = eregi_replace(&quot;&#92;)&quot;,&quot; ) &quot;,$search);<br/> &nbsp; &nbsp;$search = eregi_replace(&quot;&#92;+&quot;,&quot; + &quot;,$search);<br/> &nbsp; &nbsp;$search = eregi_replace(&quot;&#92;*&quot;,&quot; * &quot;,$search);<br/> &nbsp; &nbsp;while(eregi(&quot;[^ ]([*/&gt;&lt;!=-])&quot;,$search,$regs)) {<br/> &nbsp; &nbsp; &nbsp;$search = eregi_replace($regs[1],&quot; $regs[1] &quot;,$search);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;while(eregi(&quot;([&gt;&lt;!] +=)&quot;,$search,$regs)) {<br/> &nbsp; &nbsp; &nbsp;$search = eregi_replace($regs[1],eregi_replace(&quot; &quot;,&quot;&quot;,$regs[1]),$search);<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;$search = eregi_replace(&quot; &nbsp;&quot;,&quot; &quot;,trim($search));<br/> &nbsp; &nbsp;$search = eregi_replace(&quot; and &quot;,&quot; &amp;&amp; &quot;,$search);<br/> &nbsp; &nbsp;$search = eregi_replace(&quot; or &quot;,&quot; &#124;&#124; &quot;,$search);<br/> &nbsp; &nbsp;$search = eregi_replace(&quot; = &quot;,&quot; == &quot;,$search);<br/> &nbsp; &nbsp;$ar = split(&quot; &quot;,$search);<br/> &nbsp; &nbsp;eval(&quot;&#92;$t=$table;&quot;);<br/><br/> &nbsp; &nbsp;for($i=0;$i&lt;count($ar);$i++) {<br/> &nbsp; &nbsp; &nbsp;if(isset($t[0][$ar[$i]]))<br/> &nbsp; &nbsp; &nbsp; &nbsp;$ar[$i] = &quot;&#92;$value[&quot;.$ar][$i].&quot;]&quot;;<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;$expr = &quot;&#92;$expl=(&quot;.join(&quot; &quot;,$ar).&quot;);&quot;;<br/> &nbsp; <br/> &nbsp; &nbsp;while(list($key,$value) = each($t)) {<br/> &nbsp; &nbsp; &nbsp;eval($expr);<br/> &nbsp; &nbsp; &nbsp;if($expl)<br/> &nbsp; &nbsp; &nbsp; &nbsp;$keys[] = $key;<br/> &nbsp; &nbsp;}<br/> &nbsp; &nbsp;return $keys;<br/> &nbsp;}<br/> &nbsp;function _sort(&amp;$ar,$key=0,$mode=&quot;desc&quot;) {<br/> &nbsp; &nbsp;global $cmp_key;<br/> &nbsp; &nbsp;$cmp_key = $key;<br/> &nbsp; &nbsp;if($mode == &quot;asc&quot;)<br/> &nbsp; &nbsp; &nbsp;usort($ar,_cmp_asc);<br/> &nbsp; &nbsp;else<br/> &nbsp; &nbsp; &nbsp;usort($ar,_cmp_desc);<br/> &nbsp;}<br/> &nbsp;function _close() {<br/> &nbsp; &nbsp;$fp = fopen($this-&gt;database,&quot;w&quot;);<br/> &nbsp; &nbsp;fwrite($fp,serialize($this-&gt;conn));<br/> &nbsp; &nbsp;fclose($fp);<br/> &nbsp;}<br/>}<br/><br/>/** 排序键<br/>*/<br/>$cmp_key = &quot;&quot;;<br/><br/>/** 排序用工作函数(降序 由usort()调用)<br/>*/<br/>function _cmp_desc($a,$b) {<br/> &nbsp;global $cmp_key;<br/> &nbsp;if ($a[$cmp_key] == $b[$cmp_key]) return 0;<br/> &nbsp;return ($a[$cmp_key] &gt; $b[$cmp_key]) ? -1 : 1;<br/>}<br/><br/>/** 排序用工作函数(升序 由usort()调用)<br/>*/<br/>function _cmp_asc($a,$b) {<br/> &nbsp;global $cmp_key;<br/> &nbsp;if ($a[$cmp_key] == $b[$cmp_key]) return 0;<br/> &nbsp;return ($a[$cmp_key] &gt; $b[$cmp_key]) ? 1 : -1;<br/>}<br/>?&gt;<br/><br/>测试例：<br/>&lt;pre&gt;<br/>&lt;?php<br/>//require_once &quot;db_text.php&quot;;<br/><br/>$conn = new DB_text;<br/>$conn-&gt;connect(&quot;text1.txt&quot;);<br/><br/>$conn-&gt;query(&quot;insert into manage (id,title) values (10,&#039;abcd&#039;)&quot;);<br/>$conn-&gt;query(&quot;insert into manage (id,title) values (2,&#039;43d&#039;)&quot;);<br/>$conn-&gt;query(&quot;insert into manage (id,title) values (20,&#039;tuu&#039;)&quot;);<br/>$conn-&gt;query(&quot;update manage set id=101,test=&#039;a&#039; where id=10&quot;);<br/>//$conn-&gt;query(&quot;delete from manage where id=&#039;10&#039;&quot;);<br/>//$conn-&gt;query(&quot;delete from manage where id=10 or table=&#039;code&#039;&quot;);<br/><br/><br/>//$rt = $conn-&gt;query(&quot;select * from manage where id=101 or table=&#039;code&#039; group by 1 order by 1 asc&quot;);<br/>$rt = $conn-&gt;query(&quot;select * from manage group by 1 order by id desc&quot;);<br/><br/>print_r($rt);<br/><br/>?&gt;<br/>&lt;/pre&gt; <br/><br/><br/>Tags - <a href="http://www.dzhope.com/tags/sql%25E8%25A7%25A3%25E9%2587%258A%25E5%2599%25A8/" rel="tag">sql解释器</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 自己动手做一个SQL解释器]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>