<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://miaomin.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fmiaomin.spaces.live.com%2fcategory%2fPHP__xa5Databases%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>苗苗 合作 交流: PHP/Databases</title><description /><link>http://miaomin.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catPHP__xa5Databases</link><language>en-US</language><pubDate>Mon, 03 Sep 2007 03:40:18 GMT</pubDate><lastBuildDate>Mon, 03 Sep 2007 03:40:18 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://miaomin.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-8913911617972053559</live:id><live:alias>miaomin</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>通过PHP取得Oracle系统时间后无法正常显示的问题</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!333.entry</link><description>通过&lt;br&gt; &amp;quot;$query = &amp;quot;SELECT sysdate FROM dual&amp;quot;;
&lt;br&gt;$usedateupdate = $dbh_oci -&amp;gt;getOne($query);&amp;quot;

&lt;br&gt;&lt;br&gt;输出 $usedateupdate，发现只能输出&amp;quot;DD-Mon-YY&amp;quot; 格式的日期信息，而不是预想中的&amp;quot;DD-Mon-YY  HH24:MI:SS&amp;quot;格式．

&lt;br&gt;&lt;br&gt;解决方案：在SQL语句中，添加to_char()函数，指定自己需要的日期格式．&lt;br&gt; 原SQL语句修改如下：
&lt;br&gt;&amp;quot;$query = &amp;quot;SELECT TO_CHAR(sysdate, 'DD-MM-YY HH24:MI:SS') FROM dual&amp;quot;;&amp;quot;

&lt;br&gt;&lt;br&gt;后续问题：

将日期按指定形式赋值给一变量,然后在做INSERT操作时，发现原表中的DATE字段不能正常实现，一直提示not valid month

&lt;br&gt;&lt;br&gt;解决方案：在SQL语句中，使用to_date()函数，将字符串形式变量转义成日期型，&lt;br&gt;原SQL语句修改如下：
&lt;br&gt;&amp;quot;$query = &amp;quot;INSERT INTO useritempack VALUES (S_PACKID.Nextval,
                                                  '&amp;quot;.$uid.&amp;quot;',
                                                  '&amp;quot;.$infocode.&amp;quot;',
                                                  to_date('$usedateupdate','DD-MM-YY HH24:MI:SS'),
                                                  '&amp;quot;.ENABLED.&amp;quot;',
                                                  '&amp;quot;.$toyinfo[0]['INFONAME'].&amp;quot;',
                                                  '&amp;quot;.$toyinfo[0]['ISPIECE'].&amp;quot;',
                                                  '&amp;quot;.$usenumupdate.&amp;quot;',
                                                  '&amp;quot;.$toyinfo[0]['GAMEID'].&amp;quot;',
                                                  '&amp;quot;.$isused.&amp;quot;')&amp;quot;;&amp;quot;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+%e9%80%9a%e8%bf%87PHP%e5%8f%96%e5%be%97Oracle%e7%b3%bb%e7%bb%9f%e6%97%b6%e9%97%b4%e5%90%8e%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e6%98%be%e7%a4%ba%e7%9a%84%e9%97%ae%e9%a2%98&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!333.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!333.entry</guid><pubDate>Tue, 11 Jul 2006 07:39:04 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!333/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!333.entry#comment</wfw:comment><dcterms:modified>2006-07-11T07:41:54Z</dcterms:modified></item><item><title>PHP读取Oracle数据库，中文字符显示问号的解决案例</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!331.entry</link><description>本地测试无误，上传至服务器后，发现中文字符显示为？？？？，而且每一处中文字符都变成？？？？，初步估计并不是因为编码原因造成的，查阅了大量的资料，PHP Manual上的解释我认为最符合当前出现的状况，这里转载一段：&lt;br&gt;&lt;br&gt;
