<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿Tim日志]]></title> 
<link>https://atim.cn/index.php</link> 
<description><![CDATA[专业的php开发者.开发团队的带队人]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿Tim日志]]></copyright>
<item>
<link>https://atim.cn/post//</link>
<title><![CDATA[Creole ：新兴数据抽象层]]></title> 
<author>bkkkd &lt;partybase@gmail.com&gt;</author>
<category><![CDATA[开发应用]]></category>
<pubDate>Fri, 25 Nov 2005 06:56:42 +0000</pubDate> 
<guid>https://atim.cn/post//</guid> 
<description>
<![CDATA[ 
	说起数据抽象层，大家可能首先想起的就是ADODB。这里要为大家介绍的是一个全新的数据抽象层：Creole。说它新，是因为它是用PHP5写的，是一个基于真正意义的OO的层；它的API接口以JDBC为基础，熟悉JDBC的朋友用起来应该会很亲切；它现在支持的数据库有MySQL， MS SQL Server， PostgreSQL， SQLite。Oracle的driver正在开发中，当然，你也可以为自己要使用的数据库写Driver。<br /><br /><br /><b>安装</b><br />下面我们就来看看在Windows+Apache+PHP5上Creole的安装和初步使用。首先你要安装好PEAR，如果你还没有安装好，可以双击php目录下的go-pear.bat文件，然后这个程序会引导你进行安装。关于PEAR的安装不是本文的内容，请自行查阅相关资料。当你安装好PEAR后，我们就要利用它的install功能了。<br />首先进入命令行方式，Cd到你安装php的目录下。然后在命令行中键入下边命令，这样PEAR会自动帮我们下载并安装好Creole包。<br /><pre class="php">pear install http://creole.phpdb.org/pear/creole-current.tgz </pre><br /><br />如果你键入的命令正确的话，应该看到下边的安装提示。<br /><br /><a href="http://www.phpe.net/uploads/images/article_1_5073.png" target="_blank"><img alt="Click to fullsize" hspace="10" src="http://www.phpe.net/uploads/images/article_1_5073.png" onload="function anonymous()<br/>&#123;<br/>if(this.width>500) this.width=500<br/>&#125;" align="center" vspace="10" border="0" /></a><br /><br /><br />这样我们就已经成功安装好了Creole，不过为了能使用它我们还得再安装一个jargon包，这个包封装了数据表和字段层次的一些信息。安装的方法和上边一样，键入如下命令就可以了：<br /><pre class="php">pear install http://creole.phpdb.org/pear/jargon-current.tgz</pre><br /><br /><b>配置</b><br />下面我们就可以使用Creole了。在web可以访问的目录下建立一个PHP文件，我们先来尝试包含Creole类，这是每一个要使用Creole的程序都要做的事。我们加入下边的代码：<br /><pre class="php">require_once 'creole/Creole.php';</pre><br /><br />然后在浏览器中访问这个页面，结果出现了下边的错误：<br /><pre class="php"><b>Warning:</b> main(/creole/Creole.php) [function.main]: failed to open stream: No such file or directory in <b>c:\program files\EasyPHP5\home\dev\test.php</b> on line <b>2</b><br/><br/><b>Fatal error:</b> main() [function.require]: Failed opening required '/creole/Creole.php' (include_path='.;C:\php5\pear') in <b>c:\program files\EasyPHP5\home\dev\test.php</b> on line <b>2</b><br/></pre><br />这是因为我们没有设置好php.ini来包含PEAR库的路径，所以php.exe找不到文件，只好报错了。现在我们把PEAR库的地址添加到php.ini中。在php.ini中找到这段：<br /><br /><pre class="php">;;;;;;;;;;;;;;;;;;;;;;;;;<br/>; Paths and Directories ;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;<br/> <br/>; UNIX: &quot;/path1:/path2&quot;<br/>;include_path = &quot;.:/php/includes&quot;<br/>;<br/>; Windows: &quot;path1;path2&quot;<br/>;include_path = &quot;.;c:\php\includes&quot;<br/></pre><br />将最后一行改成：<br /><br /><pre class="php">include_path = &quot;.;C:\Program Files\EasyPHP5\php\PEAR&quot;</pre><br />其中C:\Program Files\EasyPHP5\php\PEAR是PEAR在你机器上的绝对路径。注意要去掉行首的分号。然后重启Apache。再访问看看，好了。：）<br /><br /><br /><br /><b>试用</b><br />现在开始我们就可以在程序中使用Creole了。下边我们将连接数据库，并从中取出user表的全部用户。下边是完整的代码：<br /><pre class="php">&lt;?php<br/>require_once 'creole/Creole.php'; <br/>$dsn = &quot;mysql://root@localhost/r4&quot;; <br/>$conn = Creole::getConnection($dsn); <br/>$rs = $conn-&gt;executeQuery(&quot;SELECT * FROM user&quot;);<br/>while($rs-&gt;next())<br/>&#123;<br/> &nbsp;echo $rs-&gt;getString(&quot;login_name&quot;) . &quot; (&quot; . $rs-&gt;getInt(&quot;id&quot;) . &quot;)&quot;;<br/>&#125;<br/>?&gt;<br/></pre><br />这里讲解下上边代码的含义。第一行载入了Creole类，第二行定义了一个用于连接数据库的字符串，格式是“数据库类型名://用户名:密码@HOST/数据库名”。第三行创建了一个连接对象，第四行利用这个对象执行了一句SQL，并返回一个结果集。第五到八行遍历了这个结果集并输出数据。<br /><br /><br /><b>析构</b><br />怎么样，看起来不错吧，如果你感兴趣可以按照Creole站上的Guide一步一步做下去。不过我们就要做别的事情了:P 前边说过了，Creole更多的注重于OO，同时又带有很强的Java风格，因此对于我们学习使用PHP5来设计OO方式的程序是很好的范例。下边我们就来看看它的架构。首先要了解的是它的目录结构，在Windows命令行方式键入tree，就可以打印出一个目录的结构（一个有用的小技巧哦），下边是由此得到的Creole目录结构，目录后边加上了简要的说明。<br />我们以Statement为例，看看Creole是怎么组织的。首先在根目录下的Statement.php中定义了Statement接口，这个接口规定了Statement必须实现的一些方法。然后，在/common目录下的StatementCommon.php中定义了名为StatementCommon的抽象类，在这个类中，包含了Statement.php中定义的接口的实现代码，但是并没有定义为实现Statement接口。<br /><br /><pre class="php">Root // Creole的根目录 <br/>├─common // 存放了Creole的抽象类<br/>├─drivers<br/>│ &nbsp;├─mssql <br/>│ &nbsp;│ &nbsp;└─metadata // mssql实现<br/>│ &nbsp;├─mysql <br/>│ &nbsp;│ &nbsp;└─metadata // mysql实现<br/>│ &nbsp;├─pgsql<br/>│ &nbsp;│ &nbsp;└─metadata<br/>│ &nbsp;└─sqlite<br/>│ &nbsp; &nbsp; &nbsp;└─metadata<br/>├─metadata // 数据表原始信息类<br/>└─util <br/> &nbsp; &nbsp;└─sql<br/></pre><br />而在/drivers/mysql/目录下的MysqlStatement则继承了StatementCommon和实现Statement方法。这样MysqlStatement可以共享到StatementCommon中的方法，需要定制时可以重载StatementCommon的方法；同时，MysqlStatement又受到Statement接口的约束。<br /><br />下一页的图表示了Statement，StatementCommon和MysqlStatement之间的关系。正是这样的结构，使定义和实现得到了有效的分离。Creole中大量采用了这样的结构，在我们编写自己的Driver时非常方便。如果要添加一个TextStatement，可以自己实现一个class，只要这个class实现了Statement接口就可以了。而Driver正是由这样的一组class组成的。<br /><br /><a href="http://www.phpe.net/uploads/images/article_2_5396.png" target="_blank"><img alt="Click to fullsize" hspace="10" src="http://www.phpe.net/uploads/images/article_2_5396.png" onload="function anonymous()<br/>&#123;<br/>if(this.width>500) this.width=500<br/>&#125;" align="center" vspace="10" border="0" /></a><br /><br /><br /><br /><b>参考</b><br />我们对Creole的介绍到这里就告一个段落了，而对你来说，一切才刚刚开始。下边是从两个常用类的接口程序内中整理出来的方法，希望能对你有所帮助。<br /><br />Statement<br /><pre class="php">public function setLimit($v);<br/>public function getLimit();<br/>public function setOffset($v);<br/>public function getOffset();<br/>public function close();<br/>public function execute($sql, $fetchmode = null);<br/>public function getResultSet();<br/>public function executeQuery($sql, $fetchmode = null);<br/>public function executeUpdate($sql);<br/>public function getMoreResults();<br/>public function getConnection();<br/></pre><br />ResultSet<br /><pre class="php">public function getResource();<br/>public function setFetchmode($mode);<br/>public function getFetchmode(); &nbsp; &nbsp; &nbsp; <br/>public function isIgnoreAssocCase();<br/>public function next();<br/>public function previous();<br/>public function relative($offset);<br/>public function absolute($pos);<br/>public function seek($rownum); &nbsp; &nbsp;<br/>public function first();<br/>public function last();<br/>public function beforeFirst();<br/>public function afterLast();<br/>public function isAfterLast();<br/>public function isBeforeFirst();<br/>public function getCursorPos();<br/>public function getRow();<br/>public function getRecordCount();<br/>public function close();<br/>public function get($column);<br/>public function getArray($column);<br/>public function getBoolean($column);<br/>public function getBlob($column);<br/>public function getClob($column);<br/>public function getDate($column, $format = '%x'); &nbsp; <br/>public function getFloat($column);<br/>public function getInt($column); &nbsp; &nbsp; &nbsp;<br/>public function getString($column);<br/>public function getTime($column, $format = '%X');<br/>public function getTimestamp($column, $format = 'Y-m-d H:i:s');<br/></pre><br />
]]>
</description>
</item><item>
<link>https://atim.cn/post//#blogcomment</link>
<title><![CDATA[[评论] Creole ：新兴数据抽象层]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://atim.cn/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>