<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>睡到25点 &#187; Web Development</title>
	<atom:link href="http://www.voidman.com/category/web-development/feed" rel="self" type="application/rss+xml" />
	<link>http://www.voidman.com</link>
	<description>个人博客，记录与分享。</description>
	<lastBuildDate>Thu, 12 Jan 2012 14:00:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>在 Discuz 中应用 MogileFS 分布式文件存储系统</title>
		<link>http://www.voidman.com/2009/05/mogilefs-for-discuz.html</link>
		<comments>http://www.voidman.com/2009/05/mogilefs-for-discuz.html#comments</comments>
		<pubDate>Sun, 10 May 2009 06:38:51 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[mogilefs]]></category>

		<guid isPermaLink="false">http://www.voidman.com/?p=286</guid>
		<description><![CDATA[本文讨论内容基于 Discuz 7, Red Hat Enterprise Linux AS 4, MogileFs Server 2.17, MogileFS Client 1.08, MogileFS Utils 2.14 MogileFS 安装和配置 安装 基本安装顺序是 mogilefs-server（服务端）， MogileFS-Client（客户端）， MogileFS-Utils（工具包）。安装 MogileFS 其实并不复杂，但有些耗时，因为大多数据时间都被用在安装依赖包上了。在安装 MogileFS 之前有几个包是必需的： Sys-Syscall-0.22.tar.gz Danga-Socket-1.56.tar.gz String-CRC32-1.4.tar.gz Gearman-1.07.tar.gz Gearman-Client-Async-0.93 Net-Netmask-1.9015.tar.tar Perlbal-1.70.tar.tar 若在安装过程中还提示其它包不存在，可以根据提示到search.cpan.org搜索相应的包装上。具体安装步骤可以参考这里或这里。 安装成功后，会提示安装了以下文件，在下文的 MogileF S配置部分中会提到。 &#8230; <a href="http://www.voidman.com/2009/05/mogilefs-for-discuz.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>
本文讨论内容基于 Discuz 7, Red Hat Enterprise Linux AS 4, MogileFs Server 2.17, MogileFS Client 1.08, MogileFS Utils 2.14
</p></blockquote>
<h3>MogileFS 安装和配置</h3>
<p><strong>安装</strong><br />
基本安装顺序是 <a href="http://search.cpan.org/~bradfitz/mogilefs-server/">mogilefs-server</a>（服务端）， <a href="http://search.cpan.org/~bradfitz/MogileFS-Client-1.08/">MogileFS-Client</a>（客户端）， <a href="http://search.cpan.org/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Utils-2.14.tar.gz">MogileFS-Utils</a>（工具包）。安装 MogileFS 其实并不复杂，但有些耗时，因为大多数据时间都被用在安装依赖包上了。在安装 MogileFS 之前有几个包是必需的：</p>

<div class="wp_syntax"><pre class="ini">Sys-Syscall<span style="">-0.22</span>.tar.gz
Danga-Socket<span style="">-1.56</span>.tar.gz
String-CRC32<span style="">-1.4</span>.tar.gz
Gearman<span style="">-1.07</span>.tar.gz
Gearman-Client-Async<span style="">-0.93</span>
Net-Netmask<span style="">-1.9015</span>.tar.tar 
Perlbal<span style="">-1.70</span>.tar.tar</pre></div>

<p>若在安装过程中还提示其它包不存在，可以根据提示到<a href="search.cpan.org">search.cpan.org</a>搜索相应的包装上。具体安装步骤可以参考<a href="http://mogilefs.pbworks.com/HowTo">这里</a>或<a href="http://durrett.net/mogilefs_setup.html">这里</a>。<br />
<span id="more-286"></span><br />
安装成功后，会提示安装了以下文件，在下文的 MogileF S配置部分中会提到。</p>

<div class="wp_syntax"><pre class="bash">/usr/bin/mogilefsd
/usr/bin/mogstored
/usr/bin/mogdbsetup
/usr/bin/mogautomount
/usr/bin/mogtool
/usr/bin/mogadm</pre></div>

<p><strong>数据库配置</strong><br />
MogileFS 通过数据库来维护文件的存储节点和存储份数等相关属性。 创建一个数据库命名为 mogilefs，创建一个用户 mogile，设置密码为 mogile</p>

<div class="wp_syntax"><pre class="mysql"><span style="color: #008200; font-style: italic;"># mysql</span>
mysql&gt; <span style="color: #0000FF; ">CREATE DATABASE</span> mogilefs;
mysql&gt; <span style="color: #0000FF; ">GRANT</span> ALL ON mogilefs.* TO <span style="color: #FF00FF;">'mogile'</span>@<span style="color: #FF00FF;">'%'</span>;
mysql&gt; <span style="color: #0000FF; ">SET</span> PASSWORD FOR <span style="color: #FF00FF;">'mogile'</span>@<span style="color: #FF00FF;">'%'</span> = PASSWORD<span style="color: #000;">&#40;</span><span style="color: #FF00FF;">'mogile'</span><span style="color: #000;">&#41;</span>;
mysql&gt; FLUSH <span style="color: #0000FF; ">PRIVILEGES</span>;
mysql&gt; quit</pre></div>

<p>然后通过 MogileFs 自带的工具创建表</p>

<div class="wp_syntax"><pre class="bash"><span style="color: #666666; font-style: italic;"># /usr/bin/mogdbsetup --dbhost=db.yourdomain.com --dbname=mogilefs --dbuser=mogile --dbpassword=mogile</span></pre></div>

<p><strong>tracker 配置</strong><br />
编辑 /etc/mogilefs/mogilefsd.conf</p>

<div class="wp_syntax"><pre class="ini">db_dsn DBI:mysql:mogilefs
db_user mogile 
db_pass mogile 
conf_port <span style="">6001</span> 
listener_jobs <span style="">5</span></pre></div>

<p><strong>存储节点配置</strong></p>
<ul>
<li>
<p>先编辑配置文件 /etc/moiglefs/mogstored.conf</p>

<div class="wp_syntax"><pre class="ini"><span style="color: #000099;">httplisten</span>=<span style="color: #660066;"><span style="">192.168</span><span style="">.0</span><span style="">.7</span>:<span style="">7500</span> </span>
<span style="color: #000099;">mgmtlisten</span>=<span style="color: #660066;"><span style="">192.168</span><span style="">.0</span><span style="">.7</span>:<span style="">7501</span> </span>
<span style="color: #000099;">docroot</span>=<span style="color: #660066;">/var/mogdata</span></pre></div>

</li>
<li>
<p>向系统添加存储节点主机，并查看是否添加成功。这里我们添加的主机名称是 file.yourdomain.com，IP为192.168.0.7</p>

<div class="wp_syntax"><pre class="bash"><span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 host add file.yourdomain.com --ip=192.168.0.7 --port=7500 --status=alive</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 host list</span></pre></div>

</li>
<li>
<p>向系统添加存储节点设备，并查看是否添加成功</p>

<div class="wp_syntax"><pre class="bash"><span style="color: #666666; font-style: italic;"># mkdir /var/mogdata/dev1</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 device add file.yourdomain.com 1</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 device list</span></pre></div>

<p>这里的 1 代表 file.yourdomain.com 主机下的存储设备编号，对应存储目录为 /var/mogdata/dev1</p>
</li>
<li>
<p>添加存储域。在 MogileFs 中，文件通过 KEY 来引用，KEY 在某个存储域下是唯一的。我们添加一个 bbs.yourdomain.com 域，论坛里的附件都存储到该域下。</p>

<div class="wp_syntax"><pre class="bash"><span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 domain add bbs.yourdomain.com</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 domain list</span></pre></div>

</li>
<li>
<p>添加存储类别。在 MogileFs 中可以设置不同的存储类别存储不同份数的文件副本。我们添加一个 attach 类，每个文件至少存储 2 份</p>

<div class="wp_syntax"><pre class="bash"><span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 class add bbs.yourdomain.com attach --mindevcount=2</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 class list</span></pre></div>

</li>
</ul>
<p>最后在防火墙配置上述几个端口访问规则。现在可以启动 MogileFs，并查看进程与服务状态。</p>

<div class="wp_syntax"><pre class="bash"><span style="color: #666666; font-style: italic;"># /usr/bin/mogstored --daemon</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># ps -fe |grep mogstored</span>
<span style="color: #666666; font-style: italic;"># ps -fe |grep mogilefsd</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 check</span>
<span style="color: #666666; font-style: italic;"># /usr/bin/mogadm --trackers=192.168.0.7:6001 stats</span></pre></div>

<p>注：上述配置例子基于tracker，存储节点均在同一台主机，而实际使用上需要将存储节点分配到不同主机上才是真正意义上的分布式存储。甚至于  tracker 也可以是多个。</p>
<h3>安装 MogileFS PHP 扩展</h3>
<p>从 <a href="http://svn.usrportage.de/php-mogilefs/trunk/">http://svn.usrportage.de/php-mogilefs/trunk/</a> 获取源代码编译安装：</p>

<div class="wp_syntax"><pre class="bash">$ phpize
$ ./configure
$ <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div>

<p>将生成的 php-mogilefs.so 复制到 PHP 扩展目录，在 php.ini 添加一行扩展配置：</p>

<div class="wp_syntax"><pre class="ini"><span style="color: #000099;">extension</span>=<span style="color: #660066;">php-mogilefs.so</span></pre></div>

<p>重启 WEB 服务，用 phpinfo() 函数测试，如果显示结果如下图显示则表示安装成功<br />
<a href="http://img.voidman.com/wp/2009/05/mogilefs.png"><img src="http://img.voidman.com/wp/2009/05/mogilefs.png" alt="mogilefs" title="mogilefs" width="541" height="104" class="grayborder alignnone size-full wp-image-289" /></a><br />
该扩展提供的<a href="http://svn.usrportage.de/php-mogilefs/trunk/README">方法和函数</a>可以直接使用，不过为了方便维护，可以对之进行一下简单的封装。</p>
<h3>改造 Discuz 的附件系统</h3>
<blockquote><p>
接下来会应用到 WordPress 的 Hook 机制，详见<a href="http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html">WordPress 的 Hook 机制在 Discuz 二次开发中的应用</a>
</p></blockquote>
<p><strong>附件上传</strong></p>
<p>在 Discuz 7 中附件的上传由<code>include/post.func.php</code>文件里的<code>attach_upload()</code>函数处理，我们在其中增加将附件添加到 MogileFS 的处理。由于 Discuz 7 支持远程上传附件到 FTP，并且可以设置成只上传到远程 FTP，这会删除上传到 WEB 服务器的原始附件，所以要在这之前处理。</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// begin of hack</span>
dz_do_action<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'mogilefs_attachment_upload'</span>, <span style="color: #008080;">$attach</span>, <span style="color: #008080;">$target</span><span style="color: #800000;">&#41;</span>;
<span style="color: #008000; font-style: italic;">// end of hack</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// 找到以下这行代码，在这之前添加以上代码</span>
<span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'remote'</span><span style="color: #800000;">&#93;</span> = !<span style="color: #008080;">$swfupload</span> ? ftpupload<span style="color: #800000;">&#40;</span><span style="color: #008080;">$target</span>, <span style="color: #008080;">$attach</span><span style="color: #800000;">&#41;</span> : <span style="color: #800080;">0</span>;</pre></div>

<p>mogilefs_attachment_upload 函数用来处理往 MoigleFs 添加附件。在前面提到，MogileFs 通过 KEY 来引用文件，我采用的 KEY 的规则是：</p>

<div class="wp_syntax"><pre class="ini">attach_<span style="">&#123;</span>attachment_md5<span style="">&#125;</span>_<span style="">&#123;</span>ext<span style="">&#125;</span>
attach_<span style="">&#123;</span>attachment_md5<span style="">&#125;</span>_thumb_jpg</pre></div>

<p>{md5} 是 Discuz 附件表 attachment 字段的 MD5 值，{ext} 是附件的扩展名。注意，Discuz 存储文件时会把部分可能不安全附件的后缀名更改为 attach。Discuz 中图片附件的缩略图均为 JPG 格式，所以 thumb_jpg 表示 JPG 格式缩略图的意思。</p>
<p>mogilefs_attachment_upload() 函数的处理流程:</p>
<ol>
<li>判断 MogileFs 扩展是否加载，否则退出处理</li>
<li>获取 MogileFs 单个操作实例</li>
<li>根据传入的附件信息（$target, $attach）生成 attach_key，然后往 MogileFs 提交文件</li>
<li>如果附件是图片，检查图片的缩略图是否存在，如果存在，则生成 thumb_key ，然后往 MogileFs 提交缩略图文件</li>
</ol>
<p><strong>附件删除</strong></p>
<p>Discuz 7 中附件文件的删除由<code>include/global.func.php</code>文件里的<code>dunlink()</code>函数处理，我们在该函数结束之前添加 MogileFs 的文件删除处理：</p>

<div class="wp_syntax"><pre class="php">dz_do_action<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'mogilefs_attachment_delete'</span>, <span style="color: #008080;">$filename</span>, <span style="color: #008080;">$havethumb</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p>mogilefs_attachment_delete() 函数的处理流程:</p>
<ol>
<li>判断 MogileFs 扩展是否加载，否则退出处理</li>
<li>获取 MogileFs 单个操作实例</li>
<li>根据传入的附件路径 $filename 生成 attach_key，然后通过 MogileFs 提供的方法删除文件</li>
<li>根据 $havethumb 判断是否存在缩略图，若存在则生成 thumb_key，然后通过 MogileFs 提供的方法删除文件</li>
</ol>
<p>由于附件的上传中可能出现错误，Discuz 7 会做回滚处理删除本次上传出现错误之前已经正常上传的附件，而这些文件同样已经被上传到 MogileFs，故也要做删除处理：<br />
修改<code>include/post.func.php</code>文件里的<code>upload_error()</code>函数和<code>ftpupload_error()</code>：</p>

<div class="wp_syntax"><pre class="php"><span style="color: blue;">function</span> upload_error<span style="color: #800000;">&#40;</span><span style="color: #008080;">$message</span>, <span style="color: #008080;">$attacharray</span> = <span style="color: blue;">array</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
  <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: blue;">empty</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$attacharray</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">foreach</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$attacharray</span> <span style="color: blue;">as</span> <span style="color: #008080;">$attach</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
      @<span style="color: #ff0000;">unlink</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$GLOBALS</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'attachdir'</span><span style="color: #800000;">&#93;</span>.<span style="color: #ff00ff;">'/'</span>.<span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'attachment'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008000; font-style: italic;">// begin of hack</span>
      dz_do_action<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'mogilefs_attachment_delete'</span>, <span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'attachment'</span><span style="color: #800000;">&#93;</span>, <span style="color: blue;">true</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008000; font-style: italic;">// end of hack</span>
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
  showmessage<span style="color: #800000;">&#40;</span><span style="color: #008080;">$message</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span>
&nbsp;
<span style="color: blue;">function</span> ftpupload_error<span style="color: #800000;">&#40;</span><span style="color: #008080;">$source</span>, <span style="color: #008080;">$attach</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
  @<span style="color: #ff0000;">unlink</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$source</span><span style="color: #800000;">&#41;</span>;
  <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'thumb'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    @<span style="color: #ff0000;">unlink</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$source</span>.<span style="color: #ff00ff;">'.thumb.jpg'</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
  <span style="color: #008000; font-style: italic;">// begin of hack</span>
  dz_do_action<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'mogilefs_attachment_delete'</span>, <span style="color: #008080;">$source</span>, <span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'thumb'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #008000; font-style: italic;">// end of hack</span>
  showmessage<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'post_attachment_remote_save_error'</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span></pre></div>

<p><strong>附件读取</strong><br />
附件的读取需要在 Discuz 后台打开“下载附件来路检查”选项，因为附件的读取操作是 hook 在<code>attachment.php</code>文件上的。</p>
<ul>
<li>
<p>缩略图处理</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// begin of hack</span>
dz_do_action<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'mogilefs_attachment_fetch'</span>, <span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'attachment'</span><span style="color: #800000;">&#93;</span>, <span style="color: blue;">true</span><span style="color: #800000;">&#41;</span>;
<span style="color: #008000; font-style: italic;">// end of hack</span>
&nbsp;
<span style="color: #008000; font-style: italic;">//找到下面这行代码，在此之前添加上述代码</span>
getlocalfile<span style="color: #800000;">&#40;</span><span style="color: #008080;">$attachdir</span>.<span style="color: #ff00ff;">'/'</span>.<span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'attachment'</span><span style="color: #800000;">&#93;</span>.<span style="color: #ff00ff;">'.thumb.jpg'</span><span style="color: #800000;">&#41;</span>;</pre></div>

</li>
<li>
<p>其他附件处理<br />
    先删除<code>attachment.php</code>中的以下代码</p>

<div class="wp_syntax"><pre class="php"><span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$attach</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'remote'</span><span style="color: #800000;">&#93;</span> &amp;&amp; !<span style="color: #ff0000;">is_readable</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$filename</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
  showmessage<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'attachment_nonexistence'</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span></pre></div>

<p>然后将以下代码添加到<code>getlocalfile()</code>函数的起始处，接管该函数读取本地附件的处理。</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// begin of hack</span>
dz_do_action<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'mogilefs_attachment_fetch'</span>, <span style="color: #008080;">$filename</span><span style="color: #800000;">&#41;</span>;
<span style="color: #008000; font-style: italic;">// end of hack</span></pre></div>

</li>
</ul>
<p>mogilefs_attachment_fetch() 的处理流程</p>
<ol>
<li>判断 MogileFs 扩展是否加载，否则退出处理</li>
<li>获取 MogileFs 单个操作实例</li>
<li>根据传入参数判断读取的是缩略图还是原附件，生成 thumb_key 或 attach_key</li>
<li>通过 MogileFs 扩展提供的方法读取文件内容</li>
<li>输出</li>
</ol>
<p>当然，此外还有一些细节处理，如文件大小，文件头响应输出等，不再赘述。</p>
<h4>Related Posts</h4><ul class="related_post"><li><a href="http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html" title="WordPress 的 Hook 机制在 Discuz 二次开发中的应用">WordPress 的 Hook 机制在 Discuz 二次开发中的应用</a></li></ul><hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2009/05/mogilefs-for-discuz.html">http://www.voidman.com/2009/05/mogilefs-for-discuz.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2009/05/mogilefs-for-discuz.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>WordPress 的 Hook 机制在 Discuz 二次开发中的应用</title>
		<link>http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html</link>
		<comments>http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html#comments</comments>
		<pubDate>Fri, 01 May 2009 16:41:30 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.voidman.com/?p=285</guid>
		<description><![CDATA[最近工作需要对 Discuz 做二次开发，本着最小化改动方便以后升级的原则，我引入了 WordPress 的 Hook 机制（即 Plugin API）来降低二次开发代码与 Discuz 原生代码的耦合度。 WordPress 内部提供了许多 Hook（钩子），以便插件可以将相应的 action 或 filter 挂接上去接管或改进 WordPress 的默认处理来达到自己期望的目的，在处理完毕后将控制权重新交给 WordPress。而我们所要做的就是将这种机制移植到 Discuz 中，所幸的是，WordPress 的 Hook 机制并没有过多地依赖于它的其它核心程序，所以基本不需要做多少修改就可以拿来使用。 基本步骤 在 Discuz 安装目录新建一个文件夹，命名为extra，复制 WordPress 的wp-includes/plugin.php文件到此文件夹。为了符合 Discuz 名命名规范，将文件重命名为plugin.func.php 为了避免潜在的函数命名冲突，可以将plugin.func.php文件里的函数名称都加上前缀，例如do_action()修改成dz_do_action()；另外 plugin_basename(), register_activation_hook(), register_deactivation_hook(), register_uninstall_hook() 等函数可以删除。 &#8230; <a href="http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近工作需要对 Discuz 做二次开发，本着最小化改动方便以后升级的原则，我引入了 WordPress 的 Hook 机制（即 Plugin API）来降低二次开发代码与 Discuz 原生代码的耦合度。</p>
<p>WordPress 内部提供了许多 Hook（钩子），以便插件可以将相应的 action 或 filter 挂接上去接管或改进 WordPress 的默认处理来达到自己期望的目的，在处理完毕后将控制权重新交给 WordPress。而我们所要做的就是将这种机制移植到 Discuz 中，所幸的是，WordPress 的 Hook 机制并没有过多地依赖于它的其它核心程序，所以基本不需要做多少修改就可以拿来使用。<br />
<span id="more-285"></span><br />
<strong>基本步骤</strong></p>
<ol>
<li>在 Discuz 安装目录新建一个文件夹，命名为<code>extra</code>，复制 WordPress 的<code>wp-includes/plugin.php</code>文件到此文件夹。为了符合 Discuz 名命名规范，将文件重命名为<code>plugin.func.php</code></li>
<li>为了避免潜在的函数命名冲突，可以将<code>plugin.func.php</code>文件里的函数名称都加上前缀，例如<code>do_action()</code>修改成<code>dz_do_action()</code>；另外 <code>plugin_basename()</code>, <code>register_activation_hook()</code>, <code>register_deactivation_hook()</code>, <code>register_uninstall_hook()</code> 等函数可以删除。</li>
<li>在<code>extra</code>文件夹新建一个php文件，命名为<code>hooks.inc.php</code>，这里放置绝大部分 filter 和 action，将它们放在该文件中的一个最大的好处是方便集中维护。</li>
<li>载入相关文件。打开<code>include/common.inc.php</code>文件，找到

<div class="wp_syntax"><pre class="php"><span style="color: blue;">require_once</span> DISCUZ_ROOT.<span style="color: #ff00ff;">'./config.inc.php'</span>;</pre></div>

<p>在该行代码下面添加</p>

<div class="wp_syntax"><pre class="php"><span style="color: blue;">require_once</span> DISCUZ_ROOT.<span style="color: #ff00ff;">'./extra/plugin.func.php'</span>;
<span style="color: blue;">require_once</span> DISCUZ_ROOT.<span style="color: #ff00ff;">'./extra/hooks.inc.php'</span>;</pre></div>

<p>至此，基本的 Hook 机制已经建立
</li>
</ol>
<p><strong>实际应用示例</strong></p>
<p>接下来我们就可以开始添加自己的代码了。举个例子，Discuz 中<code>$discuz_auth_key</code>是这样定义的：</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008080;">$discuz_auth_key</span> = <span style="color: #ff0000;">md5</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$_DCACHE</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'settings'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'authkey'</span><span style="color: #800000;">&#93;</span>.<span style="color: #008080;">$_SERVER</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'HTTP_USER_AGENT'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p>如果想将<code>$discuz_auth_key</code>的定义修改为<code>md5(authkey+user_agent+ip)</code>这样的形式，我们可以通过 filter 来实现。在<code>$discuz_auth_key</code>的定义代码下一行添加：</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// 生成一个名为 discuz_auth_key 的钩子</span>
<span style="color: #008080;">$discuz_auth_key</span> = dz_apply_filters<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'discuz_auth_key'</span>, <span style="color: #008080;">$discuz_auth_key</span>, <span style="color: #008080;">$_DCACHE</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'settings'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'authkey'</span><span style="color: #800000;">&#93;</span>, <span style="color: #008080;">$_SERVER</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'HTTP_USER_AGENT'</span><span style="color: #800000;">&#93;</span>, <span style="color: #008080;">$onlineip</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p>然后打开<code>hooks.inc.php</code>文件，添加以下代码</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// 为了方便维护，所有 filter 类 hook 都以 filter_ 为前缀</span>
<span style="color: blue;">function</span> filter_discuz_auth_key<span style="color: #800000;">&#40;</span><span style="color: #008080;">$discuz_auth_key</span>, <span style="color: #008080;">$authkey</span>, <span style="color: #008080;">$ua</span>, <span style="color: #008080;">$ip</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
  <span style="color: #008000; font-style: italic;">// 符合自己设定的条件时才重新定义 authkey</span>
  <span style="color: #008000; font-style: italic;">// 否则返回 Discuz 定义的 discuz_auth_key 原值</span>
  <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$authkey</span> &amp;&amp; <span style="color: #008080;">$ua</span> &amp;&amp; <span style="color: #008080;">$ip</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$discuz_auth_key</span> = <span style="color: #ff0000;">md5</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$authkey</span> . <span style="color: #008080;">$ua</span> . <span style="color: #008080;">$ip</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
  <span style="color: blue;">return</span> <span style="color: #008080;">$discuz_auth_key</span>;
<span style="color: #800000;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// 将 filter 函数 filter_discuz_auth_key 挂接到 discuz_auth_key 钩子上</span>
<span style="color: #008000; font-style: italic;">// 第三个参数的值 10 代表执行优先级，因为一个钩子上可以挂接多个callback函数</span>
<span style="color: #008000; font-style: italic;">// 第四个参数的值 4 代表允许 filter_discuz_auth_key 函数接收的参数个数</span>
add_filter<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'discuz_auth_key'</span>, <span style="color: #ff00ff;">'filter_discuz_auth_key'</span>, <span style="color: #800080;">10</span>, <span style="color: #800080;">4</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p>这样便达到我们所要的效果了。当然有些情况下还是无法避免了二次开发代码与原代码的夹杂在一起，不过由于有了 Hook 机制，这种情形已经可以大大减少了。</p>
<p><strong>相关阅读</strong><br />
<a href="http://codex.wordpress.org/Plugin_API">WordPress Plugin API</a></p>
<h4>Related Posts</h4><ul class="related_post"><li><a href="http://www.voidman.com/2009/11/media-temple-hacked.html" title="Media Temple Hacked">Media Temple Hacked</a></li><li><a href="http://www.voidman.com/2009/05/mogilefs-for-discuz.html" title="在 Discuz 中应用 MogileFS 分布式文件存储系统">在 Discuz 中应用 MogileFS 分布式文件存储系统</a></li><li><a href="http://www.voidman.com/2009/04/at-reply-mail-notification-1-release.html" title="At Reply Mail Notification 1.0 Release">At Reply Mail Notification 1.0 Release</a></li><li><a href="http://www.voidman.com/2009/03/lbs-to-wordpress.html" title="LBS 转 WordPress 不完全记录">LBS 转 WordPress 不完全记录</a></li><li><a href="http://www.voidman.com/2009/01/wordpress-is-using-a-bad-way-to-detect-duplicate-comment.html" title="Wordpress 糟糕的重复评论检测方式">Wordpress 糟糕的重复评论检测方式</a></li><li><a href="http://www.voidman.com/2009/01/at-reply-mail-notification-test.html" title="At Reply Mail Notification 测试贴">At Reply Mail Notification 测试贴</a></li><li><a href="http://www.voidman.com/2008/11/automatically-delete-post-revisions.html" title="让 Wordpress 自动删除 Post Revisions">让 Wordpress 自动删除 Post Revisions</a></li><li><a href="http://www.voidman.com/2008/11/google-xml-sitemaps-ignore-the-specified-categories.html" title="让 Google Sitemaps Generator 可以忽略指定的日志分类">让 Google Sitemaps Generator 可以忽略指定的日志分类</a></li><li><a href="http://www.voidman.com/2008/11/the-better-solution-for-static-paged-post.html" title="Wordpress 分页文章静态化的更优解决方案">Wordpress 分页文章静态化的更优解决方案</a></li><li><a href="http://www.voidman.com/2008/07/upgraded-to-wordpress-v26.html" title="升级到 WordPress 2.6">升级到 WordPress 2.6</a></li></ul><hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html">http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2009/05/using-wordpress-plugin-api-hack-discuz.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>在 Windows 2003 IIS6 下跑 PHP 太不不靠谱了</title>
		<link>http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html</link>
		<comments>http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html#comments</comments>
		<pubDate>Thu, 22 Jan 2009 15:08:25 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.voidman.com/?p=235</guid>
		<description><![CDATA[为朋友写了个PHP版本的 socket 程序，在自己的机器环境（WIN2K3, IIS6, PHP4.4.6，ISAPI 模式）下测试一切 OK，到了实际环境却提示 Call to undefined function socket_create()，初步判断应该 php_socket.dll 未加载的缘故，echo phpinfo 也没有 socket 相关信息。 确认在 php.ini 文件里已经将;extension=php_sockets.dll这一行的分号去掉了，可 socket 扩展死活不加载。除了 PHP 版本有些差别（实际环境是4.4.9版本），其它设置都一样，正想将 PHP 降到 4.4.6 版本，却突然出现 Service Unavailable 提示，难不成要重装IIS？ 不甘心，于是 google 解决方案。参照 Tmouse·方枪枪 的做法: 打开IIS管理器 － 网站 &#8230; <a href="http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>为朋友写了个PHP版本的 socket 程序，在自己的机器环境（WIN2K3, IIS6, PHP4.4.6，ISAPI 模式）下测试一切 OK，到了实际环境却提示 <code>Call to undefined function socket_create()</code>，初步判断应该 php_socket.dll 未加载的缘故，echo phpinfo 也没有 socket 相关信息。</p>
<p>确认在 php.ini 文件里已经将<code>;extension=php_sockets.dll</code>这一行的分号去掉了，可 socket 扩展死活不加载。除了 PHP 版本有些差别（实际环境是4.4.9版本），其它设置都一样，正想将 PHP 降到 4.4.6 版本，却突然出现 Service Unavailable 提示，难不成要重装IIS？</p>
<p>不甘心，于是 google  解决方案。参照 <a href="http://www.cnblogs.com/tmouse/archive/2006/11/28/575525.html" rel="nofollow">Tmouse·方枪枪</a> 的做法:</p>
<blockquote class="quote"><p>
打开IIS管理器 － 网站 － 右键属性 － 服务 － 勾上"以IIS5.0隔离模式运行www服务"
</p></blockquote>
<p>IIS 的 Service Unavailable 故障消失，更为有意思的是 php_socket 扩展可以正常加载了 -_-! 要不是情况特殊，以后打死我也不用 IIS 跑 PHP 了。</p>
<h4>Related Posts</h4><ul class="related_post"><li><a href="http://www.voidman.com/2005/11/php-operate-sql-server.html" title="PHP 操作 SQL Server">PHP 操作 SQL Server</a></li><li><a href="http://www.voidman.com/2004/12/recording-operation-automatically.html" title="自动记录操作日志">自动记录操作日志</a></li></ul><hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html">http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML button 标签的默认 Type 属性</title>
		<link>http://www.voidman.com/2008/02/html-button-tag-default-type-attribute.html</link>
		<comments>http://www.voidman.com/2008/02/html-button-tag-default-type-attribute.html#comments</comments>
		<pubDate>Thu, 21 Feb 2008 04:45:42 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[button]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[k2]]></category>

		<guid isPermaLink="false">http://www.voidman.com/2008/02/html-button-tag-default-type-attribute/</guid>
		<description><![CDATA[在装上 K2 RC4 主题后，发现如果用 IE 访问 WP 后台无法保存 K2 的设置选项，点击 Save 按钮后毫无反应，Firefox、Opera、Safari则正常。看了看源代码，K2 是这样定义这个按钮的： &#60;button&#62;&#60; ?php echo attribute_escape&#40;__&#40;'Save','k2_domain'&#41;&#41;;?&#62;&#60;/button&#62; 之前很少使用过 &#60;button&#62; 标签，所以开始还以为 K2 绑定了按钮事件不支持 IE，不过浏览了一通代码也没找到，才意识到问题可能出在标签的未指定 type 属性上了，于是加上 type="submit"，问题解决。 又特意找了找相关资料，W3C 对 button 标签的 type 属性定义是： submit: Creates a submit button. This is the &#8230; <a href="http://www.voidman.com/2008/02/html-button-tag-default-type-attribute.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>在装上 <a href="http://getk2.com/download"  rel="external nofollow">K2 RC4</a> 主题后，发现如果用 IE 访问 WP 后台无法保存 K2 的设置选项，点击 Save 按钮后毫无反应，Firefox、Opera、Safari则正常。看了看源代码，K2 是这样定义这个按钮的：</p>

<div class="wp_syntax"><pre class="html4strict"><span style="color: #800000"><span style="color: blue;">&lt;button&gt;</span></span><span style="color: #800000">&lt; ?php echo attribute_escape<span style="color: #800000">&#40;</span>__<span style="color: #800000">&#40;</span><span style="color: #ff00ff;">'Save'</span>,<span style="color: #ff00ff;">'k2_domain'</span><span style="color: #800000">&#41;</span><span style="color: #800000">&#41;</span>;?&gt;</span><span style="color: #800000"><span style="color: blue;">&lt;/button&gt;</span></span></pre></div>

<p>之前很少使用过 &lt;button&gt; 标签，所以开始还以为 K2 绑定了按钮事件不支持 IE，不过浏览了一通代码也没找到，才意识到问题可能出在标签的未指定 type 属性上了，于是加上 type="submit"，问题解决。</p>
<p>又特意找了找相关资料，<a href="http://www.w3.org/TR/REC-html40/interact/forms.html#adef-type-BUTTON" title="adef-type-BUTTON-W3C"  rel="external nofollow">W3C</a> 对 button 标签的 type 属性定义是：</p>
<blockquote class="quote"><p>submit: Creates a submit button. <strong>This is the default value</strong>.<br />
 reset: Creates a reset button.<br />
button: Creates a push button.</p></blockquote>
<p>而 <a href="http://msdn2.microsoft.com/en-us/library/ms534696(VS.85).aspx"  rel="external nofollow" title="type Property (BUTTON) - MSDN">MSDN</a> 中则如此解释：</p>
<blockquote class="quote"><p>button: <strong>Default</strong>. Creates a Command button.<br />
 reset: Creates a Reset button. If the button is in a form,<br />
        it resets the fields in the form to their initial values.<br />
submit: Creates a Submit button. If the button is in a form,<br />
        it submits the form.</p></blockquote>
<p>原来如此。fuck IE!</p>
<hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2008/02/html-button-tag-default-type-attribute.html">http://www.voidman.com/2008/02/html-button-tag-default-type-attribute.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2008/02/html-button-tag-default-type-attribute.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JScript 仿 PHP 操作 SQL Server</title>
		<link>http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html</link>
		<comments>http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html#comments</comments>
		<pubDate>Fri, 13 Jan 2006 06:30:25 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JScript]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://www.voidman.com/2008/02/jscript-dbclass-for-sql-server-php-style/</guid>
		<description><![CDATA[原先在php下写了个操作数据库的类，用jscript又重写了一遍。 // Sample var db = new dbstuff&#40;&#41;; db.connect&#40;dbserver, dbuser, dbpwd, dbname&#41;; &#160; var sql = &#34;SELECT @@VERSION as dbv&#34;; var query = db.query&#40;sql&#41;; while&#40;arr = db.fetch_array&#40;query&#41;&#41;&#123; echo&#40;arr&#91;&#34;dbv&#34;&#93;&#41;; &#125; db.close&#40;&#41;; function dbstuff&#40;&#41;&#123; /////////////////// // Attributes /////////////////// // Private var conn &#8230; <a href="http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>原先在php下写了个操作数据库的类，用jscript又重写了一遍。</p>

<div class="wp_syntax"><pre class="javascript"><span style="color: #008000; font-style: italic;">// Sample</span>
<span style="color: blue;">var</span> db = <span style="color: blue;">new</span> dbstuff<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
db.<span style="">connect</span><span style="color: #800000;">&#40;</span>dbserver, dbuser, dbpwd, dbname<span style="color: #800000;">&#41;</span>;
&nbsp;
<span style="color: blue;">var</span> sql = <span style="color: #ff00ff;">&quot;SELECT @@VERSION as dbv&quot;</span>;
<span style="color: blue;">var</span> query = db.<span style="">query</span><span style="color: #800000;">&#40;</span>sql<span style="color: #800000;">&#41;</span>;
<span style="color: blue;">while</span><span style="color: #800000;">&#40;</span>arr = db.<span style="">fetch_array</span><span style="color: #800000;">&#40;</span>query<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
  echo<span style="color: #800000;">&#40;</span>arr<span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">&quot;dbv&quot;</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span>
db.<span style="">close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p><span id="more-128"></span></p>

<div class="wp_syntax"><pre class="javascript"><span style="color: blue;">function</span> dbstuff<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
  <span style="color: #008000; font-style: italic;">///////////////////</span>
  <span style="color: #008000; font-style: italic;">// Attributes</span>
  <span style="color: #008000; font-style: italic;">///////////////////</span>
  <span style="color: #008000; font-style: italic;">// Private</span>
  <span style="color: blue;">var</span> conn = Server.<span style="">CreateObject</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;ADODB.Connection&quot;</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #008000; font-style: italic;">// Public</span>
  <span style="color: blue;">this</span>.<span style="">state</span> = <span style="color: blue;">false</span>;
  <span style="color: blue;">this</span>.<span style="">recordcount</span> = <span style="color: #800080;">-1</span>;
  <span style="color: blue;">this</span>.<span style="">querynum</span> = <span style="color: #800080;">0</span>;
  <span style="color: #008000; font-style: italic;">///////////////////</span>
  <span style="color: #008000; font-style: italic;">// Methods</span>
  <span style="color: #008000; font-style: italic;">///////////////////</span>
  <span style="color: #008000; font-style: italic;">// Open a new connection to the MSSQL server</span>
  <span style="color: blue;">this</span>.<span style="">connect</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>dbserver, dbuser, dbpwd, dbname<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: blue;">this</span>.<span style="">state</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        conn.<span style="">Close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: blue;">this</span>.<span style="">state</span> = <span style="color: blue;">false</span>;
      <span style="color: #800000;">&#125;</span>
      conn.<span style="">CommandTimeout</span> = <span style="color: #800080;">180</span>;
      conn.<span style="">ConnectionString</span> = <span style="color: #ff00ff;">&quot;Provider=SQLOLEDB; Data Source=&quot;</span>+dbserver+<span style="color: #ff00ff;">&quot;; UID=&quot;</span>+dbuser+<span style="color: #ff00ff;">&quot;; PWD=&quot;</span>+dbpwd+<span style="color: #ff00ff;">&quot;;Initial Catalog=&quot;</span>+dbname;
      conn.<span style="">Open</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Can not connect to Database Server.&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">this</span>.<span style="">state</span> = <span style="color: blue;">true</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Performs a query on the database</span>
  <span style="color: blue;">this</span>.<span style="">query</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>sql<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">var</span> query = conn.<span style="">Execute</span><span style="color: #800000;">&#40;</span>sql<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Database Query Error.&quot;</span>, e, sql<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">this</span>.<span style="">querynum</span>++;
    <span style="color: blue;">return</span> query;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch a result row as an associative array</span>
  <span style="color: blue;">this</span>.<span style="">fetch_array</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs, freeresult<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Fetch Data Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!rs.<span style="">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">var</span> arr = <span style="color: blue;">new</span> Array<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">var</span> colums = rs.<span style="">Fields</span>.<span style="">Count</span>;
      <span style="color: blue;">var</span> i, fld;
      <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span>i=<span style="color: #800080;">0</span>; i &lt; colums; i++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        arr<span style="color: #800000;">&#91;</span>rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>i<span style="color: #800000;">&#41;</span>.<span style="">Name</span>.<span style="">toLowerCase</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#93;</span> = rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>i<span style="color: #800000;">&#41;</span>.<span style="">Value</span>;
      <span style="color: #800000;">&#125;</span>
      rs.<span style="">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> arr;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">else</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>freeresult == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        <span style="color: blue;">this</span>.<span style="">free_result</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span>;
      <span style="color: #800000;">&#125;</span>
      <span style="color: blue;">return</span> <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch a result row as enumerated array</span>
  <span style="color: blue;">this</span>.<span style="">fetch_row</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs, freeresult<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Fetch Data Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!rs.<span style="">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">var</span> arr = <span style="color: blue;">new</span> Array<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">var</span> colums = rs.<span style="">Fields</span>.<span style="">Count</span>;
      <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span><span style="color: blue;">var</span> i=<span style="color: #800080;">0</span>; i &lt; colums; i++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        arr<span style="color: #800000;">&#91;</span>i<span style="color: #800000;">&#93;</span> = rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>i<span style="color: #800000;">&#41;</span>.<span style="">Value</span>;
      <span style="color: #800000;">&#125;</span>
      rs.<span style="">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> arr;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">else</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>freeresult == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        <span style="color: blue;">this</span>.<span style="">free_result</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span>;
      <span style="color: #800000;">&#125;</span>
      <span style="color: blue;">return</span> <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch all result rows as associative array </span>
  <span style="color: blue;">this</span>.<span style="">fetch_all</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs, freeresult<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Fetch Data Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">var</span> arr = <span style="color: blue;">new</span> Array<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">var</span> colums = rs.<span style="">Fields</span>.<span style="">Count</span>;
    <span style="color: blue;">var</span> rows = <span style="color: #800080;">0</span>;
    <span style="color: blue;">var</span> i;
    <span style="color: blue;">while</span><span style="color: #800000;">&#40;</span>!rs.<span style="">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      arr<span style="color: #800000;">&#91;</span>rows<span style="color: #800000;">&#93;</span> = <span style="color: blue;">new</span> Array<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span>i=<span style="color: #800080;">0</span>; i &lt; colums; i++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        arr<span style="color: #800000;">&#91;</span>rows<span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span>rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>i<span style="color: #800000;">&#41;</span>.<span style="">Name</span>.<span style="">toLowerCase</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#93;</span> = rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>i<span style="color: #800000;">&#41;</span>.<span style="">Value</span>;
      <span style="color: #800000;">&#125;</span>
      rows++;
      rs.<span style="">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>freeresult == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">this</span>.<span style="">free_result</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">return</span> arr;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Open recordset</span>
  <span style="color: blue;">this</span>.<span style="">recordset</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>sql, cursortype, locktype<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>cursortype == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>cursortype = <span style="color: #800080;">3</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>locktype == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>locktype = <span style="color: #800080;">3</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">var</span> rs = Server.<span style="">CreateObject</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;ADODB.RecordSet&quot;</span><span style="color: #800000;">&#41;</span>;
      rs.<span style="">CursorLocation</span> = <span style="color: #800080;">3</span>;
      rs.<span style="">Open</span><span style="color: #800000;">&#40;</span>sql, conn, cursortype, locktype<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Database Query Error.&quot;</span>, e, sql<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">this</span>.<span style="">querynum</span>++;
    <span style="color: blue;">return</span> rs;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch all result rows in one page as associative array </span>
  <span style="color: blue;">this</span>.<span style="">fetch_page</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>sql, pagesize, curpage, cursortype, locktype<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>pagesize == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>pagesize = <span style="color: #800080;">20</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>curpage == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>curpage = <span style="color: #800080;">1</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>cursortype == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>cursortype = <span style="color: #800080;">3</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>locktype == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>locktype = <span style="color: #800080;">3</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">var</span> rs = Server.<span style="">CreateObject</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;ADODB.RecordSet&quot;</span><span style="color: #800000;">&#41;</span>;
      rs.<span style="">CursorLocation</span> = <span style="color: #800080;">3</span>;
      rs.<span style="">CacheSize</span> = pagesize;
      rs.<span style="">Open</span><span style="color: #800000;">&#40;</span>sql, conn, cursortype, locktype<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Database Query Error.&quot;</span>, e, sql<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">this</span>.<span style="">querynum</span>++;
&nbsp;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">return</span> <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">EOF</span> &amp;&amp; rs.<span style="">BOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">this</span>.<span style="">recordcount</span> = <span style="color: #800080;">0</span>;
      <span style="color: blue;">return</span> <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
      <span style="color: blue;">this</span>.<span style="">recordcount</span> = rs.<span style="">recordcount</span>;
      rs.<span style="">PageSize</span> = pagesize;
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!curpage<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        curpage = <span style="color: #800080;">1</span>;
      <span style="color: #800000;">&#125;</span><span style="color: blue;">else</span> <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>curpage &gt; rs.<span style="">PageCount</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        curpage = rs.<span style="">PageCount</span>;
      <span style="color: #800000;">&#125;</span>
      rs.<span style="">AbsolutePage</span> = curpage;
      <span style="color: blue;">var</span> arr = <span style="color: blue;">new</span> Array<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">var</span> colums = rs.<span style="">Fields</span>.<span style="">Count</span>;
      <span style="color: blue;">var</span> i,j;
      <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span>i=<span style="color: #800080;">0</span>; i&lt; pagesize; i++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        arr<span style="color: #800000;">&#91;</span>i<span style="color: #800000;">&#93;</span> = <span style="color: blue;">new</span> Array<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span>j=<span style="color: #800080;">0</span>; j &lt; colums; j++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          arr<span style="color: #800000;">&#91;</span>i<span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span>rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>j<span style="color: #800000;">&#41;</span>.<span style="">Name</span>.<span style="">toLowerCase</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#93;</span> = rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>j<span style="color: #800000;">&#41;</span>.<span style="">Value</span>;
        <span style="color: #800000;">&#125;</span>
        rs.<span style="">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">break</span>;<span style="color: #800000;">&#125;</span>
      <span style="color: #800000;">&#125;</span>
      <span style="color: blue;">this</span>.<span style="">free_result</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> arr;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch one field value of a result row</span>
  <span style="color: blue;">this</span>.<span style="">result</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs, row, mixedfld, freeresult<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Fetch Data Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>row == undefined<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>row = <span style="color: #800080;">0</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>mixedfld == undefined<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>mixedfld = <span style="color: #800080;">0</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>freeresult == undefined<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
      freeresult = <span style="color: blue;">true</span>;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">else</span><span style="color: #800000;">&#123;</span>
      freeresult = <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">this</span>.<span style="">free_result</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>row<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>rs.<span style="">Move</span><span style="color: #800000;">&#40;</span>row<span style="color: #800000;">&#41;</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">var</span> returnvalue = rs.<span style="">Fields</span><span style="color: #800000;">&#40;</span>mixedfld<span style="color: #800000;">&#41;</span>.<span style="">value</span>;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>freeresult<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">this</span>.<span style="">free_result</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">return</span> returnvalue;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the number of rows in a result</span>
  <span style="color: blue;">this</span>.<span style="">num_rows</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Fetch Data Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">return</span> rs.<span style="">RecordCount</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the number of fields in a result </span>
  <span style="color: blue;">this</span>.<span style="">num_fields</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> != <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Fetch Data Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">return</span> rs.<span style="">Fields</span>.<span style="">Count</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the auto generated id used in the last query</span>
  <span style="color: blue;">this</span>.<span style="">insert_id</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    query = <span style="color: blue;">this</span>.<span style="">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT @@IDENTITY&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: blue;">this</span>.<span style="">result</span><span style="color: #800000;">&#40;</span>query<span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the number of affected rows in a previous SQL operation</span>
  <span style="color: #008000; font-style: italic;">// It should be called immediately after a SQL operation</span>
  <span style="color: blue;">this</span>.<span style="">affected_rows</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    query = <span style="color: blue;">this</span>.<span style="">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT @@ROWCOUNT&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: blue;">this</span>.<span style="">result</span><span style="color: #800000;">&#40;</span>query<span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
  <span style="color: #008000; font-style: italic;">// Get the mssql version</span>
  <span style="color: blue;">this</span>.<span style="">version</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    query = <span style="color: blue;">this</span>.<span style="">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT @@VERSION&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: blue;">this</span>.<span style="">result</span><span style="color: #800000;">&#40;</span>query<span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
  <span style="color: #008000; font-style: italic;">// Release resource</span>
  <span style="color: blue;">this</span>.<span style="">free_result</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span>rs<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span><span style="color: blue;">return</span>;<span style="color: #800000;">&#125;</span>
    <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>rs.<span style="">State</span> == <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        rs.<span style="">Close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #800000;">&#125;</span>
      rs = <span style="color: blue;">null</span>;
    <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Close RecordSet Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
  <span style="color: #008000; font-style: italic;">// Close db connection</span>
  <span style="color: blue;">this</span>.<span style="">close</span> = <span style="color: blue;">function</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: blue;">this</span>.<span style="">state</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">try</span><span style="color: #800000;">&#123;</span>
        conn.<span style="">Close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        conn = <span style="color: blue;">null</span>;
      <span style="color: #800000;">&#125;</span><span style="color: blue;">catch</span><span style="color: #800000;">&#40;</span>e<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        die<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Close Database Connection Error.&quot;</span>, e<span style="color: #800000;">&#41;</span>;
      <span style="color: #800000;">&#125;</span>
      <span style="color: blue;">this</span>.<span style="">state</span> = <span style="color: blue;">false</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
<span style="color: #800000;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">///////////////////</span>
&nbsp;
<span style="color: blue;">function</span> echo<span style="color: #800000;">&#40;</span>str<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
  Response.<span style="color: blue;">Write</span><span style="color: #800000;">&#40;</span>str+<span style="color: #ff00ff;">&quot;<span style="">\n</span>&quot;</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span>
&nbsp;
<span style="color: blue;">function</span> die<span style="color: #800000;">&#40;</span>errmsg, err<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
  Response.<span style="">Clear</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
  Response.<span style="">CharSet</span> = <span style="color: #ff00ff;">&quot;utf-8&quot;</span>;
  <span style="color: #008000; font-style: italic;">// error message</span>
  <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>errmsg == undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>errmsg=<span style="color: #ff00ff;">&quot;&quot;</span>;<span style="color: #800000;">&#125;</span>
  <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>errmsg<span style="color: #800000;">&#41;</span> echo<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;&lt;p&gt;&quot;</span>+errmsg+<span style="color: #ff00ff;">&quot;&lt;/p&gt;&quot;</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #008000; font-style: italic;">// error detail</span>
  <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>err != undefined<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>err.<span style="">constructor</span> == Error<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      echo<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;&lt;p&gt;Error Number: &quot;</span> + String<span style="color: #800000;">&#40;</span>err.<span style="">number</span> &amp; 0xFFFF<span style="color: #800000;">&#41;</span> + <span style="color: #ff00ff;">&quot;&lt;/p&gt;<span style="">\n</span>&lt;p&gt;Error Detail: &quot;</span>+err.<span style="">description</span>+<span style="color: #ff00ff;">&quot;&lt;/p&gt;&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  Response.<span style="">End</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span></pre></div>

<h4>Related Posts</h4><ul class="related_post"><li><a href="http://www.voidman.com/2005/11/php-operate-sql-server.html" title="PHP 操作 SQL Server">PHP 操作 SQL Server</a></li><li><a href="http://www.voidman.com/2004/12/recording-operation-automatically.html" title="自动记录操作日志">自动记录操作日志</a></li></ul><hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html">http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 操作 SQL Server</title>
		<link>http://www.voidman.com/2005/11/php-operate-sql-server.html</link>
		<comments>http://www.voidman.com/2005/11/php-operate-sql-server.html#comments</comments>
		<pubDate>Sun, 20 Nov 2005 11:14:16 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://www.voidman.com/?p=152</guid>
		<description><![CDATA[adodb 实在太庞大了，况且也不需要那么多的功能，就自己写了一个 PHP 操作 SQL Server 的类。带有强烈的 discuz 风格。 // sample $db = new dbstuff; $db-&#62;connect&#40;$dbserver, $dbuser, $dbpwd, $dbname, $codepage&#41;; class dbstuff &#123; /////////////////// // Attributes /////////////////// &#160; var $conn; var $exectimeout = 180; var $codepage; // Connection status: 1=&#62;opened, &#8230; <a href="http://www.voidman.com/2005/11/php-operate-sql-server.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://adodb.sourceforge.net/" rel="external nofollow">adodb</a> 实在太庞大了，况且也不需要那么多的功能，就自己写了一个 PHP 操作 SQL Server 的类。带有强烈的 discuz 风格。</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// sample</span>
<span style="color: #008080;">$db</span> = <span style="color: blue;">new</span> dbstuff;
<span style="color: #008080;">$db</span>-&gt;<span style="color: #006600;">connect</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$dbserver</span>, <span style="color: #008080;">$dbuser</span>, <span style="color: #008080;">$dbpwd</span>, <span style="color: #008080;">$dbname</span>, <span style="color: #008080;">$codepage</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p><span id="more-152"></span></p>

<div class="wp_syntax"><pre class="php"><span style="color: blue;">class</span> dbstuff <span style="color: #800000;">&#123;</span>
  <span style="color: #008000; font-style: italic;">///////////////////</span>
  <span style="color: #008000; font-style: italic;">// Attributes</span>
  <span style="color: #008000; font-style: italic;">///////////////////</span>
&nbsp;
  <span style="color: blue;">var</span> <span style="color: #008080;">$conn</span>;
  <span style="color: blue;">var</span> <span style="color: #008080;">$exectimeout</span> = <span style="color: #800080;">180</span>;
  <span style="color: blue;">var</span> <span style="color: #008080;">$codepage</span>;
  <span style="color: #008000; font-style: italic;">// Connection status: 1=&gt;opened, 0=&gt;closed</span>
  <span style="color: blue;">var</span> <span style="color: #008080;">$state</span> = <span style="color: #800080;">0</span>;
  <span style="color: blue;">var</span> <span style="color: #008080;">$querynum</span> = <span style="color: #800080;">0</span>;
  <span style="color: blue;">var</span> <span style="color: #008080;">$recordcount</span> = <span style="color: #800080;">0</span>;
  <span style="color: #008000; font-style: italic;">// save excuted sql</span>
  <span style="color: blue;">var</span> <span style="color: #008080;">$sqls</span> = <span style="color: blue;">array</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>; 
&nbsp;
  <span style="color: #008000; font-style: italic;">///////////////////</span>
  <span style="color: #008000; font-style: italic;">// Methods</span>
  <span style="color: #008000; font-style: italic;">///////////////////</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Open a new connection to the MSSQL server</span>
  <span style="color: blue;">function</span> connect<span style="color: #800000;">&#40;</span><span style="color: #008080;">$dbserver</span>, <span style="color: #008080;">$dbuser</span>, <span style="color: #008080;">$dbpwd</span>, <span style="color: #008080;">$dbname</span>, <span style="color: #008080;">$codepage</span> = <span style="color: #800080;">936</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$conn</span> = &amp; <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">codepage</span> = <span style="color: #008080;">$codepage</span>;
    <span style="color: #008080;">$conn</span> = @<span style="color: blue;">new</span> COM<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;ADODB.Connection&quot;</span>, <span style="color: blue;">NULL</span>, <span style="color: #008080;">$codepage</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$conn</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">halt</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'Can not connect to MSSQL Server'</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">CommandTimeout</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">exectimeout</span>;
    @<span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">Open</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Provider=SQLOLEDB; Data Source=$dbserver; UID=$dbuser; PWD=$dbpwd;Initial Catalog=$dbname&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">State</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">halt</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'Can not connect to Database Server'</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">state</span> = <span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">State</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Open a new connection to another MSSQL server</span>
  <span style="color: blue;">function</span> rconnect<span style="color: #800000;">&#40;</span><span style="color: #008080;">$dbserver</span>, <span style="color: #008080;">$dbuser</span>, <span style="color: #008080;">$dbpwd</span>, <span style="color: #008080;">$dbname</span>, <span style="color: #008080;">$codepage</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">connect</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$dbserver</span>, <span style="color: #008080;">$dbuser</span>, <span style="color: #008080;">$dbpwd</span>, <span style="color: #008080;">$dbname</span>, <span style="color: #008080;">$codepage</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Select ms sql database</span>
  <span style="color: blue;">function</span> select_db<span style="color: #800000;">&#40;</span><span style="color: #008080;">$dbname</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">return</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;USE [$dbname]&quot;</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Performs a query on the database</span>
  <span style="color: blue;">function</span> query<span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$conn</span> = &amp; <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>;
    <span style="color: #008080;">$query</span> = @<span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">Execute</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">Errors</span>-&gt;<span style="color: #006600;">Count</span> &gt; <span style="color: #800080;">0</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">halt</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'Database Query Error'</span>, <span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">sqls</span><span style="color: #800000;">&#91;</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$sql</span>;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$query</span><span style="color: #800000;">&#41;</span> <span style="color: blue;">return</span> <span style="color: blue;">FALSE</span>;
    <span style="color: #008000; font-style: italic;">/* NO RECORDSET RETURNED */</span>
    <span style="color: #008000; font-style: italic;">/* INSERT, DELETE, NO RETURN(rs, v) PROC AND SO ON */</span>
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$query</span>-&gt;<span style="color: #006600;">State</span> == <span style="color: #800080;">0</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">recordcount</span> = <span style="color: #800080;">0</span>;
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">querynum</span>++;
      <span style="color: blue;">return</span> <span style="color: blue;">TRUE</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">recordcount</span> = <span style="color: #800080;">-1</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">querynum</span>++;
    <span style="color: blue;">return</span> <span style="color: #008080;">$query</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch a result row as an associative array</span>
  <span style="color: #008000; font-style: italic;">/* FETCH ONE RESULT ROW ONLY BY DEFAULT*/</span>
  <span style="color: blue;">function</span> fetch_array<span style="color: #800000;">&#40;</span>&amp;<span style="color: #008080;">$rs</span>, <span style="color: #008080;">$freeresult</span> = <span style="color: blue;">TRUE</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">BOF</span> &amp;&amp; <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> <span style="color: blue;">NULL</span>;
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        <span style="color: #008080;">$arr</span> = <span style="color: blue;">array</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #008080;">$colums</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span>-&gt;<span style="color: #006600;">Count</span>;
        <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span>=<span style="color: #800080;">0</span>; <span style="color: #008080;">$i</span> &lt; <span style="color: #008080;">$colums</span>; <span style="color: #008080;">$i</span>++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$fld</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span><span style="color: #800000;">&#41;</span>;
          <span style="color: #008080;">$arr</span><span style="color: #800000;">&#91;</span><span style="color: #ff0000;">strtolower</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Name</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">datetime_convert</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Value</span>, <span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Type</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span>
        <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$freeresult</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span><span style="color: blue;">else</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span>
        <span style="color: blue;">return</span> <span style="color: #008080;">$arr</span>;
      <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
        <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
        <span style="color: blue;">return</span> <span style="color: blue;">NULL</span>;
      <span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch a result row as enumerated array</span>
  <span style="color: #008000; font-style: italic;">/* FETCH ONE RESULT ROW ONLY BY DEFAULT*/</span>
  <span style="color: blue;">function</span> fetch_row<span style="color: #800000;">&#40;</span>&amp;<span style="color: #008080;">$rs</span>, <span style="color: #008080;">$freeresult</span> = <span style="color: blue;">TRUE</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">BOF</span> &amp;&amp; <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> <span style="color: blue;">NULL</span>;
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        <span style="color: #008080;">$arr</span> = <span style="color: blue;">array</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #008080;">$colums</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span>-&gt;<span style="color: #006600;">Count</span>;
        <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span>=<span style="color: #800080;">0</span>; <span style="color: #008080;">$i</span> &lt; <span style="color: #008080;">$colums</span>; <span style="color: #008080;">$i</span>++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$fld</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span><span style="color: #800000;">&#41;</span>;
          <span style="color: #008080;">$arr</span><span style="color: #800000;">&#91;</span><span style="color: #008080;">$i</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">datetime_convert</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Value</span>, <span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Type</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span>
        <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$freeresult</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span><span style="color: blue;">else</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span>
        <span style="color: blue;">return</span> <span style="color: #008080;">$arr</span>;
      <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
        <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
        <span style="color: blue;">return</span> <span style="color: blue;">NULL</span>;
      <span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch all result rows as associative array </span>
  <span style="color: blue;">function</span> fetch_all<span style="color: #800000;">&#40;</span>&amp;<span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">BOF</span> &amp;&amp; <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">return</span> <span style="color: blue;">null</span>;
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$arr</span> = <span style="color: blue;">array</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008080;">$colums</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span>-&gt;<span style="color: #006600;">Count</span>;
      <span style="color: #008080;">$rows</span> = <span style="color: #800080;">0</span>;
      <span style="color: blue;">while</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span>=<span style="color: #800080;">0</span>; <span style="color: #008080;">$i</span> &lt; <span style="color: #008080;">$colums</span>; <span style="color: #008080;">$i</span>++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$fld</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span><span style="color: #800000;">&#41;</span>;
          <span style="color: #008080;">$arr</span><span style="color: #800000;">&#91;</span><span style="color: #008080;">$rows</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span><span style="color: #ff0000;">strtolower</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Name</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">datetime_convert</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Value</span>, <span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Type</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span>
        <span style="color: #008080;">$rows</span>++;
        <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #800000;">&#125;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> <span style="color: #008080;">$arr</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Open a recordset</span>
  <span style="color: blue;">function</span> recordset<span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span>, <span style="color: #008080;">$cursortype</span> = <span style="color: #800080;">3</span>, <span style="color: #008080;">$locktype</span> = <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$conn</span> = &amp; <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>;
    <span style="color: #008080;">$rs</span> = @<span style="color: blue;">new</span> COM<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;ADODB.RecordSet&quot;</span>, <span style="color: blue;">NULL</span>, <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">codepage</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">CursorLocation</span> = <span style="color: #800080;">3</span>;
    @<span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Open</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span>, <span style="color: #008080;">$conn</span>, <span style="color: #008080;">$cursortype</span>, <span style="color: #008080;">$locktype</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">Errors</span>-&gt;<span style="color: #006600;">Count</span> &gt; <span style="color: #800080;">0</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">halt</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'Database Query Error'</span>, <span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">querynum</span>++;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">sqls</span><span style="color: #800000;">&#91;</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$sql</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$rs</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch all result rows in one page as associative array </span>
  <span style="color: blue;">function</span> fetch_page<span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span>, <span style="color: #008080;">$pagesize</span> = <span style="color: #800080;">20</span>, <span style="color: #008080;">$curpage</span> = <span style="color: #800080;">1</span>, <span style="color: #008080;">$cursortype</span> = <span style="color: #800080;">3</span>, <span style="color: #008080;">$locktype</span> = <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$conn</span> = &amp; <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>;
    <span style="color: #008080;">$rs</span> = @<span style="color: blue;">new</span> COM<span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;ADODB.RecordSet&quot;</span>, <span style="color: blue;">NULL</span>, <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">codepage</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">CursorLocation</span> = <span style="color: #800080;">3</span>;
    <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">CacheSize</span> = <span style="color: #008080;">$pagesize</span> &lt; <span style="color: #800080;">100</span> ? <span style="color: #008080;">$pagesize</span> : <span style="color: #800080;">100</span>;
    @<span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Open</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span>, <span style="color: #008080;">$conn</span>, <span style="color: #008080;">$cursortype</span>, <span style="color: #008080;">$locktype</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$conn</span>-&gt;<span style="color: #006600;">Errors</span>-&gt;<span style="color: #006600;">Count</span> &gt; <span style="color: #800080;">0</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">halt</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">'Database Query Error'</span>, <span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">sqls</span><span style="color: #800000;">&#91;</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$sql</span>;
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">querynum</span>++;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">BOF</span> &amp;&amp; <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">recordcount</span> = <span style="color: #800080;">0</span>;
      <span style="color: blue;">return</span> <span style="color: blue;">NULL</span>;
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">recordcount</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">RecordCount</span>;
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$pagesize</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$pagesize</span> = <span style="color: #800080;">20</span>;
      <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">PageSize</span> = <span style="color: #008080;">$pagesize</span>;
      <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span>!<span style="color: #008080;">$curpage</span><span style="color: #800000;">&#41;</span>
        <span style="color: #008080;">$curpage</span> = <span style="color: #800080;">1</span>;
      <span style="color: blue;">elseif</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$curpage</span> &gt; <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">PageCount</span><span style="color: #800000;">&#41;</span>
        <span style="color: #008080;">$curpage</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">PageCount</span>;
      <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">AbsolutePage</span> = <span style="color: #008080;">$curpage</span>;
      <span style="color: #008080;">$arr</span> = <span style="color: blue;">array</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008080;">$colums</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span>-&gt;<span style="color: #006600;">Count</span>;
      <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$i</span>=<span style="color: #800080;">0</span>; <span style="color: #008080;">$i</span>&lt; <span style="color: #008080;">$pagesize</span>; <span style="color: #008080;">$i</span>++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
        <span style="color: blue;">for</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$j</span>=<span style="color: #800080;">0</span>; <span style="color: #008080;">$j</span> &lt; <span style="color: #008080;">$colums</span>; <span style="color: #008080;">$j</span>++<span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
          <span style="color: #008080;">$fld</span> = <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$j</span><span style="color: #800000;">&#41;</span>;
          <span style="color: #008080;">$arr</span><span style="color: #800000;">&#91;</span><span style="color: #008080;">$i</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span><span style="color: #ff0000;">strtolower</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Name</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#93;</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">datetime_convert</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Value</span>, <span style="color: #008080;">$fld</span>-&gt;<span style="color: #006600;">Type</span><span style="color: #800000;">&#41;</span>;
        <span style="color: #800000;">&#125;</span>
        <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">MoveNext</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
        <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span> <span style="color: blue;">break</span>;
      <span style="color: #800000;">&#125;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> <span style="color: #008080;">$arr</span>;
    <span style="color: #800000;">&#125;</span>
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Fetch one field value of a result row</span>
  <span style="color: #008000; font-style: italic;">/* SHOULD BE CALL BEFORE fetch_array, fetch_row, fetch_all */</span>
  <span style="color: blue;">function</span> result<span style="color: #800000;">&#40;</span>&amp;<span style="color: #008080;">$rs</span>, <span style="color: #008080;">$row</span> = <span style="color: #800080;">0</span>, <span style="color: #008080;">$mixfield</span> = <span style="color: #800080;">0</span>, <span style="color: #008080;">$freeresult</span> = <span style="color: blue;">TRUE</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">BOF</span> &amp;&amp; <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">EOF</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
      <span style="color: blue;">return</span> <span style="color: blue;">NULL</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$row</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Move</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$row</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$value</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">datetime_convert</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #800000;">&#91;</span><span style="color: #008080;">$mixfield</span><span style="color: #800000;">&#93;</span>-&gt;<span style="color: #006600;">Value</span>, <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">fields</span><span style="color: #800000;">&#91;</span><span style="color: #008080;">$mixfield</span><span style="color: #800000;">&#93;</span>-&gt;<span style="color: #006600;">Type</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$freeresult</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">free_result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$value</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Check record existence</span>
  <span style="color: blue;">function</span> exists<span style="color: #800000;">&#40;</span><span style="color: #008080;">$table</span>, <span style="color: #008080;">$cond</span>=<span style="color: #ff00ff;">''</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$query</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT COUNT(*) FROM [$table]&quot;</span>.<span style="color: #800000;">&#40;</span><span style="color: #008080;">$cond</span>?<span style="color: #ff00ff;">&quot; WHERE $cond&quot;</span>:<span style="color: blue;">NULL</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$query</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Convert timestamp to mssql datetime style as YYYY-MM-DD hh:mm:ss</span>
  <span style="color: blue;">function</span> datetime_convert<span style="color: #800000;">&#40;</span><span style="color: #008080;">$fldv</span>, <span style="color: #008080;">$fldt</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$fldt</span> == <span style="color: #800080;">135</span> &amp;&amp; <span style="color: #008080;">$fldv</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
      <span style="color: blue;">return</span> <span style="color: #ff0000;">date</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;Y-m-d H:i:s&quot;</span>, <span style="color: #008080;">$fldv</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: blue;">return</span> <span style="color: #008080;">$fldv</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the number of rows in a result</span>
  <span style="color: blue;">function</span> num_rows<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$count</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">recordcount</span>;
    <span style="color: #008000; font-style: italic;">/* RS MAY RETURNED BY EXECUTE, NOT USE OPEN RECORDSET METHOD */</span>
    <span style="color: #008000; font-style: italic;">/* BUT THIS MAY NOT WORK WELL 
    if($count == -1) $count = $this-&gt;affected_rows();*/</span>
    <span style="color: blue;">return</span> <span style="color: #008080;">$count</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the number of fields in a result </span>
  <span style="color: blue;">function</span> num_fields<span style="color: #800000;">&#40;</span>&amp;<span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">return</span> <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Fields</span>-&gt;<span style="color: #006600;">Count</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the auto generated id used in the last query</span>
  <span style="color: blue;">function</span> insert_id<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$query</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT @@IDENTITY&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$query</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the number of affected rows in a previous SQL operation (UPDATE, DELETE)</span>
  <span style="color: #008000; font-style: italic;">/* IT SHOULD BE CALLED IMMEDIATELY AFTER A SQL OPERATION */</span>
  <span style="color: #008000; font-style: italic;">/* IF 'SET NOCOUNT ON' HAD BEEN SET BEFORE THE SQL OPERATION, IT WILL NOT WORK */</span>
  <span style="color: blue;">function</span> affected_rows<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$query</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT @@ROWCOUNT&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$query</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the mssql object id, use this function to check object exists</span>
  <span style="color: blue;">function</span> object_id<span style="color: #800000;">&#40;</span><span style="color: #008080;">$obj</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$query</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT OBJECT_ID('$obj')&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$query</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get the mssql version</span>
  <span style="color: blue;">function</span> version<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$query</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT @@VERSION&quot;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">result</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$query</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Release resource</span>
  <span style="color: blue;">function</span> free_result<span style="color: #800000;">&#40;</span>&amp;<span style="color: #008080;">$rs</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">State</span> == <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008080;">$rs</span>-&gt;<span style="color: #006600;">Release</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: #008080;">$rs</span> = <span style="color: blue;">null</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Close db connection</span>
  <span style="color: blue;">function</span> close<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: blue;">if</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">state</span> == <span style="color: #800080;">1</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>-&gt;<span style="color: #006600;">Close</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>-&gt;<span style="color: #006600;">Release</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
      <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span> = <span style="color: blue;">null</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">state</span> = <span style="color: #800080;">0</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get error details </span>
  <span style="color: #008000; font-style: italic;">/* SHOULD BE CALLED BEFORE errno() */</span>
  <span style="color: blue;">function</span> error<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$errors</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>-&gt;<span style="color: #006600;">Errors</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$errors</span>-&gt;<span style="color: #006600;">Count</span> == <span style="color: #800080;">0</span><span style="color: #800000;">&#41;</span> <span style="color: blue;">return</span> <span style="color: #ff00ff;">''</span>;
    <span style="color: #008080;">$err</span> = <span style="color: #008080;">$errors</span>-&gt;<span style="color: #006600;">Item</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$errors</span>-&gt;<span style="color: #006600;">Count</span><span style="color: #800080;">-1</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$err</span>-&gt;<span style="color: #006600;">Description</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Get error number</span>
  <span style="color: blue;">function</span> errno<span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$errors</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">conn</span>-&gt;<span style="color: #006600;">Errors</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$errors</span>-&gt;<span style="color: #006600;">Count</span> == <span style="color: #800080;">0</span><span style="color: #800000;">&#41;</span> <span style="color: blue;">return</span> <span style="color: #800080;">0</span>;
    <span style="color: #008080;">$err</span> = <span style="color: #008080;">$errors</span>-&gt;<span style="color: #006600;">Item</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$errors</span>-&gt;<span style="color: #006600;">Count</span><span style="color: #800080;">-1</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">return</span> <span style="color: #008080;">$err</span>-&gt;<span style="color: #006600;">NativeError</span>;
  <span style="color: #800000;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// halt script processing, show error message</span>
  <span style="color: blue;">function</span> halt<span style="color: #800000;">&#40;</span><span style="color: #008080;">$message</span> = <span style="color: #ff00ff;">''</span>, <span style="color: #008080;">$sql</span> = <span style="color: #ff00ff;">''</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008080;">$errno</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">errno</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$errno</span> == <span style="color: #800080;">5701</span><span style="color: #800000;">&#41;</span> <span style="color: blue;">return</span>;
    <span style="color: #008080;">$error</span> = <span style="color: #008080;">$this</span>-&gt;<span style="color: #006600;">error</span><span style="color: #800000;">&#40;</span><span style="color: #800000;">&#41;</span>;
    <span style="color: #008080;">$script</span> = <span style="color: #ff00ff;">'&lt;hr noshade size=1&gt;PHP: '</span>.<span style="color: #008080;">$GLOBALS</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'_SERVER'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'PHP_SELF'</span><span style="color: #800000;">&#93;</span>;
    <span style="color: #008080;">$sql</span> = <span style="color: #008080;">$sql</span> ? <span style="color: #ff00ff;">'&lt;hr noshade size=1&gt;SQL: '</span>.<span style="color: #ff0000;">nl2br</span><span style="color: #800000;">&#40;</span><span style="color: #ff0000;">htmlspecialchars</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> : <span style="color: #ff00ff;">''</span>;
    <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$GLOBALS</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'debug'</span><span style="color: #800000;">&#93;</span> &amp;&amp; <span style="color: #008080;">$GLOBALS</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'userid'</span><span style="color: #800000;">&#93;</span> &amp;&amp; !<span style="color: #ff0000;">defined</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;AJAX&quot;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#123;</span>
      <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: #008080;">$GLOBALS</span><span style="color: #800000;">&#91;</span><span style="color: #ff00ff;">'adminid'</span><span style="color: #800000;">&#93;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
        <span style="color: #008080;">$output</span> = <span style="color: #008080;">$message</span>.<span style="color: #008080;">$script</span>.<span style="color: #008080;">$sql</span>.<span style="color: #ff00ff;">'&lt;hr noshade size=1 color=gray&gt;ERR: '</span>.<span style="color: #008080;">$error</span>.<span style="color: #ff00ff;">'&lt;hr noshade size=1&gt;NUM: '</span>.<span style="color: #008080;">$errno</span>;
      <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
        <span style="color: #008080;">$output</span> = <span style="color: #008080;">$message</span>.<span style="color: #008080;">$script</span>;
      <span style="color: #800000;">&#125;</span>
    <span style="color: #800000;">&#125;</span> <span style="color: blue;">else</span> <span style="color: #800000;">&#123;</span>
      <span style="color: #008080;">$output</span> = <span style="color: #008080;">$message</span>;
    <span style="color: #800000;">&#125;</span>
    <span style="color: #008080;">$output</span> = <span style="color: #ff00ff;">'&lt;font style=&quot;font-size:9pt&quot;&gt;'</span>.<span style="color: #008080;">$output</span>.<span style="color: #ff00ff;">'&lt;/font&gt;'</span>;
    <span style="color: blue;">die</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$output</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
<span style="color: #800000;">&#125;</span></pre></div>

<h4>Related Posts</h4><ul class="related_post"><li><a href="http://www.voidman.com/2004/12/recording-operation-automatically.html" title="自动记录操作日志">自动记录操作日志</a></li><li><a href="http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html" title="在 Windows 2003 IIS6 下跑 PHP 太不不靠谱了">在 Windows 2003 IIS6 下跑 PHP 太不不靠谱了</a></li><li><a href="http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html" title="JScript 仿 PHP 操作 SQL Server">JScript 仿 PHP 操作 SQL Server</a></li></ul><hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2005/11/php-operate-sql-server.html">http://www.voidman.com/2005/11/php-operate-sql-server.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2005/11/php-operate-sql-server.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自动记录操作日志</title>
		<link>http://www.voidman.com/2004/12/recording-operation-automatically.html</link>
		<comments>http://www.voidman.com/2004/12/recording-operation-automatically.html#comments</comments>
		<pubDate>Wed, 29 Dec 2004 08:08:12 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://www.voidman.com/2004/12/automatic-record-operation/</guid>
		<description><![CDATA[通常对数据的操作都需要记录日志，由于表结构的不同，每次都需要重新组织 SQL 语句则显得相当繁琐。写了几个函数来解决这个问题，不过有局限性：表的第一个字段必须为 id int identity。 // Sample // 生成日志表 createlogtable&#40;$table&#41;; // 生成记录操作日志的SQL语句 $logsql = genopelogsql&#40;$table, &#34;id=$id&#34;, 'update'&#41;; // 将日志记录SQL拼接到原SQL $sql = $logsql.$sql; // 执行操作 $db-&#62;query&#40;$sql&#41;; function genopelogsql&#40;$table, $cond, $opetype&#41; &#123; global $db, $tablepre, $username; $prefix = $tablepre; if &#40;empty&#40;$prefix&#41;&#41; &#8230; <a href="http://www.voidman.com/2004/12/recording-operation-automatically.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>通常对数据的操作都需要记录日志，由于表结构的不同，每次都需要重新组织 SQL 语句则显得相当繁琐。写了几个函数来解决这个问题，不过有局限性：表的第一个字段必须为 id int identity。</p>

<div class="wp_syntax"><pre class="php"><span style="color: #008000; font-style: italic;">// Sample</span>
<span style="color: #008000; font-style: italic;">// 生成日志表</span>
createlogtable<span style="color: #800000;">&#40;</span><span style="color: #008080;">$table</span><span style="color: #800000;">&#41;</span>;
<span style="color: #008000; font-style: italic;">// 生成记录操作日志的SQL语句</span>
<span style="color: #008080;">$logsql</span> = genopelogsql<span style="color: #800000;">&#40;</span><span style="color: #008080;">$table</span>, <span style="color: #ff00ff;">&quot;id=$id&quot;</span>, <span style="color: #ff00ff;">'update'</span><span style="color: #800000;">&#41;</span>;
<span style="color: #008000; font-style: italic;">// 将日志记录SQL拼接到原SQL</span>
<span style="color: #008080;">$sql</span> = <span style="color: #008080;">$logsql</span>.<span style="color: #008080;">$sql</span>;
<span style="color: #008000; font-style: italic;">// 执行操作</span>
<span style="color: #008080;">$db</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$sql</span><span style="color: #800000;">&#41;</span>;</pre></div>

<p><span id="more-129"></span></p>

<div class="wp_syntax"><pre class="php"><span style="color: blue;">function</span> genopelogsql<span style="color: #800000;">&#40;</span><span style="color: #008080;">$table</span>, <span style="color: #008080;">$cond</span>, <span style="color: #008080;">$opetype</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
  <span style="color: blue;">global</span> <span style="color: #008080;">$db</span>, <span style="color: #008080;">$tablepre</span>, <span style="color: #008080;">$username</span>;
  <span style="color: #008080;">$prefix</span> = <span style="color: #008080;">$tablepre</span>;
  <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: blue;">empty</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$prefix</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$prefix</span> = <span style="color: #ff00ff;">'ope'</span>;
  <span style="color: #008080;">$table_log</span> = <span style="color: #ff00ff;">&quot;{$table}_{$tablepre}log&quot;</span>;
  <span style="color: #008000; font-style: italic;">// 操作者、操作类型</span>
  <span style="color: #008080;">$operator</span> = <span style="color: #ff00ff;">&quot;'&quot;</span>.<span style="color: #ff0000;">strtolower</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$opetype</span><span style="color: #800000;">&#41;</span>.<span style="color: #ff00ff;">&quot;d by $username' AS operator&quot;</span>;
  <span style="color: #008000; font-style: italic;">// 通过 SELECT * 而无需指定字段名</span>
  <span style="color: #008080;">$sql</span> .= <span style="color: #ff00ff;">&quot;INSERT INTO $table_log SELECT *, $operator, getdate() AS operatetime FROM $table&quot;</span>.<span style="color: #800000;">&#40;</span><span style="color: #008080;">$cond</span> ? <span style="color: #ff00ff;">&quot; WHERE $cond&quot;</span> : <span style="color: blue;">NULL</span><span style="color: #800000;">&#41;</span>;
  <span style="color: blue;">return</span> <span style="color: #008080;">$sql</span>.<span style="color: #ff0000;">chr</span><span style="color: #800000;">&#40;</span><span style="color: #800080;">13</span><span style="color: #800000;">&#41;</span>;
<span style="color: #800000;">&#125;</span>
&nbsp;
<span style="color: blue;">function</span> createlogtable<span style="color: #800000;">&#40;</span><span style="color: #008080;">$table</span>, <span style="color: #008080;">$prefix</span> = <span style="color: #ff00ff;">''</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
  <span style="color: blue;">global</span> <span style="color: #008080;">$db</span>, <span style="color: #008080;">$tablepre</span>;
  <span style="color: #008080;">$prefix</span> = <span style="color: #008080;">$tablepre</span>;
  <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span><span style="color: blue;">empty</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$prefix</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> <span style="color: #008080;">$prefix</span> = <span style="color: #ff00ff;">'ope'</span>;
  <span style="color: #008000; font-style: italic;">// 日志表名</span>
  <span style="color: #008080;">$table_log</span> = <span style="color: #ff00ff;">&quot;{$table}_{$prefix}log&quot;</span>;
  <span style="color: #008000; font-style: italic;">// 检查日志表是否存在</span>
  <span style="color: blue;">if</span> <span style="color: #800000;">&#40;</span>!<span style="color: #800000;">&#40;</span><span style="color: #008080;">$db</span>-&gt;<span style="color: #006600;">object_id</span><span style="color: #800000;">&#40;</span><span style="color: #008080;">$table_log</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span><span style="color: #800000;">&#41;</span> <span style="color: #800000;">&#123;</span>
    <span style="color: #008000; font-style: italic;">// 局限性：表的第一个字段必须为 id int identity</span>
    <span style="color: #008080;">$db</span>-&gt;<span style="color: #006600;">query</span><span style="color: #800000;">&#40;</span><span style="color: #ff00ff;">&quot;SELECT 1 as src_id, * INTO [dbo].$table_log FROM $table WHERE 1&lt;&gt;1
    ALTER TABLE $table_log DROP COLUMN id
    ALTER TABLE $table_log ALTER COLUMN src_id INT NULL
    ALTER TABLE $table_log ADD {$prefix}operator VARCHAR(50) NULL
    ALTER TABLE $table_log ADD {$prefix}operatetime DATETIME NULL CONSTRAINT DF_{$table_log}_operatetime DEFAULT getdate() WITH VALUES&quot;</span><span style="color: #800000;">&#41;</span>;
  <span style="color: #800000;">&#125;</span>
<span style="color: #800000;">&#125;</span></pre></div>

<h4>Related Posts</h4><ul class="related_post"><li><a href="http://www.voidman.com/2005/11/php-operate-sql-server.html" title="PHP 操作 SQL Server">PHP 操作 SQL Server</a></li><li><a href="http://www.voidman.com/2009/01/do-not-recommend-running-php-under-win2k3-iis.html" title="在 Windows 2003 IIS6 下跑 PHP 太不不靠谱了">在 Windows 2003 IIS6 下跑 PHP 太不不靠谱了</a></li><li><a href="http://www.voidman.com/2006/01/jscript-dbclass-for-sql-server-php-style.html" title="JScript 仿 PHP 操作 SQL Server">JScript 仿 PHP 操作 SQL Server</a></li></ul><hr /><a href="http://www.voidman.com">Voidman.com</a> | Link: <a href="http://www.voidman.com/2004/12/recording-operation-automatically.html">http://www.voidman.com/2004/12/recording-operation-automatically.html</a><br /><img alt="linezing" width="1" height="1" src="http://img.tongji.linezing.com/288120/tongji.gif" />]]></content:encoded>
			<wfw:commentRss>http://www.voidman.com/2004/12/recording-operation-automatically.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