&lt;div&gt;
&lt;h1&gt;&lt;a&gt;字符编码&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PHP 的 XML 扩展库支持不同字符编码（&lt;i&gt;character encoding&lt;/i&gt;）的 &lt;a href="http://www.unicode.org/"&gt;Unicode&lt;/a&gt; 字符集。字符编码有两种形式，它们分别是“源编码”（&lt;i&gt;source encoding&lt;/i&gt;）和“目标编码”（&lt;i&gt;target encoding&lt;/i&gt;）。PHP 对文档内部表示的编码方式是 UTF-8。 
&lt;p&gt;源编码将在 XML 文档被&lt;a href="http://au2.php.net/manual/zh/function.xml-parse.php"&gt;解析&lt;/a&gt;后完成。源编码可在&lt;a href="http://au2.php.net/manual/zh/function.xml-parser-create.php"&gt;建立一个 XML 解析器&lt;/a&gt;时指明（该编码方式在 XML 解析器的生命周期中不能被再次改变）。支持的编码方式包括 ISO-8859-1，US-ASCII 和 UTF-8。前两种为单字节编码，即每个字符被一个单一的字节表示。UTF-8 支持 1 至 4 个字节的多 bit（最多 12）字符编码。PHP 默认使用 ISO-8859-1 作为源编码方式。 
&lt;p&gt;目标编码将在 PHP 向 XML 处理器函数传送数据时被完成。当 XML 解析器被建立后，目标编码将被设置成与源编码相同的编码方式，但该方式可在任何时候被更改。目标编码将影响字符数据、标记符名称以及处理指令目标（PI target）。 
&lt;p&gt;如果 XML 解析器遇到其源编码方式表示能力之外的字符，它将返回一个错误。 
&lt;p&gt;&lt;span style="color:rgb(255,0,0)"&gt;当 PHP 在被解析的 XML 文档中遇到当前目标编码无法表示的字符时，这些字符将被“降级”。简单的说，这些字符将被问号替换&lt;/span&gt;。 &lt;/div&gt;问题出在服务器上，可能是PHP的字符设置问题，可能是Apache的字符设置问题，也有可能是服务器安装了Oci8扩展后的客户端数据库字符设置的问题，在修改php.ini和httpd.conf文件无结后，终于确定问题出现在Oci8扩展的客户端数据库字符设置上，运行以下命令后，页面上的中文字符正常显示，问题解决！&lt;br&gt;&lt;br&gt;&lt;span style="color:rgb(255,0,0)"&gt;export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK&lt;br&gt;&lt;br&gt;重启Apache&lt;br&gt;&lt;/span&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+PHP%e8%af%bb%e5%8f%96Oracle%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%8c%e4%b8%ad%e6%96%87%e5%ad%97%e7%ac%a6%e6%98%be%e7%a4%ba%e9%97%ae%e5%8f%b7%e7%9a%84%e8%a7%a3%e5%86%b3%e6%a1%88%e4%be%8b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!331.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!331.entry</guid><pubDate>Fri, 07 Jul 2006 08:58:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!331/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!331.entry#comment</wfw:comment><dcterms:modified>2006-11-07T06:51:54Z</dcterms:modified></item><item><title>PHP用于登录的类</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!319.entry</link><description>&lt;p&gt;&amp;lt;? &lt;br&gt;/* &lt;br&gt; *  名称：CnkknD PHP Login Class &lt;br&gt; *  描述：PHP用于登录的类，基于MySQL &lt;br&gt; *  作者：Daniel King&lt;br&gt; */ 
&lt;p&gt;class Login &lt;br&gt;{ &lt;br&gt;    var $username;    //用户名 &lt;br&gt;    var $userpass;    //密码 &lt;br&gt;    var $userid;    //用户id &lt;br&gt;    var $userlevel;    //用户级别 
&lt;p&gt;    var $authtable=&amp;quot;account&amp;quot;;    //验证用数据表 
&lt;p&gt;    var $usecookie=true;    //使用cookie保存sessionid &lt;br&gt;    var $cookiepath='/';    //cookie路径 &lt;br&gt;    var $cookietime=108000;    //cookie有效时间 
&lt;p&gt;    var $err_mysql=&amp;quot;mysql error&amp;quot;;            //mysql出错提示 &lt;br&gt;    var $err_username=&amp;quot;username invalid&amp;quot;;    //用户名无效提示 &lt;br&gt;    var $err_user=&amp;quot;user invalid&amp;quot;;            //用户无效提示(被封禁) &lt;br&gt;    var $err_password=&amp;quot;password error&amp;quot;;        //密码错误提示 
&lt;p&gt;    var $err;    //出错提示 
&lt;p&gt;    var $error_report=false;    //显示错误 
&lt;p&gt;    function Login($dbserv,$dbport,$dbuser,$dbpass,$dbname)    //构造函数,连接数据库 &lt;br&gt;    { &lt;br&gt;        if(@mysql_pconnect($dbserv.&amp;quot;:&amp;quot;.$dbport,$dbuser,$dbpass)) &lt;br&gt;        { &lt;br&gt;            mysql_select_db($dbname); &lt;br&gt;        } &lt;br&gt;        else &lt;br&gt;        { &lt;br&gt;            $this-&amp;gt;errReport($this-&amp;gt;err_mysql); &lt;br&gt;            $this-&amp;gt;err=$this-&amp;gt;err_mysql;   &lt;br&gt;        } &lt;br&gt;    } 
&lt;p&gt;    function isLoggedin()    //判断是否登录 &lt;br&gt;    { &lt;br&gt;        if(isset($_COOKIE['sid']))    //如果cookie中保存有sid &lt;br&gt;        { &lt;br&gt;            session_id($_COOKIE['sid']);     &lt;br&gt;            session_start(); &lt;br&gt;            $this-&amp;gt;username=$_SESSION['username']; &lt;br&gt;            $this-&amp;gt;userid=$_SESSION['userid']; &lt;br&gt;            $this-&amp;gt;userlevel=$_SESSION['userlevel']; &lt;br&gt;            return true; &lt;br&gt;        } &lt;br&gt;        else    //如果cookie中未保存sid,则直接检查session &lt;br&gt;        { &lt;br&gt;            session_start(); &lt;br&gt;            if(isset($_SESSION['username'])) &lt;br&gt;                return true; &lt;br&gt;        } &lt;br&gt;        return false;                     &lt;br&gt;    } 
&lt;p&gt;    function userAuth($username,$userpass)    //用户认证 &lt;br&gt;    { &lt;br&gt;        $this-&amp;gt;username=$username; &lt;br&gt;        $this-&amp;gt;userpass=$userpass; &lt;br&gt;        $query=&amp;quot;select * from `&amp;quot;.$this-&amp;gt;authtable.&amp;quot;` where `username`='$username';&amp;quot;; &lt;br&gt;        $result=mysql_query($query); &lt;br&gt;        if(mysql_num_rows($result)!=0)    //找到此用户 &lt;br&gt;        { &lt;br&gt;            $row=mysql_fetch_array($result); &lt;br&gt;            if($row['bannd']==1)    //此用户被封禁 &lt;br&gt;            { &lt;br&gt;                $this-&amp;gt;errReport($this-&amp;gt;err_user); &lt;br&gt;                $this-&amp;gt;err=$this-&amp;gt;err_user; &lt;br&gt;                return false; &lt;br&gt;            } &lt;br&gt;            elseif(md5($userpass)==$row['userpass'])    //密码匹配 &lt;br&gt;            { &lt;br&gt;                $this-&amp;gt;userid=$row['id']; &lt;br&gt;                $this-&amp;gt;userlevel=$row['userlevel']; &lt;br&gt;                return true; &lt;br&gt;            } &lt;br&gt;            else    //密码不匹配 &lt;br&gt;            { &lt;br&gt;                $this-&amp;gt;errReport($this-&amp;gt;err_password); &lt;br&gt;                $this-&amp;gt;err=$this-&amp;gt;err_password; &lt;br&gt;                return false; &lt;br&gt;            } &lt;br&gt;        } &lt;br&gt;        else    //没有找到此用户 &lt;br&gt;        { &lt;br&gt;            $this-&amp;gt;errReport($this-&amp;gt;err_username); &lt;br&gt;            $this-&amp;gt;err=$this-&amp;gt;err_username; &lt;br&gt;            return false; &lt;br&gt;        } &lt;br&gt;    } 
&lt;p&gt;    function setSession()    //置session &lt;br&gt;    { &lt;br&gt;        $sid=uniqid('sid');    //生成sid,一个独一无二的字符串 &lt;br&gt;        session_id($sid); &lt;br&gt;        session_start(); &lt;br&gt;        $_SESSION['username']=$this-&amp;gt;username;    //给session变量赋值 &lt;br&gt;        $_SESSION['userid']=$this-&amp;gt;userid;    //.. &lt;br&gt;        $_SESSION['userlevel']=$this-&amp;gt;userlevel;    //.. &lt;br&gt;        if($this-&amp;gt;usecookie)    //如果使用cookie保存sid; &lt;br&gt;        { &lt;br&gt;            if(!setcookie('sid',$sid,time()+$this-&amp;gt;cookietime,$this-&amp;gt;cookiepath)) &lt;br&gt;                $this-&amp;gt;errReport(&amp;quot;set cookie failed&amp;quot;); &lt;br&gt;        } &lt;br&gt;        else &lt;br&gt;            setcookie('sid','',time()-3600);    //清除cookie中的sid &lt;br&gt;    } 
&lt;p&gt;    function userLogout()    //用户注销 &lt;br&gt;    { &lt;br&gt;        session_start(); &lt;br&gt;        unset($_SESSION['username']);    //清除session中的username &lt;br&gt;        if(setcookie('sid','',time()-3600)) &lt;br&gt;            //清除cookie中的sid &lt;br&gt;            return true; &lt;br&gt;        else  &lt;br&gt;            return false; &lt;br&gt;    } 
&lt;p&gt;    function errReport($str)    //报错 &lt;br&gt;    { &lt;br&gt;        if($this-&amp;gt;error_report) &lt;br&gt;            echo &amp;quot;ERROR: $str&amp;quot;; &lt;br&gt;    } &lt;br&gt;} &lt;br&gt;?&amp;gt; &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+PHP%e7%94%a8%e4%ba%8e%e7%99%bb%e5%bd%95%e7%9a%84%e7%b1%bb&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!319.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!319.entry</guid><pubDate>Thu, 25 May 2006 01:52:31 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!319/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!319.entry#comment</wfw:comment><dcterms:modified>2006-05-25T01:52:31Z</dcterms:modified></item><item><title>Mysql的优化原则</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!282.entry</link><description>&lt;h4 style="font-weight:normal"&gt;
    SQL语句优化的原则：&lt;br&gt;==================&lt;br&gt;1、使用索引来更快地遍历表。&lt;br&gt;缺省情况下建立的索引是非群集索引，但有时它并不是最佳的。在非群集索引&lt;br&gt;下，数据在物理上随机存放在数据页上。合理的索引设计要建立在&lt;br&gt;对各种查询的分析和预测上。一般来说：&lt;br&gt;a.有大量重复值、且经常有范围查询（ &amp;gt; ,&amp;lt; ，&amp;gt; =,&amp;lt; =）和order by、group by发生的列，可考&lt;br&gt;虑建立群集索引；&lt;br&gt;b.经常同时存取多列，且每列都含有重复值可考虑建立组合索引；&lt;br&gt;c.组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好，恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引，维护索引集合就要做相应的更新工作。&lt;br&gt;2、在海量查询时尽量少用格式转换。&lt;br&gt;3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语，任何一种索引都有助于SELECT的性能提高。&lt;br&gt;7、任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。&lt;br&gt;4、IN、OR子句常会使用工作表，使索引失效。如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。&lt;br&gt;&lt;br&gt;Mysql的优化原则2：&lt;br&gt;1、只要能满足你的需求，应尽可能使用更小的数据类型：例如使用MEDIUMINT代替INT&lt;br&gt;2、尽量把所有的列设置为NOT NULL，如果你要保存NULL，手动去设置它，而不是把它设为默认值。&lt;br&gt;3、尽量少用VARCHAR、TEXT、BLOB类型&lt;br&gt;4、如果你的数据只有你所知的少量的几个。最好使用ENUM类型&lt;br&gt;5、正如graymice所讲的那样，建立索引。&lt;br&gt;以下是我做的一个实验，可以发现索引能极大地提高查询的效率：&lt;br&gt;&lt;br&gt;我有一个会员信息表users，里边有37365条用户记录：&lt;br&gt;&lt;br&gt;在不加索引的时候进行查询：&lt;br&gt;sql语句A:&lt;br&gt;select * from users where username like '%许%';&lt;br&gt;在Mysql-Front中的8次查询时长为：1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960条记录&lt;br&gt;&lt;br&gt;sql语句B:&lt;br&gt;select * from users where username like '许%';&lt;br&gt;在Mysql-Front中的8次查询时长为：0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836条记录&lt;br&gt;&lt;br&gt;sql语句C:&lt;br&gt;select * from users where username like '%许';&lt;br&gt;在Mysql-Front中的8次查询时长为：0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7条记录&lt;br&gt;&lt;br&gt;为username列添加索引:&lt;br&gt;create index usernameindex on users(username(6));&lt;br&gt;&lt;br&gt;再次查询：&lt;br&gt;sql语句A:&lt;br&gt;select * from users where username like '%许%';&lt;br&gt;在Mysql-Front中的8次查询时长为：0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960条记录&lt;br&gt;&lt;br&gt;sql语句B:&lt;br&gt;select * from users where username like '许%';&lt;br&gt;在Mysql-Front中的8次查询时长为：0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836条记录&lt;br&gt;&lt;br&gt;sql语句C:&lt;br&gt;select * from users where username like '%许';&lt;br&gt;在Mysql-Front中的8次查询时长为：0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7条记录&lt;br&gt;&lt;br&gt;在实验过程中，我没有另开任何程序，以上的数据说明在单表查询中，建立索引的可以极大地提高查询速度。&lt;br&gt;另外要说的是如果建立了索引，对于like '许%'类型的查询，速度提升是最明显的。因此，我们在写sql语句的时候也尽量采用这种方式查询。&lt;br&gt;&lt;br&gt;对于多表查询我们的优化原则是：&lt;br&gt;&lt;br&gt;尽量将索引建立在：left join on/right join on ...　＋条件，的条件语句中所涉及的字段上。&lt;br&gt;&lt;br&gt;多表查询比单表查询更能体现索引的优势。&lt;br&gt;&lt;br&gt;6、索引的建立原则：&lt;br&gt;如果一列的中数据的前缀重复值很少，我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短，占用的&lt;br&gt;&lt;br&gt;磁盘空间越少，在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。&lt;br&gt;&lt;br&gt;在很多场合，我们可以给建立多列数据建立索引。&lt;br&gt;&lt;br&gt;索引应该建立在查询条件中进行比较的字段上，而不是建立在我们要找出来并且显示的字段上&lt;br&gt;&lt;br&gt;7、一往情深问到的问题:IN、OR子句常会使用工作表，使索引失效。如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。&lt;br&gt;&lt;br&gt;这句话怎么理解决，请举个例子&lt;br&gt;&lt;br&gt;例子如下:&lt;br&gt;如果在fields1和fields2上同时建立了索引，fields1为主索引&lt;br&gt;以下sql会用到索引&lt;br&gt;select * from tablename1 where fields1='value1' and fields2='value2'&lt;br&gt;以下sql不会用到索引&lt;br&gt;select * from tablename1 where fields1='value1' or fields2='value2'&lt;br&gt;&lt;br&gt;补充:&lt;br&gt;1.索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间.&lt;br&gt;有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间;&lt;br&gt;这个视实际情况而定,通常情况下索引是必需的.&lt;br&gt;2.我在对查询效率有怀疑的时候,一般是直接用Mysql的Explain来跟踪查询情况.&lt;br&gt;你用Mysql-Front是通过时长来比较,我觉得如果从查询时扫描字段的次数来比较更精确一些.&lt;br&gt;&lt;br&gt; 原作者:xuleit
	&lt;/h4&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+Mysql%e7%9a%84%e4%bc%98%e5%8c%96%e5%8e%9f%e5%88%99&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!282.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!282.entry</guid><pubDate>Thu, 30 Mar 2006 04:25:36 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!282/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!282.entry#comment</wfw:comment><dcterms:modified>2006-03-30T04:25:51Z</dcterms:modified></item><item><title>Mysql4.1 &amp; PhpMyAdmin 2.6.x的中文乱码问题的思考</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!281.entry</link><description>MySQL4.1和4.0对于我们的影响主要是字符集的问题，以前装过一次，但是发现phpAdmin就无法正常显示中文了，当时没有时间就简单的退回到了4.0。&lt;br&gt;但现在不得不使用4.1了，不能用phpAdmin的确很难受，就花点时间看了一下mysql的文档：&lt;br&gt;4.1中，对于字符集非常灵活，可以为数据库、表、字段分别制定不同的字符集，这是静态的，此外，客户端链接时也可以选择不同的字符集，因此，上述几个环节都要设置正确才行。&lt;br&gt;对
于phpMyAdmin,对于新建的数据库表，应该没有什么问题，一般可以选择用utf8作为数据库默认的字符集，在pma中可以正确的显示和录入中文。
但是，当你用php读取那些pma创建的数据时，很可能会出现乱码，为什么?这是因为有些变量没有设置正确罢了，PMA在dbi接口中，连接数据库后会通
过“set names”来设置正确的字符集，因此可以正常工作。这其中具体的细节可以参考mysql manual &amp;quot;Chapter 10.
Character Set Support&amp;quot; 这部分，很清楚。&lt;br&gt;mysql如何检测并判断使用何种字符集，要注意以下几个变量（主要是涉及链接数据库部分）：&lt;br&gt;character_set_server：这是设置服务器使用的字符集&lt;br&gt;character_set_client ：这是设置客户端发送Query串使用的字符集&lt;br&gt;character_set_connection ：这是设置服务器需要将收到的查询串转换成的字符集&lt;br&gt;character_set_results ：这是设置服务器要将结果数据转换到的字符集，转换后才发送给客户端&lt;br&gt;因此，整个流程如下：&lt;br&gt;- client(如php程序)发送一个sql串&lt;br&gt;- 服务器收到串，将sql串从character_set_client 转换到character_set_connection，然后执行转换后的查询&lt;br&gt;  - 服务器将结果数据转换到character_set_results字符集后发送回客户端&lt;br&gt;&lt;br&gt;因此，如果上述过程有不匹配的地方，自然就出现乱码(因为如果没有设置上述变量，则取默认值，一般来说默认的是latin1,这是编译mysql的默认选项)。&lt;br&gt;PMA在对mysql4.0以下会使用内置的库（主要是通过Iconv）来实现字符集的转换，从而支持多语言版本，而对于4.1以上则完全交给Mysql。&lt;br&gt;&lt;br&gt;其
实只要上述变量设置好了，不管是PMA还是普通的PHP程序都可可以正确读取，只要把上述变量设定到/etc/my.cnf
,或者my.ini(windows)
中的[mysqld]下面就可以了(注意：设置的时候需要设置default-character-set,而不是上面的几个变量名)。&lt;br&gt;如果是租用主机，无法修改，则可以通过：&lt;br&gt;set names 或 SET CHARACTER SET 来动态设置上述值，这2个SQL略有差别：&lt;br&gt;&lt;br&gt;SET NAMES 'x'  相当于：&lt;br&gt;&lt;br&gt;mysql&amp;gt; SET character_set_client = x;&lt;br&gt;mysql&amp;gt; SET character_set_results = x;&lt;br&gt;mysql&amp;gt; SET character_set_connection = x;&lt;br&gt;&lt;br&gt;而SET CHARACTER SET 则：&lt;br&gt;&lt;br&gt;mysql&amp;gt; SET character_set_client = x;&lt;br&gt;mysql&amp;gt; SET character_set_results = x;&lt;br&gt;mysql&amp;gt; SET collation_connection = @@collation_database;&lt;br&gt;&lt;br&gt;其实说了半天，问题主要还是出现在由4.0数据库迁移到4.1上的时候会有乱码，&lt;br&gt;&lt;br&gt;因为4.0一般使用latin1,那么在import的时候如果设置不对，&lt;br&gt;从pma中就看到都是乱码了。我自己是将上述值都设置为gbk后将旧数据重新导入的，&lt;br&gt;然后在pma中可以选择utf8/gbk链接校对都可以正确显示中文的。&lt;br&gt;而原有PHP程序是不需要变动的（前提是在my.cnf中设置上述变量).&lt;br&gt;&lt;br&gt;摘要:写了那么多，其实对于大多数的应用而言，迁移真的很简单，&lt;br&gt;windows:&lt;br&gt;只需要在mysql安装目录中的my.ini的[mysqld]设置:&lt;br&gt;default-character-set=gbk,然后导入你原先的4.0的数据就ok&lt;br&gt;Linux: /etc/my.cnf 中的[mysqld]设置default-character-set=gbk&lt;br&gt;如果你的网页使用的是utf-8,则，可以将gbk改为utf8,但是，由于我们原来mysqldump&lt;br&gt;出来的sql是latin1，所以导入的时候还是要用gbk,之后可以重新设置为utf8。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+Mysql4.1+%26+PhpMyAdmin+2.6.x%e7%9a%84%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e7%9a%84%e6%80%9d%e8%80%83&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!281.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!281.entry</guid><pubDate>Thu, 30 Mar 2006 03:51:16 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!281/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!281.entry#comment</wfw:comment><dcterms:modified>2006-03-30T03:51:16Z</dcterms:modified></item><item><title>PHP+ADODB+ORACLE开发应用实例</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!277.entry</link><description>最近由于工作需要，需要用到ORACLE一些东西，自己又只会PHP，最终选择了在LINUX下面利用PHP结合ADODB完成了相关应用开发，下面做简要说明。&lt;br&gt;&lt;br&gt;一、服务器环境&lt;br&gt;&lt;br&gt;简要说明：&lt;br&gt;在AS3上面安装了&lt;ul&gt;&lt;li&gt;oracle-instantclient-basic-10.1.0.4-1.i386.rpm&lt;li&gt;oracle-instantclient-devel-10.1.0.4-1.i386.rpm&lt;/ul&gt;并且重新编译了PHP&lt;br&gt;相关说明：&lt;br&gt;PHP编译参数中填加&lt;br&gt;--with-oci8-instant-client&lt;br&gt;同时写了个简单的APACHE启动脚本：&lt;br&gt;&lt;div&gt;#!/bin/sh&lt;br&gt;&lt;br&gt;APACHEHOME=/usr/local/monitor/apache2/bin&lt;br&gt;&lt;br&gt;LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.4/client/lib:${LD_LIBRARY_PATH}&lt;br&gt;NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'&lt;br&gt;export LD_LIBRARY_PATH  NLS_LANG&lt;br&gt;&lt;br&gt;echo Starting Apache&lt;br&gt;$APACHEHOME/apachectl start&lt;/div&gt;&lt;br&gt;二、PHP+ADODB开发实例&lt;br&gt;&lt;br&gt;下面是一个简单的利用ADODB查询ORACLE的例子：&lt;div&gt;&amp;lt;?&lt;br&gt;include('adodb/adodb.inc.php');&lt;br&gt;$conn = &amp;amp;ADONewConnection('oci8');&lt;br&gt;$conn-&amp;gt;debug=false;&lt;br&gt;$conn-&amp;gt;connectSID = true;&lt;br&gt;$serveraddress = '192.168.0.203:1511';&lt;br&gt;$SID = 'sid';&lt;br&gt;$conn-&amp;gt;Connect($serveraddress,'user','passwd',$SID);&lt;br&gt;$sql = &amp;quot;select * from JKONG_PRO_LIST order by RULEID&amp;quot;;&lt;br&gt;$rs = $conn-&amp;gt;Execute($sql);&lt;br&gt;if (!$rs) {&lt;br&gt;print $conn-&amp;gt;ErrorMsg();&lt;br&gt;} else {&lt;br&gt;while (!$rs-&amp;gt;EOF) {&lt;br&gt;for ($i=0, $max=$rs-&amp;gt;FieldCount(); $i &amp;lt; $max; $i++) {&lt;br&gt;print $rs-&amp;gt;fields[$i] . &amp;quot; &amp;quot;;&lt;br&gt;}&lt;br&gt;$rs-&amp;gt;MoveNext();&lt;br&gt;echo &amp;quot;&amp;lt;br&amp;gt;\n&amp;quot;;&lt;br&gt;}&lt;br&gt;}&lt;br&gt;&lt;br&gt;$rs-&amp;gt;Close();&lt;br&gt;$conn-&amp;gt;Close();&lt;br&gt;?&amp;gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+PHP%2bADODB%2bORACLE%e5%bc%80%e5%8f%91%e5%ba%94%e7%94%a8%e5%ae%9e%e4%be%8b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!277.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!277.entry</guid><pubDate>Thu, 30 Mar 2006 03:42:58 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!277/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!277.entry#comment</wfw:comment><dcterms:modified>2006-03-30T03:42:58Z</dcterms:modified></item><item><title>精典的SQL语句，推荐收藏</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!275.entry</link><description>1. 行列转换--普通&lt;br&gt;&lt;br&gt;假设有张学生成绩表(CJ)如下&lt;br&gt;Name    Subject     Result&lt;br&gt;张三    语文        80&lt;br&gt;张三    数学        90&lt;br&gt;张三    物理        85&lt;br&gt;李四    语文        85&lt;br&gt;李四    数学        92&lt;br&gt;李四    物理        82&lt;br&gt;&lt;br&gt;想变成    &lt;br&gt;姓名   语文   数学   物理&lt;br&gt;张三   80     90     85&lt;br&gt;李四   85     92     82&lt;br&gt;&lt;br&gt;declare @sql varchar(4000)&lt;br&gt;set @sql = 'select Name'&lt;br&gt;select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'&lt;br&gt;from (select distinct Subject from CJ) as a&lt;br&gt;select @sql = @sql+' from test group by name'&lt;br&gt;exec(@sql)&lt;br&gt;&lt;br&gt;2. 行列转换--合并&lt;br&gt;&lt;br&gt;有表A,&lt;br&gt;id pid&lt;br&gt;1   1&lt;br&gt;1   2&lt;br&gt;1   3&lt;br&gt;2   1&lt;br&gt;2   2&lt;br&gt;3   1&lt;br&gt;如何化成表B:&lt;br&gt;id pid&lt;br&gt; 1  1,2,3&lt;br&gt; 2  1,2&lt;br&gt; 3  1&lt;br&gt;&lt;br&gt;创建一个合并的函数&lt;br&gt;create function fmerg(@id int)&lt;br&gt;returns varchar(8000)&lt;br&gt;as&lt;br&gt;begin&lt;br&gt;declare @str varchar(8000)&lt;br&gt;set @str=''&lt;br&gt;select @str=@str+','+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1)&lt;br&gt;return(@str)&lt;br&gt;End&lt;br&gt;go&lt;br&gt;&lt;br&gt;--调用自定义函数得到结果&lt;br&gt;select distinct id,dbo.fmerg(id) from 表A&lt;br&gt;&lt;br&gt;3. 如何取得一个数据表的所有列名&lt;br&gt;&lt;br&gt;方法如下：先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。&lt;br&gt;SQL语句如下：&lt;br&gt;declare @objid int,@objname char(40)&lt;br&gt;set @objname = 'tablename'&lt;br&gt;select @objid = id from sysobjects where id = object_id(@objname)&lt;br&gt;select 'Column_name' = name from syscolumns where id = @objid order by colid&lt;br&gt;&lt;br&gt;是不是太简单了？ 呵呵 不过经常用阿.&lt;br&gt;&lt;br&gt;4. 通过SQL语句来更改用户的密码&lt;br&gt;&lt;br&gt;修改别人的,需要sysadmin  role    &lt;br&gt;EXEC  sp_password  NULL,  'newpassword',  'User'&lt;br&gt;&lt;br&gt;如果帐号为SA执行EXEC  sp_password  NULL,  'newpassword',  sa  &lt;br&gt;&lt;br&gt;5. 怎么判断出一个表的哪些字段不允许为空？&lt;br&gt;&lt;br&gt;select  COLUMN_NAME  from  INFORMATION_SCHEMA.COLUMNS  where  IS_NULLABLE='NO'  and  TABLE_NAME=tablename  &lt;br&gt;&lt;br&gt;6. 如何在数据库里找到含有相同字段的表？&lt;br&gt;a. 查已知列名的情况&lt;br&gt;SELECT  b.name  as  TableName,a.name  as  columnname  &lt;br&gt;From  syscolumns    a  INNER  JOIN    sysobjects  b    &lt;br&gt;ON  a.id=b.id    &lt;br&gt;AND  b.type='U'    &lt;br&gt;AND  a.name='你的字段名字'  &lt;br&gt;&lt;br&gt;b. 未知列名查所有在不同表出现过的列名&lt;br&gt;Select  o.name  As  tablename,s1.name  As  columnname  &lt;br&gt;From  syscolumns  s1,  sysobjects  o  &lt;br&gt;Where  s1.id  =  o.id  &lt;br&gt; And  o.type  =  'U'  &lt;br&gt; And  Exists  (  &lt;br&gt; Select  1  From  syscolumns  s2    &lt;br&gt; Where  s1.name  =  s2.name    &lt;br&gt; And  s1.id  &amp;lt;&amp;gt;  s2.id  &lt;br&gt; )&lt;br&gt;&lt;br&gt;7. 查询第xxx行数据&lt;br&gt;&lt;br&gt;假设id是主键：  &lt;br&gt;select  *  &lt;br&gt;from  (select  top  xxx  *  from  yourtable)  aa  &lt;br&gt;where  not  exists(select  1  from  (select  top  xxx-1  *  from  yourtable)  bb  where  aa.id=bb.id)&lt;br&gt; &lt;br&gt;如果使用游标也是可以的  &lt;br&gt;fetch  absolute  [number]  from  [cursor_name]  &lt;br&gt;行数为绝对行数&lt;br&gt;&lt;br&gt;8. SQL Server日期计算&lt;br&gt;a. 一个月的第一天&lt;br&gt;SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0)  &lt;br&gt;b. 本周的星期一&lt;br&gt;SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0) &lt;br&gt;c. 一年的第一天&lt;br&gt;SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)  &lt;br&gt;d. 季度的第一天&lt;br&gt;SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0)  &lt;br&gt;e. 上个月的最后一天 &lt;br&gt;SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))  &lt;br&gt;f. 去年的最后一天&lt;br&gt;SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)) &lt;br&gt;g. 本月的最后一天&lt;br&gt;SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))  &lt;br&gt;h. 本月的第一个星期一&lt;br&gt;select  DATEADD(wk,  DATEDIFF(wk,0,                                                          &lt;br&gt; dateadd(dd,6-datepart(day,getdate()),getdate())        &lt;br&gt; ),  0)      &lt;br&gt;i. 本年的最后一天&lt;br&gt;SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))。 &lt;br&gt;&lt;br&gt;感谢那些网上提供相关SQL的作者&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+%e7%b2%be%e5%85%b8%e7%9a%84SQL%e8%af%ad%e5%8f%a5%ef%bc%8c%e6%8e%a8%e8%8d%90%e6%94%b6%e8%97%8f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!275.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!275.entry</guid><pubDate>Thu, 30 Mar 2006 03:34:44 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!275/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!275.entry#comment</wfw:comment><dcterms:modified>2006-03-30T03:34:44Z</dcterms:modified></item><item><title>[PHP] phpMyAdmin 详解</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!164.entry</link><description>&lt;div&gt;
&lt;p&gt;&lt;font size=3&gt;前言 &lt;br&gt;　　phpMyAdmin可以管理整个MySQL服务器(需要超级用户)，也可以管理单个数据库。为了实现后一种，你将需要合理设置MySQL用户，他只能对允许的数据库进行读/写。那要等到你看过MySQL手册中相关的部分。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;快速安装 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;前言 &lt;br&gt;　　phpMyAdmin可以管理整个MySQL服务器(需要超级用户)，也可以管理单个数据库。为了实现后一种，你将需要合理设置MySQL用户，他只能对允许的数据库进行读/写。那要等到你看过MySQL手册中相关的部分。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;快速安装 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;将phpMyAdmin软件包解到一个目录下。 &lt;br&gt;打开config.inc.php3，根据你的环境，修改$cfgServers[1][&amp;quot;host&amp;quot;]，$cfgServers[1][&amp;quot;user&amp;quot;]和 $cfgServers[1][&amp;quot;password&amp;quot;]的值。可以看一下下面的配置部分所列出的所有可配置的变量，根据情况对其它参数进行修改。 &lt;br&gt;建议在安装完phpMyAdmin之后，对其目录进行保护(除非在一个企业内部网上)。例如，可以使用HTTP-AUTH(用一个.htaccess文件)。 &lt;br&gt;在浏览器中打开文件:安装主机域名/安装目录/index.php3。phpMyAdmin应该显示一个欢迎屏和你的数据库。 &lt;br&gt;phpMyAdmin支持多语言。如果要改成中文版本，则修改config.inc.php3中的require(&amp;quot;english.inc.php3&amp;quot;);为require(&amp;quot;chinese_gb.inc.php3&amp;quot;)。这样界面就是中文的了。好棒噢！ &lt;br&gt;保存config.inc.php3。 &lt;br&gt;安装注意 &lt;br&gt;请确认保护了phpMyAdmin目录。缺省是没有任何保护的！它不应该被随便一个人特别是搜索引擎读到。 &lt;br&gt;尽管我在每一页中都加了一个&amp;quot;nofollow&amp;quot;指令，也可能有的搜索引擎不考虑仍然继续访问页面的链接。 &lt;br&gt;想象一下AltaVista访问了一个名叫&amp;quot;Drop Dtabase&amp;quot;的链接会怎么样吧。你可以在&lt;/font&gt;&lt;a href="http://www.apacheweek.com/features/userauth"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://www.apacheweek.com/features/userauth&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size=3&gt;对Apache的认证方法有一个全面了解。另一个教程在&lt;/font&gt;&lt;a href="http://deepthought.texsci.edu/protected_dirs.html"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://deepthought.texsci.edu/protected_dirs.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size=3&gt; &lt;br&gt;PHP3应该被配置为magic_quotes=on。 &lt;br&gt;配置 &lt;br&gt;　　所有可配置数据都放在config.inc.php3中。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers 数组 &lt;br&gt;　　从1.4.2版本开始，phpMyAdmin支持对多个MySQL-server的管理。所以，增加了$cfgServers数组来存放不同服务器的登录信息。$cfgServers[1][&amp;quot;host&amp;quot;]包含了第一个服务器的主机名，$cfgServers[2][&amp;quot;host&amp;quot;]为第二个服务器的主机等，等等。如果你只有一个服务器要管理，可以简单地不去理会其它$cfgServers入口的主机名。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;port&amp;quot;] 字符串 &lt;br&gt;　　第n个MySQL服务器的端口号。缺省值为3300(保留空值)。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;host&amp;quot;] 字符串 &lt;br&gt;　　第n个MySQL服务器的主机名。例如，localhost。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;adv_auth&amp;quot;] 布尔值 &lt;br&gt;　　对这个服务器应该使用基本或是高级认证方式。基本认证方式($adv_auth = false)是普通的老的作法： &lt;br&gt;用户名和口令被存在config.inc.php3中。高级认证方式($adv_auth = true)从1.3.0版开始引入，允许你通过HTTP-Auth来作为合法的MySQL的用户进行登录。在config.inc中你只需要提供一个标准用户，他能够连接到MySQL上并且可以读出mysql库的user/db表(看$cfgServers[n][&amp;quot;stduser&amp;quot;])。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;推荐使用高级方式管理的场合： &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;当phpMyAdmin运行在多用户环境下，人们拥有shell处理权限时，你不想知道MySQL的用户名/口令。 &lt;br&gt;当你想让用户存取他们自已的数据库，并且不想他们干扰其他人。 &lt;br&gt;　　高级认证方式是安全的，因为标准用户只需要对mysql库的只读权限。MySQL口令不能被容易的破解，所以对于一个普通用户没有机会看到其它用户的明文口令。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;user&amp;quot;] 字符串 &lt;br&gt;$cfgServers[n][&amp;quot;password&amp;quot;] 字符串 &lt;br&gt;　　当使用基本认证方式时，phpMyAdmin将使用用户名/口令对同这个MySQL服务器连接。当使用高级认证方式时则不需要。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;stduser&amp;quot;] 字符串 &lt;br&gt;$cfgServers[n][&amp;quot;stdpass&amp;quot;] 字符串 &lt;br&gt;　　当使用高级认证方式时，用户名/口令对被用于校验真正的用户名/口令对。这个用户必须能够连接MySQL，而且可以读取mysql库的user表。当使用基本认证方式时则不需要。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;only_db&amp;quot;] 字符串 &lt;br&gt;　　如果设置了一个数据库名，只有这个数据库将显示给用户。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgServers[n][&amp;quot;verbose&amp;quot;] 字符串 &lt;br&gt;　　只有在多服务器入口时使用phpMyAdmin才有用。如果设置了，这个字符串将被显示出来，用来代替在主页面中的下接菜单中的主机名。例如，如果你想在系统只显示某些数据库，这个可能就有用了。 &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;$cfgManualBase 字符串 &lt;br&gt;　　如果设为一个URL(它指向MySQL文档)，就会创建相应的帮助链接。 &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;$cfgPersistentConnections 布尔值 &lt;br&gt;　　是否使用持续连接(mysql_connect或mysql_pconnect)。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgConfirm 布尔值 &lt;br&gt;　　当你将要丢失数据时是否应该显示一个警告信息(&amp;quot;你真的确定要...&amp;quot;)。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgMaxRows 整数 &lt;br&gt;　　当浏览一个结果集时显示的记录数。如果结果集包含了更多的数据，将显示前页/后页的链接。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgMaxInputsize 整数 &lt;br&gt;　　当向一个表增加一条新的记录时，编辑字段的大小。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgBorder 整数 &lt;br&gt;　　表格边界的大小。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgThBgcolor 字符串 [HTML 颜色] &lt;br&gt;　　用在表头的颜色。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgBgcolorOne 字符串 [HTML 颜色] &lt;br&gt;　　表格行第一行的颜色。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgBgcolorTwo 字符串 [HTML 颜色] &lt;br&gt;　　表格行第二行的颜色。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgOrder 字符串 [&amp;quot;DESC&amp;quot;|&amp;quot;ASC&amp;quot;] &lt;br&gt;　　定义了当你点击字段名时，字段是以升序(&amp;quot;ASC&amp;quot;)显示还是以降序(&amp;quot;DESC&amp;quot;)显示。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgShowBlob 布尔值 &lt;br&gt;　　定义了当浏览一个表的内容时，是否显示BLOB字段。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgShowSQL 布尔值 &lt;br&gt;　　定义了是否显示phpMyAdmin所生成的sql查询语句。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgColumnTypes 数组 &lt;br&gt;　　MySQL列的所有可能的类型。大多数情况下你不需要编辑它。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgFunctions 数组 &lt;br&gt;　　MySQL支持函数的列表。大多数情况下你不需要编辑它。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$cfgAttributeTypes 数组 &lt;br&gt;　　字段可能的属性。大多数情况下你不需要编辑它。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;FAQ - 常见问题 &lt;br&gt;我不能向表中插入新记录 -- MySQL返回一个SQL错误。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　仔细检查SQL错误。我发现很多的程序员使用了错误的字段类型。普通的错误包括： &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;使用VARCHAR没有指定大小 &lt;br&gt;使用TEXT或BLOB指定了大小 &lt;br&gt;　　另外，查看一下MySQL手册中的语法章节以确认你的语法是正确的。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;phpMyAdmin不能连接MySQL。出了什么错？ &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　 或者是PHP安装的问题或者是你的用户名/口令错了。试着编一个小的用了mysql_connect的脚本，看一下是否它能工作。如果不能，那就可能是还没有在PHP中将MySQL的编译进去。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;我不能编辑表的内容，尽管README中说这是phpMyAdmin的一个特色。 &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;　　phpMyAdmin只允许编辑拥有主键或唯一键值的表的内容。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;当使用高级认证管理时，phpMyAdmin总是给出&amp;quot;处理禁止(Access denied)&amp;quot;。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;发生可能有几种原因： &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$stduser/$stdpassword不正确。试着关掉$adv_auth，然后使用这个用户名及口令来连接MySQL。 &lt;br&gt;在登录对话框中指定的用户名/口令是错的。试着用上面同样的方法看一下是否可以工作。 &lt;br&gt;你已经给phpMyAdmin安装目录建立了安全机制，例如，.htaccess文件。这个可能干扰phpMyAdmin的认证管理，那么把它删除。 &lt;br&gt;我想对phpMyAdmin的开发提供帮助。我应该如何进行？ &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;下面的方法对于新的开发者来说是首选的： &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;取出在匿名CVS上的当前的CVS： &lt;br&gt;cvs -d :pserver:anon@www.htmlwizard.net:/usr/local/cvsroot login &lt;br&gt;[Password: phpMyAdmin] &lt;br&gt;cvs -d :pserver:anon@www.htmlwizard.net:/usr/local/cvsroot checkout phpMyAdmin &lt;br&gt;[这样将创建一个名为phpMyAdmin的新的子目录] &lt;br&gt;加入你的东西 &lt;br&gt;将修改的文件发给我(tar格式或gzip格式) 对CVS树的写权限只授权给有经验的已经对phpMyAdmin作出 &lt;br&gt;了贡献的开发者。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;另外看一下DEVELOPERS文件。 &lt;br&gt;有什么好的方法可以让phpMyAdmin更安全对付恶意的攻击？ &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　这要看你的系统了。如果你正在运行一个无法被其它人使用的服务器，使用web服务器的目录保护绑定就已经足够了(例如，对于Apache你可以使用. htaccess文件)。如果其它的人可以通过telnet存取你的服务器，将MySQL口令以明文形式保存在你的config.inc.php3 文件中就不是一个好方法了。在这种情况下你应该使用phpMyAdmin的高级认证方式功能。&lt;br&gt;如何才能向我的表中插入一个null值呢？ &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　输入&amp;quot;null&amp;quot;(没有引号)作为字段的的值。这个对于时间戳或自动增加字段特别有用。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;我是一个ISP供应商。我可以安装一个主控的phpMyAdmin拷贝吗？或需要为每一个客户都安装一个？ &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　 从2.0.3版本开始，你可以安装一个主控的phpMyAdmin拷贝为你的所有的用户。这个特性的开发是由NetCologne GmbH倡议的。这样就要求合理地设置MySQL用户，并且设置phpMyAdmin的高级认证方式。当认证一个用户时，phpMyAdmin执行这些步骤： &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;从mysql.user表中选出所有用户名/口令与申请用户相匹配的记录。如果没有记录被返回，认证失败。 &lt;br&gt;否则，phpMyAdmin继续第2步。 &lt;br&gt;如果用户的global Select_Priv是&amp;quot;N&amp;quot;(也就是用户不允许存取所有的数据库)，phpMyAdmin搜索mysql.db表，查找对于这个用户的 Select_Priv=&amp;quot;Y&amp;quot;的记录。如果没有记录被找到，认证失败。否则，phpMyAdmin显示所有允许用户查看的数据库。 &lt;br&gt;如果用户的global Select_Priv是&amp;quot;Y&amp;quot;，系统中所有的数据库都显示出来。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　这就意味着你需要向mysql库中如下增加用户： &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;INSERT INTO user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES (&amp;quot;localhost&amp;quot;, &amp;quot;foo&amp;quot;, PASSWORD(&amp;quot;bar&amp;quot;), &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;, &amp;quot;N&amp;quot;) &lt;br&gt;INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES (&amp;quot;localhost&amp;quot;, &amp;quot;foo_db&amp;quot;, &amp;quot;foo&amp;quot;, &amp;quot;Y&amp;quot;, &amp;quot;Y&amp;quot;, &amp;quot;Y&amp;quot;, &amp;quot;Y&amp;quot;, &amp;quot;Y&amp;quot;, &amp;quot;Y&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;) &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;　　那样，对于用户foo，只有&amp;quot;foo_db&amp;quot;库将被显示出来。&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+%5bPHP%5d+phpMyAdmin+%e8%af%a6%e8%a7%a3&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!164.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!164.entry</guid><pubDate>Thu, 08 Dec 2005 09:12:47 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!164/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!164.entry#comment</wfw:comment><dcterms:modified>2005-12-08T09:12:47Z</dcterms:modified></item><item><title>[DB] PHP中 ADODB 类库介绍(2)</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!130.entry</link><description>&lt;div&gt;&lt;font size=3&gt;&lt;strong&gt;对查询进行缓存&lt;br&gt;&lt;br&gt;&lt;/strong&gt;上个月，我们简单地了解了ADOdb中,如何进行SELECT、INSERT和UPDATE的操作。如果你在ADOdb上是个新手，我建议先读一下&lt;/font&gt;&lt;a href="http://phpe.net/articles/362.shtml"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;上个月的那篇文章&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size=3&gt;。 ADOdb 还有很多更高级的特征，这个月，我们就一起来关注其中的部分内容。&lt;br&gt;&lt;br&gt;数据库时常会成为应用程序效率低下的祸首。尽量减少对数据库的查询，是提高执行效率的方法之一。这，通常可以通过对整页内容进行缓存（有很多种方法来实现。比如，PEAR-&amp;gt;Cache）,或者，如果你需要做一张动态页面，并且只想让查询指令被缓存，那么，你可以使用ADOdb,简单地将查询指令缓存起来。在你视图通过缓存来提高你的应用程序的糟糕性能之前，我建议你先试图去优化你的查询指令。有时候，一些简单的索引可以改变一切——有太多的所谓的专业的解决方案，都在使用糟糕的索引。在本文中，你能找到很多这样的实例。现在，让我们来看看ADOdb是如何使你能够对数据库的查询结果进行缓存的。在这个实例中,ADOdb把我们的最后的一次查询的结果保存在/var/tmp/adodb_cache这个缓存文件中，并保留10分钟。 &lt;br&gt;&lt;br&gt;&lt;/font&gt;
&lt;table cellspacing=1 cellpadding=3 width="95%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font size=3&gt;include(&amp;quot;$adodb_path/db_values.inc.php&amp;quot;);&lt;br&gt;include(&amp;quot;$adodb_path/adodb.inc.php&amp;quot;);&lt;br&gt;$db = NewADOConnection('$database_type');&lt;br&gt;$db-&amp;gt;Connect(&amp;quot;$host&amp;quot;, &amp;quot;$user&amp;quot;, &amp;quot;$password&amp;quot;, &amp;quot;employees&amp;quot;);&lt;br&gt;&lt;br&gt;$ADODB_CACHE_DIR = &amp;quot;/var/tmp/adodb_cache&amp;quot;; //Directory to store cached files&lt;br&gt;&lt;br&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;CacheExecute(600,$sql);  // Executes, and caches the results for 600 seconds&lt;br&gt;if (!$rs) {&lt;br&gt; print $db-&amp;gt;ErrorMsg(); // Displays the error message if no results could be returned&lt;br&gt;}&lt;br&gt;else {&lt;br&gt; while (!$rs-&amp;gt;EOF) {&lt;br&gt;   print $rs-&amp;gt;fields[0].' '.$rs-&amp;gt;fields[1].'&amp;lt;BR&amp;gt;'; &lt;br&gt;    // fields[0] is surname, fields[1] is age&lt;br&gt;   $rs-&amp;gt;MoveNext();  //  Moves to the next row&lt;br&gt; }  // end while&lt;br&gt;} // end else&lt;/font&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;&lt;br&gt;&lt;br&gt;&lt;font size=3&gt;CacheExecute() 函数有两个参数: 第一个参数是缓存文件将被保留的时间,以秒计时；第二个参数是 SQL 声明。 第一个参数是可选择的 (一些开发者或许会认为它应当成为第二个参数) ，如果你没有限定时间，那么，默认值是 3600 秒,也就是1个小时。缓存文件被命名为 adodb_*.cache，你可以在文件系统中安全地将他们删除。你应该定期清楚过期的缓存文件（用UNIX的“crontab万年历”，或者WINDOWS的“计划任务”。译者注：万年历不知有没有译错，我没有UNIX。）。要注意的是，要使用缓存方法，你需要将PHP的参数magic_quotes_runtime设为off(译者注：在php.ini中，将值设为0)。你可以根据需要，在运行时修改它的值：&lt;br&gt;set_magic_quotes_runtime(0)；&lt;br&gt;只需将上述代码放到你调用数据库的指令之前就可以了。你可以在任何时候，通过调用CacheFlush()；来清除缓存。处于对安全的考虑，ADOdb 也建议将PHP的参数register_globals 设为0(在PHP最新版中，这是默认值) 。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;更多关于查询结果的信息&lt;/strong&gt;&lt;br&gt;&lt;br&gt;开发者通常会对他们的要得到的结果产生一些质疑,最通常的问题是：有多少个记录？ADOdb能够很容易地通过RecordCount()来回答这个问题。 RowCount()是同义函数。&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;
&lt;table cellspacing=1 cellpadding=3 width="95%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font size=3&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;CacheExecute(600,$sql);  // Executes, and caches the results for 600 seconds&lt;br&gt;print $rs-&amp;gt;RecordCount() . &amp;quot; rows returned]&amp;quot;; // Display number of rows returned&lt;/font&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;&lt;br&gt;&lt;br&gt;&lt;font size=3&gt;或许第二个问题会产生在需量列表上：被返回字段数量是多少？不用担心，ADOdb有FieldCount()。&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;
&lt;table cellspacing=1 cellpadding=3 width="95%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font size=3&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;CacheExecute(600,$sql);  // Executes, and caches the results for 600 seconds&lt;br&gt;print $rs-&amp;gt;FieldCount() . &amp;quot; columns returned]&amp;quot;; // Display number of rows returned&lt;/font&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;font size=3&gt;&lt;strong&gt;限制结果&lt;/strong&gt;&lt;br&gt;&lt;br&gt;上次我们讨论了如何通过使用一个数据库库函数使你的应用程序更简洁，更易于移植。在从MySQL转移到 Informix中 , 我经历了一次痛苦的移植过程。一切都归咎于非ANSII标准的LIMIT子句( 举例来说， 在MySQL中允许下列指令：SELECT name FROM employee LIMIT 15),它是一个非常有用的功能，可在Informix中却不被支持。（在Informix中，相同功能的书写应该是：SELECT FIRST 15 name FROM employee in Informix。）它似乎对你敲响了警钟，要你停止在你的查询中使用非标准SQL的指令，而去认真地学习标准的SQL。幸运的是，ADOdb有一个处理LIMIT的方法：SelectLimit()。&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;
&lt;table cellspacing=1 cellpadding=3 width="95%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font size=3&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;SelectLimit($sql, 10, 100); // Select 10 rows, starting at row 100&lt;br&gt;if (!$rs) {&lt;br&gt; print $db-&amp;gt;ErrorMsg(); // Displays the error message if no results could be returned&lt;br&gt;}&lt;br&gt;else {&lt;br&gt; while (!$rs-&amp;gt;EOF) {&lt;br&gt;   print $rs-&amp;gt;fields[0].' '.$rs-&amp;gt;fields[1].'&amp;lt;BR&amp;gt;'; &lt;br&gt;    // fields[0] is surname, fields[1] is age&lt;br&gt;   $rs-&amp;gt;MoveNext();  //  Moves to the next row&lt;br&gt; }  // end while&lt;br&gt;} // end else&lt;/font&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;&lt;br&gt;&lt;br&gt;&lt;font size=3&gt;SelectLimit()将SQL声明作为第一参数,第二个是返回的列的数量，最后一个参数是偏移量(返回的第一行)。注意这跟MySQL的指令中LIMIT子句的参数顺序相反。SelectLimit()对于将搜索结果部分地显示在页面上，是十分有用的，通过Previous和Next按钮，可以浏览所有的结果。&lt;br&gt;&lt;br&gt;不止一次地，我看到的代码将来自数据库的所有查询结果，都用PHP作过滤处理——杀鸡用牛刀! 你完全可以使用 CacheSelectLimit()函数来贮藏这种类型的结果。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;处理事务&lt;/strong&gt;&lt;br&gt;&lt;br&gt;处理事务是许多应用程序的一个重要的特征。(对于初学者来说，处理事务是你可以提交一打查询操作的过程，而这些查询是都成功了，还是有部分失败了，都需要考虑进去。 &lt;br&gt;经典范例是银行处理。钱从你的帐户转出，然后转入到其他某个人的帐户中。只要其中任意一项失败，那么，这整个过程都必须被认定为失败。不然，钱被划出，而没有进对方的帐户；或者，钱没有划出，对方帐户无端多了一笔小费。)&lt;br&gt;&lt;br&gt;处理事务可以在代码级上进行机警地管理控制。 常数错误检查被用来判断是否要COMMIT（事务的所有各项都正确，执行正确，结束事务）还是ROLLBACK（事务中有错误，所有改动需要恢复原来状况）。ADOdb 有一些能使处理操作正确进行的有用的函数。下例在某个职员的结余加10，并在另一个上减10,整个过程有两个查询，作为一个完整的事务。 &lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;
&lt;table cellspacing=1 cellpadding=3 width="95%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font size=3&gt;$sql1 = &amp;quot;UPDATE employees SET balance=balance-10 WHERE id=15&amp;quot;;&lt;br&gt;$sql2 = &amp;quot;UPDATE employees SET balance=balance+10 WHERE id=22&amp;quot;;&lt;br&gt;$db-&amp;gt;StartTrans();&lt;br&gt;$db-&amp;gt;Execute($sql);&lt;br&gt;$db-&amp;gt;Execute($sql2);&lt;br&gt;$db-&amp;gt;CompleteTrans();&lt;/font&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;font size=3&gt;当你浏览老的代码时，可能会看到一个比较老的方法来实现这一切。使用 BeginTrans()、CommitTrans()和RollbackTrans（）函数时，需要你自己来处理错误。StartTrans（）和 CompleteTrans（）将会自动地处理错误,并适当地进行COMMIT或ROLLBACK。当需要的时候，你可以通过FailTrans()来强制执行ROLLBACK。&lt;br&gt;&lt;br&gt;当然你可能需要知道处理是失败了还是成功了。ADOdb 提供了 HasFailedTrans() 来实现这个功能。 如果出错（或者，你可以将这种情况称作FailTrans()），返回TRUE；如果成功，返回FALSE。&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;
&lt;table cellspacing=1 cellpadding=3 width="95%" align=center border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font size=3&gt;$sql1 = &amp;quot;UPDATE employees SET balance=balance-10 WHERE id=15&amp;quot;;&lt;br&gt;$sql2 = &amp;quot;UPDATE employees SET balance=balance+10 WHERE id=22&amp;quot;;&lt;br&gt;$db-&amp;gt;StartTrans();&lt;br&gt;$db-&amp;gt;Execute($sql);&lt;br&gt;$db-&amp;gt;Execute($sql2);&lt;br&gt;$db-&amp;gt;CompleteTrans();&lt;br&gt;if ($db-&amp;gt;HasFailedTrans()) {&lt;br&gt;// Something went wrong&lt;br&gt;}&lt;/font&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;值得注意的是，你的数据库需要支持这些事务函数。 (大多数的数据库是支持的，不过，MySQL InnoDB表支持,可 MySQL MyISAM 表不支持。)&lt;br&gt;&lt;br&gt;我希望我所做的一切能让你对数据库库函数能有极大的兴趣。还有大量有趣的函数可以用来从数据库表中自动生成HTML，并且同一结果有不同的方法来实现。你可以&lt;/font&gt;&lt;a href="http://phpe.net/club/index.php?act=ST&amp;amp;f=6&amp;amp;t=1432"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;在此&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size=3&gt;找到完整的手册。&lt;br&gt;祝你好运！&lt;br&gt;2003.07.31 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;原文地址：&lt;/font&gt;&lt;a href="http://www.databasejournal.com/features/php/article.php/2234861"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://www.databasejournal.com/features/php/article.php/2234861&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+%5bDB%5d+PHP%e4%b8%ad+ADODB+%e7%b1%bb%e5%ba%93%e4%bb%8b%e7%bb%8d(2)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!130.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!130.entry</guid><pubDate>Wed, 23 Nov 2005 06:12:27 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!130/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!130.entry#comment</wfw:comment><dcterms:modified>2005-12-07T04:33:12Z</dcterms:modified></item><item><title>[DB] PHP中 ADODB 类库介绍(1)</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!129.entry</link><description>&lt;div&gt;&lt;font size=3&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;前言&lt;br&gt;&lt;/font&gt;为什么要使用数据库类库?&lt;/strong&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;初学者 (甚至一些非初学者)常常犯的错误，就是在开发应用程序的时候，缺乏对未来的考虑。假如有一天，你的程序需要使用其它的数据库，难道你还需要重新写一篇针对于这个版本数据库的程序吗？这不是不可能发生的，尤其是当目前的数据库可能不适合你当前的需要的时候。 但是当你做这一切的时候 ,你会发现绝非你想像的那样容易：每一个 DBMS 有不同的函数。举例来说：在 Mysql 中连接数据库的函数为 mysql_connect(),而在MSSQL却是 mssql_connect()。重新查看你所有的代码，然后修改所有操作数据库的函数和查询语法，这绝不是一项简单的工作。程序会经常的被捆绑到了错误的数据库上，以至无法在运行时达到最优性能。数据库类库就是这样产生的。它允许你通过同样的代码来操作不同的数据库。一个设计良好的数据库类库可以完美的改变这一切。它允许你通过极小的修改，就能转接到其他数据库：无论你要连接什么数据库管理系统，只要使用同一个的函数，和不同的参数。举例来说, 在 ADOdb 中,只需简单地将 $db = NewADOConnection('access ') 修改为$db = NewADOConnection('mysql'),这样，你就轻松的把你的程序从 Access 数据库转移到了 Mysql 数据库中。现在网络上已经有了很多这样的数据库类库，比如Pear，PHPlib，我也已经在工作中使用它们了，也许你也曾经用过。但本文仅将重点放在我所特别关注的 ADOdb。本文我只简要地作一个介绍，使你能够马上运用它来开发你的下一个项目。以后的文章中我们将会循序渐进的对它进入更深入的了解。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;目前，ADOdb 支持的数据库包括 MySQL, PostgreSQL，Interbase，Firebird，Informix，Oracle，MS SQL 7，Foxpro，Access，ADO，Sybase，FrontBase，DB2 和 generic ODBC。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;ADOdb 的安装&lt;/strong&gt;&lt;br&gt;安装 ADOdb 是一件极期容易的事，相信聪明的你一定不会感到吃力。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;首先, 确定你正在运行的 PHP 是 4.0.4 版或更新版。 如果不是，我强列建议你升级! &lt;br&gt;从 PHP Everywhere 站点下载 .zip 或 .tgz 文件，解压缩到你所选的路径下。&lt;br&gt;这个路径不应在网页目录（WWWTREE,译者注：如果你的网页是在/www/下，那么，这个目录就不应为/www/here）下！虽然ADOdb的包含文件已经使用了 .inc.php 的扩展名 ，使得服务器即使是在最糟糕的配置下，也不会将这些.inc文件通过明文方式在浏览器中显示出来，但是我们向来不提倡将库函数文件放在网页目录下的行为。然后把下载下来的文件运行：tar -zxvf adodb350.tgz 解压，在Windows下你可以使用一个你喜欢的解压软件来操作，这样，你会得到一个 adodb 的目录其下包括了许多子目录。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;测试你的安装&lt;/strong&gt;&lt;br&gt;好了，让我们来测试一下你的安装吧。 通过在脚本中添加下列三行代码来测试你的安装是否成功。注意要把代码中的参数修改成你自己的。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;include(&amp;quot;$adodb_path/adodb.inc.php&amp;quot;); // includes the adodb library&lt;br&gt;$db = NewADOConnection('$database_type'); // A new connection&lt;br&gt;$db-&amp;gt;Connect(&amp;quot;$host&amp;quot;, &amp;quot;$user&amp;quot;, &amp;quot;$password&amp;quot;, &amp;quot;$database_name&amp;quot;);&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;现在你已经拥有一个数据库连接对象 $db 了。 你也可以使用 ADONewConnection 来替换 NewADOConnection —— 这两个是同一函数的不同的名字。 连接的数据库变量 $database_type 需要针对你的实际情况改成你所需要的。可以使用以下列表中的一个(括号内的为描述部分，不要在代码中使用)：&lt;/font&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font size=3&gt;access (Microsoft Access/Jet) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;ado (Generic ADO, the base for all the other ADO drivers) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;ado_access (Microsoft Access/Jet using ADO) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;ado_mssql (Microsoft SQL Server using ADO) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;db2 (DB2) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;vfp (Microsoft Visual FoxPro) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;fbsql (FrontBase) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;ibase (Interbase 6 or before) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;firebird (Firebird) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;informix72 (Informix databases before Informix 7.3) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;informix (Informix) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;maxsql (MySQL with transaction support) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;mssql (Microsoft SQL Server 7) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;mssqlpo (Portable mssql driver) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;mysql (MySQL without transaction support) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;mysqlt (MySQL with transaction support, identical to maxmysql) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;oci8 (Oracle 8/9) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;oci805 (Oracle 8.0.5) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;oci8po (Oracle 8/9 portable driver) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;odbc (Generic ODBC, the base for all the other ODBC drivers) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;odbc_mssql (MSSQL via ODBC) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;odbc_oracle (Oracle via ODBC) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;oracle (Oracle 7) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;postgres (PostgreSQL) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;postgres64 (PostgreSQL 6.4) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;postgres7 (PostgreSQL 7, currently identical to postgres ) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;sqlanywhere (Sybase SQL Anywhere) &lt;/font&gt;
&lt;li&gt;&lt;font size=3&gt;sybase (Sybase) &lt;/font&gt;&lt;/ul&gt;
&lt;p&gt;&lt;font size=3&gt;如果你的链接代码出现了错误的提示，那么你首先要检查的地方就是在路径或连接的变量上。在你责备 ADOdb 之前，请确定你是已经正确的使用那些变量。(很多朋友常花太多时间去修正这些显而易见的错误。) 如果连接没有任何错误提示，那么我们现在已经可以在我们的项目中来使用 ADodb 了。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;通过你的脚本连接到数据库&lt;/strong&gt;&lt;br&gt;把上边的代码加入到你的代码前，让我们先退一步。我们最好能把上边的代码用我们自己的方法来封装起来。这样可以使你的程序变得更灵活、更具移植性。如果你直接把上面的代码插入到你的项目的每个文件中，如果将来项目的路径改变了，将会很容易产生错误，如果你的密码改变了，你可能需要对你所有的脚本进行修改，这样将会影响我们使用库函数的初衷。并且，因为你的密码信息是在WEBTREE下的，这将产生隐患。我推荐将密码信息放在一个独立的包含文件中，比如在 ADOdb 安装目录下的某个地方。如果你要在其他服务器上运行你的程序时，你就不能保证目录结构会是相同的，所以，你要确保这个路径是正确的。我建议使用PHP 的自动包含功能来自动地包含这个文件。&lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;include(&amp;quot;$adodb_path/db_values.inc.php&amp;quot;);&lt;br&gt;include(&amp;quot;$adodb_path/adodb.inc.php&amp;quot;);&lt;br&gt;$db = NewADOConnection('$database_type');&lt;br&gt;$db-&amp;gt;Connect(&amp;quot;$host&amp;quot;, &amp;quot;$user&amp;quot;, &amp;quot;$password&amp;quot;, &amp;quot;employees&amp;quot;); &lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;如果你也想要使用持久连接, 不是每次创造一个新的连接(这使许多WEB应用程序得到了加速，但是要注意有些数据库是不支持的)。可以使用 PConnect 替换掉 Connect。&lt;br&gt;文件 db_values.inc.php 是我们的数据库信息文件，内容为(你需要把下面代码中的变量改成你自己的): &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&amp;lt;?php&lt;br&gt;$database_type=&amp;quot;mysql&amp;quot;;&lt;br&gt;$host = &amp;quot;localhost&amp;quot;; // 本地数据库&lt;br&gt;$user = &amp;quot;ian&amp;quot;&lt;br&gt;$password = &amp;quot;let_me_in&amp;quot;&lt;br&gt;?&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;你可以在 php.ini 配置中设定自动包含我们的配置文件，具体操作可以修改 PHP.ini 的下述行：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;; Automatically add files before or after any PHP document.&lt;br&gt;auto_prepend_file = /usr/local/build/apache/www/tool_lib/defaults.inc&lt;br&gt;auto_append_file =&lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;文件 defaults.inc 包含了 $adbdb_path 的值：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&amp;lt;?&lt;br&gt;$adodb_path = &amp;quot;/usr/local/build/apache/www/tool_lib/&amp;quot;;&lt;br&gt;?&amp;gt;&lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;还有其他方式来实现它，但是我发现这种方法在移植时，可以相对地减少复杂度。&lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;从一个数据库中进行选择(SELECT)操作&lt;br&gt;当同时使用开发良好的库函数，和PHP自身提供的函数时，可以有多种方法来访问数据库。用什么方法，完全取决于你自己的喜好。&lt;br&gt;这里是一个简单的例子: &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;Execute($sql);&lt;br&gt;if (!$rs) {&lt;br&gt;print $db-&amp;gt;ErrorMsg(); // Displays the error message if no results could be returned&lt;br&gt;}&lt;br&gt;else {&lt;br&gt;while (!$rs-&amp;gt;EOF) {&lt;br&gt;  print $rs-&amp;gt;fields[0].' '.$rs-&amp;gt;fields[1].'&amp;lt;BR&amp;gt;'; &lt;br&gt;   // fields[0] is surname, fields[1] is age&lt;br&gt;  $rs-&amp;gt;MoveNext();  //  Moves to the next row&lt;br&gt;}&lt;br&gt;}&lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;在上例中,$rs-&amp;gt;fields 是一个包含返回值的数组。数组索引被赋予了初始的数字，你也可以按下面的方法来指定其索引: &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$db-&amp;gt;SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;Execute($sql);&lt;br&gt;if (!$rs) {&lt;br&gt;print $db-&amp;gt;ErrorMsg(); // Displays the error message if no results could be returned&lt;br&gt;}&lt;br&gt;else {&lt;br&gt;while (!$rs-&amp;gt;EOF) {&lt;br&gt;  print $rs-&amp;gt;fields['surname'].&amp;quot; &amp;quot;.$rs-&amp;gt;fields['age'].&amp;quot;&amp;lt;BR&amp;gt;&amp;quot;;&lt;br&gt;  $rs-&amp;gt;MoveNext();  //  Moves to the next row&lt;br&gt;}  // end while&lt;br&gt;} // end else &lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;对结果浏览的另一个可选的方法是将每条记录作为一个对象返回。 ADOdb 有一个 FetchNextObject() 的函数来实现这一功能,指针会自动地移到下一条记录。 &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$sql = &amp;quot;SELECT surname, age FROM employees&amp;quot;;&lt;br&gt;$db-&amp;gt;SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array&lt;br&gt;$rs = &amp;amp;$db-&amp;gt;Execute($sql);&lt;br&gt;if (!$rs) {&lt;br&gt;print $db-&amp;gt;ErrorMsg(); // Displays the error message if no results could be returned&lt;br&gt;}&lt;br&gt;// loop through results&lt;br&gt;while ($row = $rs-&amp;gt;FetchNextObject()) {&lt;br&gt;// The field names need to be uppercase&lt;br&gt;print $row-&amp;gt;SURNAME.&amp;quot; &amp;quot;.$row-&amp;gt;AGE.&amp;quot;&amp;lt;BR&amp;gt;&amp;quot;;&lt;br&gt;} &lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;&lt;strong&gt;插入、更新记录&lt;/strong&gt;&lt;br&gt;基本的 INSERT 操作方便、快捷, 拥有与SELECT一样的语法。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$sql = &amp;quot;INSERT INTO employees (surname, age) values ('Clegg','43')&amp;quot;;&lt;br&gt;if (!($db-&amp;gt;Execute($sql))) {&lt;br&gt; print 'Error inserting: '.$db-&amp;gt;ErrorMsg().'&amp;lt;BR&amp;gt;';&lt;br&gt;} &lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=3&gt;库函数真正的优点，在于它允许你通过相同的语法将记录放入不同的数据库之内，这在以前是绝对不可能的。通常有两种发生的情形。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;第一种,引号。所有的引号需要用脱字符(即`符号,键位在Tab键的上边)代替，否则会引起语法错误。但是一些数据库使用一个单引号,另外一些则使用两个单引号。所以，你应当使用 ADOdb 中的 qstr() 而不是 PHP 中的 addslashes()。这样，返回值就将与你所使用的数据库相吻合了。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;第二种,日期。许多数据库接受跟他们的日期类型不一致的、不兼容的格式。 ADOdb 有一个 DBDate() 函数,可以将 Unix 的 timestamp, 或 ISO(Y-m-d) 格式转换成任意格式，以此来满足你的数据库的需求。 见下例：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$employee_surname = $db-&amp;gt;qstr(&amp;quot;d'Angelo&amp;quot;);&lt;br&gt;$arrival_time = $db-&amp;gt;DBDate(time());&lt;br&gt;// The above two functions also add the enclosing quotes, so, $arrival_time, not '$arrival_time'&lt;br&gt;$sql = &amp;quot;INSERT INTO employee_arrival (arrival_time,surname) values ($arrival_time,$employee_surname)&amp;quot;;&lt;br&gt;if (!($db-&amp;gt;Execute($sql))) {&lt;br&gt; print 'Error inserting: '.$db-&amp;gt;ErrorMsg().'&amp;lt;BR&amp;gt;';&lt;br&gt;} &lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;你可以以完全相同的方式更新数据库,举例来说：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$sql = &amp;quot;UPDATE employees SET age='44' WHERE id='121')&amp;quot;;&lt;br&gt;if (!($db-&amp;gt;Execute($sql))) {&lt;br&gt; print 'Error updating: '.$db-&amp;gt;ErrorMsg().'&amp;lt;BR&amp;gt;';&lt;br&gt;} &lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;以上仅仅是 Adodb 的一些基本操作 —— 下次我们将会关注一些 ADOdb 提供的比较深层次的东西。 如果我已经使你胃口大开，而且你已经不能再等待， 我建议你去PHP Everywhere看一下,这个站点是ADOdb的专业站点，里面有很多有用的帮助信息。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;本文原文地址: &lt;/font&gt;&lt;a href="http://www.databasejournal.com/features/php/article.php/2222651"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://www.databasejournal.com/features/php/article.php/2222651&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+%5bDB%5d+PHP%e4%b8%ad+ADODB+%e7%b1%bb%e5%ba%93%e4%bb%8b%e7%bb%8d(1)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!129.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!129.entry</guid><pubDate>Wed, 23 Nov 2005 06:10:31 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!129/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!129.entry#comment</wfw:comment><dcterms:modified>2005-12-07T04:33:29Z</dcterms:modified></item><item><title>[DB] Adodb 官方介绍</title><link>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!128.entry</link><description>&lt;div&gt;&lt;font size=3&gt;&lt;strong&gt;前言&lt;/strong&gt; &lt;/font&gt;
&lt;blockquote dir=ltr&gt;
&lt;p&gt;&lt;a href="http://www.phpe.net/uploads/images/article_ellalouis_6466.jpg" target="_blank"&gt;&lt;strong&gt;&lt;font size=3&gt;&lt;img alt="点击查看原图" hspace=3 src="http://www.phpe.net/uploads/images/article_ellalouis_6466.jpg" align=center vspace=3 border=0&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;em&gt;&lt;font size=3&gt;You say eether and I say eyether, &lt;br&gt;You say neether and I say nyther; &lt;br&gt;Eether, eyether, neether, nyther - &lt;br&gt;Let's call the whole thing off ! &lt;/font&gt;&lt;/em&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;em&gt;You like potato and I like po-tah-to, &lt;br&gt;You like tomato and I like to-mah-to; &lt;br&gt;Potato, po-tah-to, tomato, to-mah-to - &lt;br&gt;Let's call the whole thing off !&lt;/em&gt; &lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;font size=3&gt;我爱听这首歌,尤其是由Louis Armstrong 及 Ella 的二重唱版本。它显示出两个恋爱中人的彼此竞争有多辛苦，也是关于互相妥协并寻求共通之处的历程。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;PHP可以用最少的精力以及最多的乐趣来建立动态的网站，要建立动态网站我们需要使用数据库来撷取登入账号信息、发布动态新闻、储存讨论区的文章。就以使用最通用的 MySQL 数据来说，你们公司已经完成了如此神奇的工作，让你们的网站比你们所能想象的还要出名。接着你们也发现MySQL无法应付实际的工作量了，是该更换数据库系统的时候了。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;不幸地，在PHP中所有数据库的存取都有些细微的不同。与MySQL连结你要使用 mysql_connect()，当你决定升级到 Oracle 或 Microsoft SQL Server 时，你必须分别改用 ocilogon() 或 mssql_connect()。更糟糕的是不同连结所使用的参数也都不一样，有的数据库说 po-tato(马铃薯的发音)，别的数据库又说 pota-to(马铃薯的另一个发音)，喔…..天啊。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;我们不要放弃&lt;/strong&gt;&lt;br&gt;当你需要确保你程序的可移植性的时候，一个叫做 ADODB 的数据库封包链接库已经出现了。它提供了共通的应用程序接口来跟所有支持的数据库沟通，因此你无须放弃！&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;ADODB是Active Data Object DataBase的缩写(很抱歉！玩计算机的有时候不是很有原创性)。ADODB目前支持MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO，你可以从 &lt;/font&gt;&lt;a href="http://php.weblogs.com/adodb"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://php.weblogs.com/adodb&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size=3&gt;下载 ADODB。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;MySQL的例子&lt;/strong&gt;&lt;br&gt;PHP中最通用的数据库是MySQL，所以我想你会喜欢下面的程序代码，它连结到 localhost 的 MySQL 服务器，数据库名称是 mydab，并且执行一个 SQL 的 select 指令查询，查询结果会一列列地印出来。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;font color="#ff0000"&gt;$db = mysql_connect(&amp;quot;localhost&amp;quot;, &amp;quot;root&amp;quot;, &amp;quot;password&amp;quot;);&lt;br&gt;mysql_select_db(&amp;quot;mydb&amp;quot;,$db);&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=3&gt;&lt;font color="#00ffff"&gt;$result = mysql_query(&amp;quot;SELECT * FROM employees&amp;quot;,$db);&lt;br&gt;if ($result === false) die(&amp;quot;failed&amp;quot;);&lt;/font&gt; &lt;br&gt;&lt;/font&gt;&lt;font size=3&gt;&lt;font color="#ff00ff"&gt;while ($fields = mysql_fetch_row($result)) {&lt;br&gt; for ($i=0, $max=sizeof($fields); $i &amp;lt; $max; $i++) {&lt;br&gt;        print $fields[$i].' ';&lt;br&gt; }&lt;br&gt; print &amp;quot;&amp;lt;br&amp;gt;n&amp;quot;;&lt;br&gt;}&lt;/font&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;上列的程序代码用颜色标出分段，第一段是连结的部分，第二段是执行SQL指令，最后一段则是显示字段，while循环扫描结果的每一列，而for循环扫描到每列的字段。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;接下来是以ADODB的程序代码得到同样的结果：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt; &lt;/font&gt;&lt;font size=3&gt;&lt;font color="#ff0000"&gt;include(&amp;quot;adodb.inc.php&amp;quot;);&lt;br&gt; $db = NewADOConnection('mysql');&lt;br&gt; $db-&amp;gt;Connect(&amp;quot;localhost&amp;quot;, &amp;quot;root&amp;quot;, &amp;quot;password&amp;quot;, &amp;quot;mydb&amp;quot;);&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=3&gt;&lt;font color="#00ffff"&gt; $result = $db-&amp;gt;Execute(&amp;quot;SELECT * FROM employees&amp;quot;);&lt;br&gt; if ($result === false) die(&amp;quot;failed&amp;quot;);&lt;/font&gt;  &lt;br&gt;&lt;/font&gt;&lt;font size=3&gt;&lt;font color="#ff00ff"&gt; while (!$result-&amp;gt;EOF) {&lt;br&gt;    for ($i=0, $max=$result-&amp;gt;FieldCount(); $i &amp;lt; $max; $i++)&lt;br&gt;           print $result-&amp;gt;fields[$i].' ';&lt;br&gt;    $result-&amp;gt;MoveNext();&lt;br&gt;    print &amp;quot;&amp;lt;br&amp;gt;n&amp;quot;;&lt;br&gt; }&lt;/font&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;现在改成指向Oracle数据库，程序代码只要修改第二行成为 NewADOConnection('oracle')，让我们看一下完整的程序代码...&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;与数据库连结&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;include(&amp;quot;adodb.inc.php&amp;quot;);&lt;br&gt;$db = NewADOConnection('mysql');&lt;br&gt;$db-&amp;gt;Connect(&amp;quot;localhost&amp;quot;, &amp;quot;root&amp;quot;, &amp;quot;password&amp;quot;, &amp;quot;mydb&amp;quot;);&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;连结的程序代码比起原来MySQL的程序代码有老练一些，因为我们正是需要更老练些。在ADODB我们使用对象导向的方法来管理多样数据库的复杂性，我们用不同类(class)来控制不同数据库。假如你不熟悉对象导向程序设计，别担心！所有的复杂事情都隐藏在 NewADOConnection() 函数之后。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;为了节省内存，我们只加载与你所连结数据库相关的PHP程序代码，我们通过调用NewADOConnection(databasedriver)来完成这件事，合法的数据库驱动程序包含 mysql,mssql,oracle,oci8,postgres,sybase,vfp,access,ibase 以及许多其它的驱动程序。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;接着我们通过调用 NewADOConnection() 来从连结类别产生一个新的对象实体，最后我们使用 $db-&amp;gt;Connect() 来连结数据库。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;执行SQL指令&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;$result = $db-&amp;gt;Execute(&amp;quot;SELECT * FROM employees&amp;quot;);&lt;br&gt;if ($result === false) die(&amp;quot;failed&amp;quot;); &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;直接传送SQL指令到服务器，当成功执行之后，Execute()将传回一个recordset对象，你可以如同上面所列来检查$result。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;一个初学者容易混淆的议题是，在ADODB有两种类型的对象，连结对象以及recordset对象，我们何时用这些对象呢？&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;连结对象($db)是负责连结数据库，格式化你的SQL查询。而recordset对象($result)则是负责撷取结果并将响应数据规格化成文字或数组。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;唯一我需要增加的事情是，ADODB提供许多有用的函数来让INSERT及UPDATE指令更容易些，这点我们在进阶的章节会提到。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;撷取资料&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;while (!$result-&amp;gt;EOF) {&lt;br&gt;   for ($i=0, $max=$result-&amp;gt;FieldCount(); $i &amp;lt; $max; $i++)&lt;br&gt;       print $result-&amp;gt;fields[$i].' ';&lt;br&gt;   $result-&amp;gt;MoveNext();&lt;br&gt;   print &amp;quot;&amp;lt;br&amp;gt;n&amp;quot;;&lt;br&gt;}&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;前面取得数据的范例很像从档案读数据，在每一行我们首先检查是否到了档案的结尾(EOF)，若还没到结尾，循环扫过每列中的字段，然后移到下一行(MoveNext)接着重复同样的事情。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$result-&amp;gt;fields[]数组是由PHP数据库延伸系统所产生的，有些数据库延伸系统并不会以字段名称建立该数组的索引，要强迫以名称排序索引该数组，使用$ADODB_FETCH_MODE的通用变量。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;&lt;br&gt;        $rs1 = $db-&amp;gt;Execute('select * from table');&lt;br&gt;        $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;&lt;br&gt;        $rs2 = $db-&amp;gt;Execute('select * from table');&lt;br&gt;        print_r($rs1-&amp;gt;fields); // shows array([0]=&amp;gt;'v0',[1] =&amp;gt;'v1')&lt;br&gt;        print_r($rs2-&amp;gt;fields); // shows array(['col1']=&amp;gt;'v0',['col2'] =&amp;gt;'v1')&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;如同你所见的上面例子，两个recordset储存并使用不同的取用模式，当recordset由Execute()产生后再设定$ADODB_FETCH_MODE。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;ADOConnection&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;连结到数据库的对象，执行SQL指令并且有一组工具函数来标准格式化SQL指令，比如关联与日期格式等指令。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;其它有用的函数&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;$recordset-&amp;gt;Move($pos)卷动目前的数据列，ADODB支持整个数据库往前卷动，有一些数据库并不支持往后的卷动，这倒不会是个问题，因为你能够用暂存纪录到快取来仿真往后卷动。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$recordset-&amp;gt;RecordCount()传回SQL指令存取到的纪录笔数，有些数据库会因为不支持而传回-1。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$recordset-&amp;gt;GetArray()以数组的方式传回结果。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;rs2html($recordset)函数将传进的recordset转为HTML的表格格式。下例中以粗体字显示相关用法：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;include('adodb.inc.php'); &lt;br&gt;&lt;strong&gt;include('tohtml.inc.php');&lt;/strong&gt; /* includes the rs2html function */&lt;br&gt;$conn = &amp;amp;ADONewConnection('mysql'); &lt;br&gt;$conn-&amp;gt;PConnect('localhost','userid','password','database');&lt;br&gt;$rs = $conn-&amp;gt;Execute('select * from table');&lt;br&gt;&lt;strong&gt;rs2html($rs);&lt;/strong&gt; /* recordset to html table */ &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;还有许多其它有用的函数列示在文件之中，可从下列网址查得 &lt;/font&gt;&lt;a href="http://php.weblogs.com/adodb_manual"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://php.weblogs.com/adodb_manual&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;进阶题材&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;新增及更新&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;假设你要新增下列数据到数据库中。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;ID&lt;/strong&gt; = 3&lt;br&gt;&lt;strong&gt;TheDate&lt;/strong&gt;=mktime(0,0,0,8,31,2001) /* 31st August 2001 */&lt;br&gt;&lt;strong&gt;Note&lt;/strong&gt;= sugar why don't we call it off &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;当你改用别的数据库，可能就没办法新增数据。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;第一个问题是，每一个数据库各自有不同的内定日期格式，MySQL使用 YYYY-MM-DD 格式，而其它数据库则有不同的内定格式，ADODB提供DBDate()函数来转换不同数据库之间的日期内定格式。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;次一个问题是单引号&lt;strong&gt;(don't)&lt;/strong&gt;的表示法，在MySQL可以直接使用单引号&lt;strong&gt;(don't)，&lt;/strong&gt;但在其它数据库如Sybase、Access、 Microsoft SQL Server，则用两个单引号表示&lt;strong&gt;(don''t)，&lt;/strong&gt;qstr()函数可以解决此问题。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;我们如何使用这些函数？就像这样：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$sql = &amp;quot;INSERT INTO table (id, thedate,note) values (&amp;quot; &lt;br&gt;   . $&lt;strong&gt;ID &lt;/strong&gt;. ','&lt;br&gt;   . $db-&amp;gt;DBDate($&lt;strong&gt;TheDate&lt;/strong&gt;) .','&lt;br&gt;   . $db-&amp;gt;qstr($&lt;strong&gt;Note&lt;/strong&gt;).&amp;quot;)&amp;quot;;&lt;br&gt;$db-&amp;gt;Execute($sql);&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;ADODB还有$connection-&amp;gt;Affected_Rows()函数，传回受最后update或delete指令影响的数据列数，及$recordset-&amp;gt;Insert_ID()函数，传回最后因insert指令而自动产生的数据列编号，预先提醒大家，没有任何数据库有提供这两个函数。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;MetaTypes&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;你可以得到关于字段的更多信息，透过recordset的方法FetchField($fieldoffset)传回对象的3个属性：name,type,max_length。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;举例说明：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$recordset = $conn-&amp;gt;Execute(&amp;quot;select adate from table&amp;quot;);&lt;br&gt;$f0 = $recordset-&amp;gt;FetchField(0);&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;结果$f0-&amp;gt;name的内容是'adata'，$f0-&amp;gt;type将是'date'，假如max_length不知道，其内容将会是-1。&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;处理不同数据库的一个问题是，每一个数据库对于相同的数据型态会有不同的称呼，比如timestamp型态在某数据库中称为datetime，而另一个数据库则称为time，所以ADODB提供MetaType($type,$max_length)函数来标准化下列的数据型态：&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;C: character and varchar types&lt;br&gt;X: text or long character (eg. more than 255 bytes wide).&lt;br&gt;B: blob or binary image&lt;br&gt;D: date&lt;br&gt;T: timestamp&lt;br&gt;L: logical (boolean)&lt;br&gt;I: integer&lt;br&gt;N: numeric (float, double, money)&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;在前面的例子中，&lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;$recordset = $conn-&amp;gt;Execute(&amp;quot;select adate from table&amp;quot;);&lt;br&gt;$f0 = $recordset-&amp;gt;FetchField(0);&lt;br&gt;$type = $recordset-&amp;gt;MetaType($f0-&amp;gt;type, $f0-&amp;gt;max_length);&lt;br&gt;print $type; /* should print 'D' */ &lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;Select指令的Limit及Top支持&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;ADODB有个$connection-&amp;gt;SelectLimit($sql,$nrows,$offset)函数让你撷取recordset的部分集合，这是采用Microsoft产品中的SELECT TOP用法，及PostgreSQL与MySQL中的SELECT...LIMIT用法的优点，即使原来的数据库并没有提供此用法，本函数也仿真提供该使用方式。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;快取支援&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;ADODB允许你在你的档案系统中暂存recordset的数据，并且在$connection-&amp;gt;CacheExecute($secs2cache,$sql)及 $connection-&amp;gt;CacheSelectLimit($secs2cache,$sql,$nrows,$offset)等设定的时间间隔到达之后，才真正去做数据库的查询以节省时间。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;PHP4 Session支持&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;ADODB也支持PHP4 session handler，你可以存放你的session变量在数据库中，相关功能请参考 &lt;/font&gt;&lt;a href="http://php.weblogs.com/adodb-sessions"&gt;&lt;u&gt;&lt;font color="#0000ff" size=3&gt;http://php.weblogs.com/adodb-sessions&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size=3&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;&lt;strong&gt;鼓励商业使用&lt;/strong&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;假如你计划写商用的PHP应用软件来销售，你也可以使用ADODB，我们依据GPL来出版ADODB，也就是说你可以合法地在商用应用软件中引用，并保有你程序代码的所有权。强烈地鼓励ADODB的商业应用，我们自己内部也正以这个理由如此使用中。&lt;/font&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size=3&gt;结论&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;&lt;font size=3&gt;为了感谢你看完这篇文章，下面就是 let's call the whole thing off 的完整歌词。&lt;/font&gt;
&lt;blockquote dir=ltr&gt;
&lt;p&gt;&lt;font size=3&gt;Refrain &lt;br&gt; &lt;br&gt;You say eether and I say eyether, &lt;br&gt;You say neether and I say nyther; &lt;br&gt;Eether, eyether, neether, nyther - &lt;br&gt;Let's call the whole thing off ! &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;You like potato and I like po-tah-to, &lt;br&gt;You like tomato and I like to-mah-to; &lt;br&gt;Potato, po-tah-to, tomato, to-mah-to - &lt;br&gt;Let's call the whole thing off ! &lt;br&gt; &lt;br&gt;But oh, if we call the whole thing off, then we must part. &lt;br&gt;And oh, if we ever part, then that might break my heart. &lt;br&gt; &lt;br&gt;So, if you like pajamas and I like pa-jah-mas, &lt;br&gt;I'll wear pajamas and give up pa-jah-mas. &lt;br&gt;For we know we &lt;br&gt;Need each other, so we &lt;br&gt;Better call the calling off off. &lt;br&gt;Let's call the whole thing off ! &lt;br&gt; &lt;br&gt;Second Refrain &lt;br&gt; &lt;br&gt;You say laughter and I say lawfter, &lt;br&gt;You say after and I say awfter; &lt;br&gt;Laughter, lawfter, after, awfter - &lt;br&gt;Let's call the whole thing off ! &lt;/font&gt;
&lt;p&gt;&lt;font size=3&gt;You like vanilla and I like vanella, &lt;br&gt;You, sa's'parilla and I sa's'parella; &lt;br&gt;Vanilla, vanella, choc'late, strawb'ry - &lt;br&gt;Let's call the whole thing off ! &lt;br&gt; &lt;br&gt;But oh, if we call the whole thing off, then we must part. &lt;br&gt;And oh, if we ever part, then that might break my heart. &lt;br&gt; &lt;br&gt;So, if you go for oysters and I go for ersters, &lt;br&gt;I'll order oysters and cancel the ersters. &lt;br&gt;For we know we &lt;br&gt;Need each other, so we &lt;br&gt;Better call the calling off off. &lt;br&gt;Let's call the whole thing off ! &lt;/font&gt;&lt;/blockquote&gt;
&lt;p dir=ltr&gt;&lt;font size=3&gt;Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers in the film &amp;quot;Shall We Dance?&amp;quot; &lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913911617972053559&amp;page=RSS%3a+%5bDB%5d+Adodb+%e5%ae%98%e6%96%b9%e4%bb%8b%e7%bb%8d&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=miaomin.spaces.live.com&amp;amp;GT1=miaomin"&gt;</description><comments>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!128.entry#comment</comments><guid isPermaLink="true">http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!128.entry</guid><pubDate>Wed, 23 Nov 2005 06:07:02 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://miaomin.spaces.live.com/blog/cns!844B6C9C838C59C9!128/comments/feed.rss</wfw:commentRss><wfw:comment>http://miaomin.spaces.live.com/Blog/cns!844B6C9C838C59C9!128.entry#comment</wfw:comment><dcterms:modified>2005-12-07T04:33:50Z</dcterms:modified></item></channel></rss>