﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>PHP博客-php探讨</title><link>http://www.phpweblog.net/wgxjava/</link><description>php迷兔</description><language>zh-cn</language><lastBuildDate>Thu, 08 Jan 2009 07:51:44 GMT</lastBuildDate><pubDate>Thu, 08 Jan 2009 07:51:44 GMT</pubDate><ttl>60</ttl><item><title>动态虚拟主机配置方法</title><link>http://www.phpweblog.net/wgxjava/archive/2008/08/06/5538.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Wed, 06 Aug 2008 14:09:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/08/06/5538.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/5538.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/08/06/5538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/5538.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/5538.html</trackback:ping><description><![CDATA[<font id="zoom" class="f14">
在这里得到很多的帮助，因此希望帮到别人，能力有限，高手见笑了
<br>动态虚拟主机配置
<br>
<br>动态配置海量虚拟主机驻留，用于巨量数目的WEB站点。随apache提供的标准模块+mod_vhost_aliases实现动态配置的主机。作用是在检查完进来的URL后为这些目录生成实际路径。
<br>实现基于名字的动态虚拟主机指令：
<br>
<br>&nbsp;VirtualDocumentRoot
<br>&nbsp;指定模块如何从URL请求那里为动态虚拟主机构造DocumentRoot路径。
<br>&nbsp;VirtualScriptAlias
<br>&nbsp;和ScriptAlias一样，从URL请求那里构造一个包含CGI脚本的目录路径
<br>
<br>%N
<br>服务器的第N部分，如果服务器的全名是&nbsp;vhost1.sohu.com，那么%1解析成vhost1，%2&nbsp;解析成sohu，以此类推。
<br>
<br>%N+
<br>服务器名称的地N部分和其后所有其余部分。如果服务器全名为vhost1.sohu.com，那么%2+解析为sohu.com。
<br>
<br>%-N
<br>字符串倒数第N部分。如果服务器全名为vhost1.sohu.com，那么%-1解析成com。%-2解析成sohu
<br>
<br>%p
<br>动态虚拟主机的TCP端口号
<br>
<br>
<br>还可以从服务器名字中抽取的每一部分可以使用分类符%N.M继续对子部分进一步划分，其中N是主部分，M是子部分。例如：
<br>%1=vhost1
<br>%2=sohu
<br>%3=com
<br>
<br>可以划分子部分：
<br>%1.1=v
<br>%1.2=h
<br>%1.3=o
<br>%2.1=s
<br>%2.2=o
<br>
<br>
<br>例如：
<br>在httpd.conf文件中：
<br>&nbsp;UseCanonicalName&nbsp;off&nbsp;
<br>&nbsp;VirtualDocumentRoot&nbsp;/home/httpd/%1/%p
<br>
<br>要实现输入http://www.263.net:443
<br>需要在/home/httpd目录中建立www(%1)/443
<br>然后在/home/httpd/%1/443/目录中建立网页文件，&nbsp;在DNS中设置解析
<br>访问即可。
<br>
<br>
<br>
<br>例2：
<br>
<br>将例子一中的VirtualDocumentRoot定义的内容删除。
<br>然后再添加：
<br>&nbsp;VirtualHostDocumentRoot&nbsp;/home/httpd/%1/%2
<br>
<br>
<br>要求：
<br>实现动态虚拟主机：
<br>www.abc.com
<br>www.xyz.com
<br>
<br>#mkdir&nbsp;/home/httpd/www
<br>#mkdir&nbsp;/home/httpd/www/abc
<br>#mkdir&nbsp;/home/httpd/www/xyz
<br>将网页文件放入/home/httpd/www/abc和/home/httpd/www/xyz即可
<br>在DNS中设置解析&nbsp;:oops:</font><img src ="http://www.phpweblog.net/wgxjava/aggbug/5538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-08-06 22:09 <a href="http://www.phpweblog.net/wgxjava/archive/2008/08/06/5538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP上传文件的代码实例</title><link>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5030.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Wed, 11 Jun 2008 08:51:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5030.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/5030.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/5030.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/5030.html</trackback:ping><description><![CDATA[动态网站开发中，常用的PHP上传文件的代码实例。<br><br>以下为引用的内容：<br><br>&lt;html&gt;<br><br><br><br>&lt;head&gt;<br><br><br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br><br><br><br>&lt;title&gt;网页教学网(webjx.com)文件上传实例&lt;/title&gt; <br><br>&lt;/head&gt; <br><br>&lt;body&gt;<br><br>&lt;form enctype="multipart/form-data" action=upfile.php method=post&gt; <br><br><br>&lt;input type="hidden" name="MAX_FILE_SIZE" value="2000000"&gt;<br><br><br><br>&lt;input type=file name=upfile size=20&gt;<br><br><br><br>&lt;input type=submit value='上传文件'&gt; <br><br><br>&lt;/form&gt; &nbsp;<br><br>&lt;/body&gt;<br><br><br>&lt;/html&gt;<br>&lt;?<br><br>phpsu<br><br>function getname($exname){ <br>&nbsp;&nbsp; $dir = "../uploadfile/";<br>www.phpsu.com<br><br>&nbsp;&nbsp; $i=1;<br>welcome to phpsu.com<br><br>&nbsp;&nbsp; if(!is_dir($dir)){ <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mkdir($dir,0777); <br>&nbsp;&nbsp; }<br><br><br><br>&nbsp;&nbsp; while(true){ www.phpsu.com<br><br>&nbsp;&nbsp;&nbsp;&nbsp; if(!is_file($dir.$i.".".$exname)){ welcome to phpsu.com<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $name=$i.".".$exname; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br><br>phpsu<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } phpsu提供的php教程<br><br>&nbsp;&nbsp;&nbsp;&nbsp; $i++; <br>&nbsp;&nbsp; }<br><br>phpsu.com<br><br><br>&nbsp;&nbsp; return $dir.$name;<br><br><br><br>}<br><br><br>$exname=strtolower(substr($_FILES['upfile']['name'],(strrpos($_FILES['upfile']['name'],'.')+1)));<br><br><br>$uploadfile = getname($exname); &nbsp;<br><br><br>if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile)) { <br><br>&nbsp;&nbsp; echo "&lt;h2&gt;&lt;font color=#ff0000&gt;文件上传成功！&lt;/font&gt;&lt;/h2&gt;&lt;br&gt;&lt;br&gt;";<br>www.phpsu.com<br><br>}else { phpsu is a phpschool<br><br>&nbsp;&nbsp; echo "&lt;h2&gt;&lt;font color=#ff0000&gt;文件上传失败！&lt;/font&gt;&lt;/h2&gt;&lt;br&gt;&lt;br&gt;";<br><br><br>}<br><br>echo "下面是文件上传的一些信息：<br><br>&nbsp;&nbsp;&nbsp; &lt;br&gt;&lt;br&gt;原文件名：".$_FILES['upfile']['name'] . <br><br>&nbsp;&nbsp;&nbsp; "&lt;br&gt;&lt;br&gt;类型：" .$_FILES['upfile']['type'] .<br><br><br>&nbsp;&nbsp;&nbsp; "&lt;br&gt;&lt;br&gt;临时文件名：".$_FILES['upfile']['tmp_name'].<br>phpsu.com<br><br>&nbsp;&nbsp;&nbsp; "&lt;br&gt;&lt;br&gt;文件大小：".$_FILES['upfile']['size'] . <br>&nbsp;&nbsp;&nbsp; "&lt;br&gt;&lt;br&gt;错误代码：".$_FILES['upfile']['error'];<br>?&gt;<br>TITLE:PHP上传文件的代码实例
<a href="http://www.pass4sure.com/PW0-300.html">PW0-300</a> <a href="http://www.pass4sure.com/310-083.html">310-083</a> <br><img src ="http://www.phpweblog.net/wgxjava/aggbug/5030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-06-11 16:51 <a href="http://www.phpweblog.net/wgxjava/archive/2008/06/11/5030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>脚本文件 PHP</title><link>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5027.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Wed, 11 Jun 2008 08:46:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5027.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/5027.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/5027.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/5027.html</trackback:ping><description><![CDATA[如果你目前着手的web站点开发项目规模较大，那你对代码重用必定深有体会，比方说，不管是html还是php代码块，只要项目足够大，比如有1000个web页，你即便是一年只修改一次包含版权信息的页脚也会让你痛不欲生。<br> <br> 而php可以通过一些函数帮助你重用代码，你要具体用到的函数依赖于你打算重用的内容。<br> <br> 主要的函数是：<br> <br> * include() 和 include_once()<br> * require() 和require_once() <br> <br> include()函数包含给定的文件，比如：<br> <br> include('/home/me/myfile'); <br> <br> 包含文件中的任何代码都将在include() 所在的代码页的变量范围之内执行。你可以包含服务器上的静态文件或者包含在其他服务器上的目标文件，方法是组合使用include()和fopen()。<br> <br> include_once()函数和include()函数功能类似，只是该函数会检查被包含文件内的代码是否已经被目前的脚本所包含过。如果代码已经被脚本所包含，该函数就不再包含相应的文件了。
<div class="Qrv442">phpsu.com is a free phpscool</div>
<br> <br>
require()函数用给定文件的内容取代自身。这一替换过程发生在php引擎编译你的代码而不是执行代码阶段，这可和include()不一样，后者
首先被计算再加到文挡中。require()函数多用于静态元素，而include()函数则主要用于动态元素。和include_once()类似，
require_once()函数会检查给定代码是否早已经插入到了文挡内，如果这样，给定代码就不会被再次插入文档。<br> <br> 我建议你最好对诸如版权、静态文本和其他不含变量的元素这类信息采用require函数，那些依赖其他脚本来实现自己内容的元素也最好采用require函数，例如：<br> <br> &lt;html&gt;<br> &lt;head&gt;&lt;title&gt;something&lt;/title&gt;&lt;/head&gt;<br> &lt;body&gt;<br> [a lot of content] <br> <br> &lt;?<br> // insert copyright<br> require('/home/me/mycopyright');<br> ?&gt; <br> <br> &lt;/body&gt;<br> &lt;/html&gt; <br> <br> 另一方面，我经常用include()函数把函数库或类似的内容放到脚本之外： <font color="#ffffff">http://www.phpsu.com</font> <br> <br> &lt;?<br> // get my function library<br> include('/home/me/myfunctions'); <br> <br> // do php things with my functions ?&gt; <br> <br> &lt;html&gt;<br> &lt;head&gt;&lt;title&gt;something&lt;/title&gt;&lt;/head&gt;<br> &lt;body&gt;<br> [a lot of content]<br> &lt;/body&gt;<br> &lt;/html&gt; <br> <br>
你肯定会问：&#8220;那么，被included或者被required的文件都来自哪里呢？&#8221;答案很简单：&#8220;你的系统。&#8221;不过，有时，有些代码会包含了诸如带有
用户名和密码的数据库连接函数之类的安全信息，在这样的情况下，显而易见，你肯定不希望这些东西也成为文档的一部分弄得全世界都知道。<br> <br> 你可以把包含文件（included或者required）放在系统的任何地方，只要用户所能用到的php可以访问这些文件即可。你还可以给这些文件以任何你希望给出的文件扩展名，或者不设扩展名。<a  href="http://www.realexams.org/Microsoft/70-638.html">70-638</a> <a  href="http://www.realexams.org/Microsoft/70-556.html">70-556</a><br> <br> 使用include()和require()函数可以让web站点上普遍存在或者经常变动的元素变得更加容易处理。
<br>
TITLE:PHP脚本文件
<br><img src ="http://www.phpweblog.net/wgxjava/aggbug/5027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-06-11 16:46 <a href="http://www.phpweblog.net/wgxjava/archive/2008/06/11/5027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP接口的学习</title><link>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5026.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Wed, 11 Jun 2008 08:44:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5026.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/5026.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5026.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/5026.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/5026.html</trackback:ping><description><![CDATA[最近学习 Php5 接口的过程中遇到了困难，书中说是实现多重继承的一种方式，但我依然不知道具体该如何实现。在网上查PHP接口的资料很少，就查了java的，其实基本上都差不多。看完《澄清 Java（接口与继承）》这篇文章才恍然大悟，原来我一开始理解就有误，所谓的多重继承是指接口继承类，而不是类继承接口。<br>&nbsp;&nbsp;&nbsp; 文章中提到了OO的抽象，正如文章中的那句话——"抽象就是抽去像的部分"，很形象，以前想到抽象总是认为很难理解，抽象嘛，哈哈，现在就很容易理解了，这也正是接口和抽象类所要做的事情。<br>&nbsp;&nbsp;&nbsp; 文章中还有很多观点也让我受益匪浅，罗列如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OO的精髓，我以为，是对对象的抽象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接口的作用，一言以蔽之，就是标志类的类别（type of class）。把不同类型的类归于不同的接口，可以更好的管理他们。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承的意义也在于抽象，而不是代码重用。<br>&nbsp;&nbsp;&nbsp;&nbsp; 看完这篇文章，现在基本上理解接口、抽象类、继承该如何应用了。<br><br>原文如下：<br>澄清Java（接口与继承）计算机学院研二的兄弟与我讨论Java，一见面，几个问题全是关于接口，接口有什么用？为什么要用接口？什么时候该使用接口？很庆幸他们不是问我 Java如何连接SQL Server，或者是如何开发J2EE应用，这类问题有杀伤力，避之则吉。今年计算机学院本科有个毕业设计课题是做J2ME，选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包，这个这个&#8230;&#8230;唉。<br><br>　　大多数人认为，接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制，但是却能够实作多个接口。其实这样做是很牵强的，接口和继承是完全不同的东西，接口没有能力代替多重继承，也没有这个义务。接口的作用，一言以蔽之，就是标志类的类别（type of class）。把不同类型的类归于不同的接口，可以更好的管理他们。OO的精髓，我以为，是对对象的抽象，最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言（比如c++、java、c#等），就是因为设计模式所研究的，实际上就是如何合理的去抽象。（cowboy的名言是 &#8220;抽象就是抽去像的部分&#8221;，看似调侃，实乃至理）。<br><br>　　设计模式中最基础的是工厂模式（Factory），在我最近的一个很简单的应用中，我想尽量的让我的程序能够在多个数据库间移植，当然，这涉及很多问题，单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化，只考虑如何连接不同的数据库。<br><br>　　假设我有很多个类，分别是Mysql.java、SQLServer.java、Oracle.java、 DB2.java，他们分别连接不同的数据库，统一返回一个Connection对象，并且都有一个close方法，用于关闭连接。只需要针对你的 DBMS，选择不同的类，就可以用了，但是我的用户他会使用什么数据库？我不知道，我希望的是尽量少的修改代码，就能满足他的需要。我可以抽象如下接口：<br>package org.bromon.test;<br>public interface DB.
<a  href="http://www.pass4sure.com/310-083.html">310-083</a> <br>{<br>　　java.sql.Connection openDB(String url,String user,String password);<br>　　void close();<br>}<br><br>　　这个接口只定义两个方法，没有任何有实际意义的代码，具体的代码由实作这个接口的类来给出，比如Mysql.java：<br><br>Package org.bromon.test;<br>import java.sql.*;<br>public class Mysql implements DB<br>{<br>　　private String url=&#8221;jdbc:mysql:localhost:3306/test&#8221;;<br>　　private String user=&#8221;root&#8221;;<br>　　private String password=&#8221;&#8221;;<br>　　private Connection conn;<br>　　public Connection openDB(url,user,password)<br>　　{<br>　　　　//连接数据库的代码<br>　　}<br><br>　　public void close()<br>　　{<br>　　　　//关闭数据库<br>　　}<br>}<br><br>　　类似的当然还有Oracle.java等等，接口DB给这些类归了个类，在应用程序中我们这样定义对象：<br><br>　　org.bromon.test.DB myDB;<br><br>　　使用myDB来操作数据库，就可以不用管实际上我所使用的是哪个类，这就是所谓的&#8220;开-闭&#8221;原则。但是问题在于接口是不能实例化的，myDB= new DB()，这样的代码是绝对错误的，我们只能myDB=new Mysql()或者myDB=new Oracle()。麻烦了，我还是需要指定具体实例化的是哪个类，用了接口跟没用一样。所以我们需要一个工厂：<br><br>package org.bromon.test;<br>public class DBFactory<br>{<br>　　public static DB Connection getConn()<br>　　{<br>　　　　Return(new Mysql());<br>　　}<br>}<br><br>　　所以实例化的代码变成：myDB=DBFactory.getConn()；<br>　　这就是23种模式中最基础的普通工厂 (Factory)，工厂类负责具体实例化哪个类，而其他的程序逻辑都是针对DB这个接口进行操作，这就是&#8220;针对接口编程&#8221;。责任都被推卸给工厂类了，当然你也可以继续定义工厂接口，继续把责任上抛，这就演变成抽象工厂(Abstract Factory)。<br><br>　　整个过程中接口不负责任何具体操作，其他的程序要连接数据库的话，只需要构造一个DB对象就OK，<a  href="http://www.pass4sure.com/MB3-530.html">MB3-530</a>而不管工厂类如何变化。这就是接口的意义----抽象。<br><br>　　继承的概念不用多说，很好理解。为什么要继承呢？因为你想重用代码？这绝对不是理由，继承的意义也在于抽象，而不是代码重用。如果对象A有一个 run()方法，对象B也想有这个方法，<a  href="http://www.pass4sure.com/HP0-729.html">HP0-729</a> <a  href="http://www.pass4sure.com/PW0-300.html">PW0-300</a>所以有人就Class B extends A。这是不经大脑的做法。如果在B中实例化一个A，调用A的Run()方法，是不是可以达到同样的目的？如下：<br>Class B<br>{<br>　　A&nbsp; a=new A();<br>　　a.run();<br>}<br><br>　　这就是利用类的聚合来重用代码，是委派模式的雏形，是GoF一贯倡导的做法。<br><br>　　那么继承的意义何在？其实这是历史原因造成的，最开始的OO语言只有继承，没有接口，所以只能以继承来实现抽象，请一定注意，继承的本意在于抽象，而非代码重用（虽然继承也有这个作用），这是很多Java烂书最严重的错误之一，它们所造成的阴影，我至今还没有完全摆脱，坏书害人啊，尤其是入门类的，流毒太大。什么时候应该使用继承？只在抽象类中使用，其他情况下尽量不使用。抽象类也是不能实例化的，它仅仅提供一个模版而已，这就很能说明问题。<br><br>　　软件开发的万恶之源，一是重复代码而不是重用代码，二是烂用继承，尤以c++程序员为甚。Java中取缔多重继承，目的就是制止烂用继承，实是非常明智的做法，不过很多人都不理解。Java能够更好的体现设计，这是让我入迷的原因之一。
<br><img src ="http://www.phpweblog.net/wgxjava/aggbug/5026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-06-11 16:44 <a href="http://www.phpweblog.net/wgxjava/archive/2008/06/11/5026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>变量的基础</title><link>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5025.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Wed, 11 Jun 2008 08:37:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5025.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/5025.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/06/11/5025.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/5025.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/5025.html</trackback:ping><description><![CDATA[<p>传送变量给函数</p>
<p>先来看一个例子：</p>
<blockquote>
<p> function doublevalue($var)<br>
{<br>
$var = $var * 2;<br>
}<br>
$variable = 5;<br>
doublevalue($variable);<br>
print &#8220;\$variable is: $variable&#8221;;</p>
</blockquote>
<p>输出的结果是： &#8220;5&#8221; ！</p>
<p>为什么？因为传送给函数的是变量5这个值，计算结果虽然是10，但是没有重新赋值给变量&#8220;$variable&#8221;，所以变量&#8221;variable&#8221;的值依然是5，这个需要注意。</p>
<p>如果把上面的第一个语句换一下：</p>
<blockquote>
<p> function doublevalue(&amp;$var)</p>
</blockquote>
<p>那么输出结果变成： 10</p>
<p>因为加了一个&#8220;&amp;&#8221;，所以参数就不是指变量值，而是指向变量存储在内存里的位置（变量本身）。结果在函数内改变$var也会影响到位于函数外原始变量$variable。</p>
<p>这个过程叫&#8220;引用&#8221;：引用变量自身。</p>
<p>同时，如果参数以引用的 形式被定义，则无法以直接量的表达式作为函数的参数，因为函数现在准备修改的对象是变量。</p>
<p>通过引用，也可以实现一个变量值被多个变量访问。</p>
<p>来看这个</p>
<blockquote>
<p>
$x = 10;<br>
$y = &amp;$x;<br>
$y++;<br>
print $x;<br>
print $y;
</p>
</blockquote>
<p>结果你应该猜到了，两个11。因为改变$y同时也会改变$x,$y引用$x，事实上，他们等于是同一个变量。如果想解除$y对x变量的引用可以使用<br>
unset($y);<br>
<a href="http://www.pass4sure.com/HP0-729.html">HP0-729</a> <a href="http://www.pass4sure.com/PW0-300.html">PW0-300</a> <a href="http://www.pass4sure.com/310-083.html">310-083</a> 来实现。</p>
<img src="http://www.phpweblog.net/CuteSoft_Client/CuteEditor/Themes/Custom/Images/design.gif" isout="false" iscommanddisabled="true" iscommandactive="true" command="TabEdit" class="CuteEditorButtonDown" title="普通"><img src ="http://www.phpweblog.net/wgxjava/aggbug/5025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-06-11 16:37 <a href="http://www.phpweblog.net/wgxjava/archive/2008/06/11/5025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP动态网站开发中常用的8个小技巧</title><link>http://www.phpweblog.net/wgxjava/archive/2008/04/29/3304.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Tue, 29 Apr 2008 02:29:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/04/29/3304.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/3304.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/04/29/3304.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/3304.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/3304.html</trackback:ping><description><![CDATA[<p>本文总结了<span class="ReplaceKeyword">PHP</span>日常开发中常用的8个小技巧。 <br>PHP批最取得checkbox的值</p>
<p>1、命名</p>
<p>&lt;input type='checkbox' name='checkbox[]' value=$dwmyrow[banzhu] /&gt;</p>
<p>2、使用</p>
<p>当计划当作sql指令的一部分时：如果参与控制的字段是数值型的，则</p>
<p>if(! empty($_POST['checkbox'])) {<br>$expr = join(",", $_POST['checkbox']);<br>$sql = "select * from tbl_name where field in ($expr)";<br>}</p>
<p>如果参与控制的字段是数值型的，则</p>
<p>if(! empty($_POST['checkbox'])) {<br>$expr = "'".join("','", $_POST['checkbox']).".";<br>$sql = "select * from tbl_name where field in ($expr)";<br>} </p>
<p>PHP判断Form表单是否提交</p>
<p>$action=$HTTP_POST_VARS["Button1"];<br>&nbsp;if($action=="提交")<br>&nbsp;{<br>&nbsp; //执行表单操作<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp; //读取默认值<br>&nbsp;} </p>
<p>PHP 获取字符串长度</p>
<p>strlen($myrow[1])</p>
<p>PHP Url转向</p>
<p>Header("Location: ".$_SERVER["HTTP_REFERER"]); </p>
<p>PHP超全局对象</p>
<p>&lt;?php<br>$a = 1;<br>$b = 2;<br>function Sum()<br>{<br>&nbsp;&nbsp; $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];<br>}<br>Sum();<br>echo $b;<br>?&gt; </p>
<p>PHP 表单取值</p>
<p>如果&nbsp; mothod="get"&nbsp; 就用&nbsp; $_GET["test"]&nbsp; 代替$test&nbsp; <br>如果&nbsp; mothod="post"&nbsp; 就用&nbsp; $_POST["test"]&nbsp; 代替$test</p>
<p>PHP取得当前IP</p>
<p>&lt;?=$HTTP_SERVER_VARS["REMOTE_ADDR"]?&gt;</p>
<p>PHP 取得当前时间</p>
<p>&lt;?php<br>&nbsp;&nbsp;&nbsp;&nbsp; echo date("Y-m-d G:i:s");<br>&nbsp;&nbsp;&nbsp; ?&gt;<br>date("Y年m月d日")<br>Date ("Y-n-j")<br><br> <a href="http://www.better123.com/product.asp?parentcode=102">Dual Sim Mobile</a> </p>
<br><img src ="http://www.phpweblog.net/wgxjava/aggbug/3304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-04-29 10:29 <a href="http://www.phpweblog.net/wgxjava/archive/2008/04/29/3304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于PHP接口的学习</title><link>http://www.phpweblog.net/wgxjava/archive/2008/03/01/2857.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Sat, 01 Mar 2008 01:49:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/03/01/2857.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/2857.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/03/01/2857.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/2857.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/2857.html</trackback:ping><description><![CDATA[<p> 最近学习PHP5接口的过程中遇到了困难 ，书中说是实现多重继承的一种方式，但我依然不知道具体该如何实现。在网上查PHP接口的资料很少，就查了java的，其实基本上都差不多。看完《澄清Java（接口与继承）》这篇文章才恍然大悟，原来我一开始理解就有误，所谓的多重继承是指接口继承类，而不是类继承接口。<br>&nbsp;&nbsp;&nbsp; 文章中提到了OO的抽象，正如文章中的那句话——"抽象就是抽去像的部分"，很形象，以前想到抽象总是认为很难理解，抽象嘛，哈哈，现在就很容易理解了，这也正是接口和抽象类所要做的事情。<br>&nbsp;&nbsp;&nbsp; 文章中还有很多观点也让我受益匪浅，罗列如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OO的精髓，我以为，是对对象的抽象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接口的作用，一言以蔽之，就是标志类的类别（type of class）。把不同类型的类归于不同的接口，可以更好的管理他们。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承的意义也在于抽象，而不是代码重用。<br>&nbsp;&nbsp;&nbsp;&nbsp; 看完这篇文章，现在基本上理解接口、抽象类、继承该如何应用了。</p>
<p>原文如下：<br>澄清Java（接口与继承）
计算机学院研二的兄弟与我讨论Java，一见面，几个问题全是关于接口，接口有什么用？为什么要用接口？什么时候该使用接口？很庆幸他们不是问我
Java如何连接SQL
Server，或者是如何开发J2EE应用，这类问题有杀伤力，避之则吉。今年计算机学院本科有个毕业设计课题是做J2ME，选这个题目的学生在5月末都
还在苦着脸研究java.util.*这个包，这个这个&#8230;&#8230;唉。</p>
<p>　　大多数人认为，接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制，但是却能够实作多个接口。其实这样做是很牵强的，
接口和继承是完全不同的东西，接口没有能力代替多重继承，也没有这个义务。接口的作用，一言以蔽之，就是标志类的类别（type of
class）。把不同类型的类归于不同的接口，可以更好的管理他们。OO的精髓，我以为，是对对象的抽象，最能体现这一点的就是接口。为什么我们讨论设计
模式都只针对具备了抽象能力的语言（比如c++、java、c#等），就是因为设计模式所研究的，实际上就是如何合理的去抽象。（cowboy的名言是
&#8220;抽象就是抽去像的部分&#8221;，看似调侃，实乃至理）。</p>
<p>　　设计模式中最基础的是工厂模式（Factory），在我最近的一个很简单的应用中，我想尽量的让我的程序能够在多个数据库间移植，当然，这涉及很多问题，单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化，只考虑如何连接不同的数据库。</p>
<p>　　假设我有很多个类，分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java，他们分别连接不同
的数据库，统一返回一个Connection对象，并且都有一个close方法，用于关闭连接。只需要针对你的DBMS，选择不同的类，就可以用了，但是
我的用户他会使用什么数据库？我不知道，我希望的是尽量少的修改代码，就能满足他的需要。我可以抽象如下接口：<br>package org.bromon.test;<br>public interface DB<br>{<br>　　java.sql.Connection openDB(String url,String user,String password);<br>　　void close();<br>}</p>
<p>　　这个接口只定义两个方法，没有任何有实际意义的代码，具体的代码由实作这个接口的类来给出，比如Mysql.java：<a href="http://www.pass4sure.com/000-710.html">000-710</a>&nbsp;<a href="http://www.pass4sure.com/000-732.html">000-732</a><a href="http://www.pass4sure.com/000-774.html"></a>
</p>
<p>Package org.bromon.test;<br>import java.sql.*;<br>public class Mysql implements DB<br>{<br>　　private String url=&#8221;jdbc:mysql:localhost:3306/test&#8221;;<br>　　private String user=&#8221;root&#8221;;<br>　　private String password=&#8221;&#8221;;<br>　　private Connection conn;<br>　　public Connection openDB(url,user,password)<br>　　{<br>　　　　//连接数据库的代码<br>　　}</p>
<p>　　public void close()<br>　　{<br>　　　　//关闭数据库<br>　　}<br>}</p>
<p>　　类似的当然还有Oracle.java等等，接口DB给这些类归了个类，在应用程序中我们这样定义对象：</p>
<p>　　org.bromon.test.DB myDB;&nbsp;<a href="http://www.pass4sure.com/000-774.html">000-774</a>
</p>
<p>　　使用myDB来操作数据库，就可以不用管实际上我所使用的是哪个类，这就是所谓的&#8220;开-闭&#8221;原则。但是问题在于接口是不能实例化的，myDB=
new DB()，这样的代码是绝对错误的，我们只能myDB=new Mysql()或者myDB=new
Oracle()。麻烦了，我还是需要指定具体实例化的是哪个类，用了接口跟没用一样。所以我们需要一个工厂：</p>
<p>package org.bromon.test;<br>public class DBFactory<br>{<br>　　public static DB Connection getConn()<br>　　{<br>　　　　Return(new Mysql());<br>　　}<br>}</p>
<p>　　所以实例化的代码变成：myDB=DBFactory.getConn()；<br>　　这就是23种模式中最基础的普通工厂
(Factory)，工厂类负责具体实例化哪个类，而其他的程序逻辑都是针对DB这个接口进行操作，这就是&#8220;针对接口编程&#8221;。责任都被推卸给工厂类了，当
然你也可以继续定义工厂接口，继续把责任上抛，这就演变成抽象工厂(Abstract Factory)。</p>
<p>　　整个过程中接口不负责任何具体操作，其他的程序要连接数据库的话，只需要构造一个DB对象就OK，而不管工厂类如何变化。这就是接口的意义----抽象。</p>
<p>　　继承的概念不用多说，很好理解。为什么要继承呢？因为你想重用代码？这绝对不是理由，继承的意义也在于抽象，而不是代码重用。如果对象A有一个
run()方法，对象B也想有这个方法，所以有人就Class B extends
A。这是不经大脑的做法。如果在B中实例化一个A，调用A的Run()方法，是不是可以达到同样的目的？如下：<br>Class B<br>{<br>　　A&nbsp; a=new A();<br>　　a.run();<br>}</p>
<p>　　这就是利用类的聚合来重用代码，是委派模式的雏形，是GoF一贯倡导的做法。</p>
<p>　　那么继承的意义何在？其实这是历史原因造成的，最开始的OO语言只有继承，没有接口，所以只能以继承来实现抽象，请一定注意，继承的本意在于抽
象，而非代码重用（虽然继承也有这个作用），这是很多Java烂书最严重的错误之一，它们所造成的阴影，我至今还没有完全摆脱，坏书害人啊，尤其是入门类
的，流毒太大。什么时候应该使用继承？只在抽象类中使用，其他情况下尽量不使用。抽象类也是不能实例化的，它仅仅提供一个模版而已，这就很能说明问题。</p>
<p>　　软件开发的万恶之源，一是重复代码而不是重用代码，二是烂用继承，尤以c++程序员为甚。Java中取缔多重继承，目的就是制止烂用继承，实是非常明智的做法，不过很多人都不理解。Java能够更好的体现设计，这是让我入迷的原因之一</p>
<br><img src ="http://www.phpweblog.net/wgxjava/aggbug/2857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-03-01 09:49 <a href="http://www.phpweblog.net/wgxjava/archive/2008/03/01/2857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 的数据类型和建库策略</title><link>http://www.phpweblog.net/wgxjava/archive/2008/01/08/2665.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Tue, 08 Jan 2008 02:36:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/01/08/2665.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/2665.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/01/08/2665.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/2665.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/2665.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Arial">无论是在小得可怜的免费数据库空间或是大型电子商务网站，合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"><span style="FONT-WEIGHT: bold; COLOR: rgb(51,102,255); FONT-FAMILY: Arial">一、数字类型</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">数字类型按照我的分类方法分为三类：整数类、小数类和数字类。</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">我所谓的&#8220;数字类&#8221;，就是指 DECIMAL 和 NUMERIC，它们是同一种类型。它严格的说不是一种数字类型，<span style="COLOR: rgb(255,0,0)">因为他们实际上是将数字以字符串形式保存的</span>；他的值的每一位 (包括小数点) 占一个字节的存储空间，因此这种类型耗费空间比较大。但是它的一个突出的优点是小数的位数固定，在运算中不会&#8220;失真&#8221;，所以比较适合用于&#8220;价格&#8221;、&#8220;金额&#8221;这样对精度要求不高但准确度要求非常高的字段 <a href="http://www.pass4sure.com/190-802.html">190-802</a>&nbsp;<a href="http://www.pass4sure.com/000-834.html">000-834</a>&nbsp;<a href="http://www.pass4sure.com/000-861.html">000-861</a>&nbsp;<a href="http://www.pass4sure.com/117-102.html">117-102</a>&nbsp;。</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">小数类，即浮点数类型，根据精度的不同，有 FLOAT 和 DOUBLE 两种。它们的优势是精确度，FLOAT 可以表示绝对值非常小、小到约 1.17E-38 (0.000...0117，小数点后面有 37 个零) 的小数，而 DOUBLE 更是可以表示绝对值小到约 2.22E-308 (0.000...0222，小数点后面有 307 个零) 的小数。FLOAT 类型和 DOUBLE 类型占用存储空间分别是 4 字节和 8 字节。如果需要用到小数的字段，精度要求不高的，当然用 FLOAT 了。可是说句实在话，我们&#8220;民用&#8221;的数据，哪有要求精度那么高的呢？这两种类型至今我没有用过 </span>
<img src ="http://www.phpweblog.net/wgxjava/aggbug/2665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-01-08 10:36 <a href="http://www.phpweblog.net/wgxjava/archive/2008/01/08/2665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高MySQL数据库查询效率的几个技巧</title><link>http://www.phpweblog.net/wgxjava/archive/2008/01/08/2664.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Tue, 08 Jan 2008 02:34:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/01/08/2664.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/2664.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/01/08/2664.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/2664.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/2664.html</trackback:ping><description><![CDATA[<div style="TEXT-INDENT: 21.75pt" twffan="done">MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效.以下是我在使用过程中做的提高效率的三个有效的尝试.</div>
<div style="TEXT-INDENT: 21.75pt" twffan="done">&nbsp;</div>
<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt" twffan="done"><span style="FONT-SIZE: 9pt" twffan="done">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用statement进行绑定查询</div>
<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt" twffan="done">使用statement可以提前构建查询语法树,在查询时不再需要构建语法树就直接查询.因此可以很好的提高查询的效率. 这个方法适合于查询条件固定但查询非常频繁的场合.</div>
<div style="MARGIN: 0cm 0cm 0pt 33pt; TEXT-INDENT: 9pt" twffan="done">使用方法是:</div>
<ol style="MARGIN-TOP: 0cm" type=1>
    <li>绑定, 创建一个MYSQL_STMT变量,与对应的查询字符串绑定,字符串中的问号代表要传入的变量,每个问号都必须指定一个变量.
    <li>查询, 输入每个指定的变量, 传入MYSQL_STMT变量用可用的连接句柄执行. </li>
</ol>
<div twffan="done">代码如下:</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//1.绑定</div>
<div twffan="done">bool CDBManager::BindInsertStmt(MYSQL * connecthandle)</div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>作插入操作的绑定</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL_BIND insertbind[FEILD_NUM];</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_stInsertParam == NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertParam = new CHostCacheTable;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertStmt = mysql_stmt_init(connecthandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>构建绑定字符串</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char insertSQL[SQL_LENGTH];</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(insertSQL, "insert into HostCache(SessionID, ChannelID, ISPType, "</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ExternalIP, ExternalPort, InternalIP, InternalPort) "</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "values(?, ?, ?, ?, ?, ?, ?)");</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_stmt_prepare(m_stInsertStmt, insertSQL, strlen(insertSQL));</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int param_count= mysql_stmt_param_count(m_stInsertStmt);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(param_count != FEILD_NUM)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>填充bind结构数组, m_sInsertParam是这个statement关联的结构变量</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(insertbind, 0, sizeof(insertbind));</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[0].buffer_type = MYSQL_TYPE_STRING;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[0].buffer_length = ID_LENGTH /* -1 */;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[0].buffer = (char *)m_stInsertParam-&gt;sessionid;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[0].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[0].length = 0;</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[1].buffer_type = MYSQL_TYPE_STRING;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[1].buffer_length = ID_LENGTH /* -1 */;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[1].buffer = (char *)m_stInsertParam-&gt;channelid;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[1].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[1].length = 0;</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[2].buffer_type = MYSQL_TYPE_TINY;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[2].buffer = (char *)&amp;m_stInsertParam-&gt;ISPtype;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[2].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[2].length = 0;</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[3].buffer_type = MYSQL_TYPE_LONG;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[3].buffer = (char *)&amp;m_stInsertParam-&gt;externalIP;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[3].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[3].length = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[4].buffer_type = MYSQL_TYPE_SHORT;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[4].buffer = (char *)&amp;m_stInsertParam-&gt;externalPort;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[4].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[4].length = 0;</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[5].buffer_type = MYSQL_TYPE_LONG;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[5].buffer = (char *)&amp;m_stInsertParam-&gt;internalIP;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[5].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[5].length = 0;</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[6].buffer_type = MYSQL_TYPE_SHORT;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[6].buffer = (char *)&amp;m_stInsertParam-&gt;internalPort;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[6].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertbind[6].is_null = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>绑定</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mysql_stmt_bind_param(m_stInsertStmt, insertbind))</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span></div>
<div twffan="done">}</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//2.查询</div>
<div twffan="done">bool CDBManager::InsertHostCache2(MYSQL * connecthandle, char * sessionid, char * channelid, int ISPtype, \</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int eIP, unsigned short eport, unsigned int iIP, unsigned short iport)</span></div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>填充结构变量m_sInsertParam</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(m_stInsertParam-&gt;sessionid, sessionid);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(m_stInsertParam-&gt;channelid, channelid);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertParam-&gt;ISPtype = ISPtype;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertParam-&gt;externalIP = eIP;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertParam-&gt;externalPort = eport;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertParam-&gt;internalIP = iIP;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_stInsertParam-&gt;internalPort = iport;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>执行statement,性能瓶颈处</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mysql_stmt_execute(m_stInsertStmt))</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span></div>
<div twffan="done">}</div>
<div twffan="done">&nbsp;</div>
<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt" twffan="done"><span twffan="done">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>随机的获取记录</div>
<div style="TEXT-INDENT: 21pt" twffan="done">在某些数据库的应用中, 我们并不是要获取所有的满足条件的记录,而只是要随机挑选出满足条件的记录. 这种情况常见于数据业务的统计分析,从大容量数据库中获取小量的数据的场合.</div>
<div twffan="done">&nbsp;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span>有两种方法可以做到</div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt" twffan="done"><span twffan="done">1.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span>常规方法,首先查询出所有满足条件的记录,然后随机的挑选出部分记录.这种方法在满足条件的记录数很多时效果不理想.</div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt" twffan="done"><span twffan="done">2.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span>使用limit语法,先获取满足条件的记录条数, 然后在sql查询语句中加入limit来限制只查询满足要求的一段记录. 这种方法虽然要查询两次,但是在数据量大时反而比较高效.</div>
<div twffan="done">示例代码如下:</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//1.常规的方法</div>
<div twffan="done">//性能瓶颈,10万条记录时,执行查询140ms, 获取结果集500ms,其余可忽略</div>
<div twffan="done">int CDBManager::QueryHostCache(MYSQL* connecthandle, char * channelid, int ISPtype, CDBManager::CHostCacheTable * &amp;hostcache)</div>
<div twffan="done">{<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char selectSQL[SQL_LENGTH];</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(selectSQL, 0, sizeof(selectSQL));</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(selectSQL,"select * from HostCache where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0)&nbsp;&nbsp; //</span>检索</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>获取结果集</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pResultSet = mysql_store_result(connecthandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!m_pResultSet)&nbsp;&nbsp; //</span>获取结果集出错</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iAllNumRows = (int)(mysql_num_rows(m_pResultSet));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>所有的搜索结果数</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>计算待返回的结果数</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iReturnNumRows = (iAllNumRows &lt;= RETURN_QUERY_HOST_NUM)? iAllNumRows:RETURN_QUERY_HOST_NUM;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(iReturnNumRows &lt;= RETURN_QUERY_HOST_NUM)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>获取逐条记录</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i&lt;iReturnNumRows; i++)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>获取逐个字段</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_Row = mysql_fetch_row(m_pResultSet);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[0] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(hostcache[i].sessionid, m_Row[0]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[1] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(hostcache[i].channelid, m_Row[1]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[2] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].ISPtype&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;= atoi(m_Row[2]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[3] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].externalIP&nbsp;&nbsp; = atoi(m_Row[3]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[4] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].externalPort = atoi(m_Row[4]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[5] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].internalIP&nbsp;&nbsp; = atoi(m_Row[5]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[6] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].internalPort = atoi(m_Row[6]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>随机的挑选指定条记录返回</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iRemainder = iAllNumRows%iReturnNumRows;&nbsp;&nbsp;&nbsp; ///&lt;</span>余数</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iQuotient&nbsp;= iAllNumRows/iReturnNumRows;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>商</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iStartIndex = rand()%(iRemainder + 1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>开始下标<span twffan="done">&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>获取逐条记录</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int iSelectedIndex = 0; iSelectedIndex &lt; iReturnNumRows; iSelectedIndex++)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_data_seek(m_pResultSet, iStartIndex + iQuotient * iSelectedIndex);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_Row = mysql_fetch_row(m_pResultSet);</span></div>
<div twffan="done">&nbsp;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[0] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(hostcache[iSelectedIndex].sessionid, m_Row[0]);</span></div>
<div twffan="done">&nbsp;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if(m_Row[1] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(hostcache[iSelectedIndex].channelid, m_Row[1]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[2] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostcache[iSelectedIndex].ISPtype&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = atoi(m_Row[2]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if(m_Row[3] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;hostcache[iSelectedIndex].externalIP&nbsp;&nbsp; = atoi(m_Row[3]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m_Row[4] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostcache[iSelectedIndex].externalPort = atoi(m_Row[4]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_Row[5] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostcache[iSelectedIndex].internalIP&nbsp;&nbsp; = atoi(m_Row[5]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if(m_Row[6] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;hostcache[iSelectedIndex].internalPort = atoi(m_Row[6]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done">&nbsp;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>释放结果集内容</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_free_result(m_pResultSet);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return iReturnNumRows;</span></div>
<div twffan="done">}</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//2.使用limit版</div>
<div twffan="done">int CDBManager::QueryHostCache(MYSQL * connecthandle, char * channelid, unsigned int myexternalip, int ISPtype, CHostCacheTable * hostcache)</div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>首先获取满足结果的记录条数,再使用limit随机选择指定条记录返回</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL_ROW row;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL_RES * pResultSet;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char selectSQL[SQL_LENGTH];</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(selectSQL, 0, sizeof(selectSQL));</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(selectSQL,"select count(*) from HostCache where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0)&nbsp;&nbsp; //</span>检索</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pResultSet = mysql_store_result(connecthandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!pResultSet)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = mysql_fetch_row(pResultSet);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iAllNumRows = atoi(row[0]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_free_result(pResultSet);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>计算待取记录的上下范围</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iLimitLower = (iAllNumRows &lt;= RETURN_QUERY_HOST_NUM)?</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:(rand()%(iAllNumRows - RETURN_QUERY_HOST_NUM));</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iLimitUpper = (iAllNumRows &lt;= RETURN_QUERY_HOST_NUM)?</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iAllNumRows:(iLimitLower + RETURN_QUERY_HOST_NUM);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>计算待返回的结果数</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iReturnNumRows = (iAllNumRows &lt;= RETURN_QUERY_HOST_NUM)?</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;iAllNumRows:RETURN_QUERY_HOST_NUM;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>使用limit作查询</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(selectSQL,"select SessionID, ExternalIP, ExternalPort, InternalIP, InternalPort "</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "from HostCache where ChannelID = '%s' and ISPtype = %d limit %d, %d"</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , channelid, ISPtype, iLimitLower, iLimitUpper);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0)&nbsp;&nbsp; //</span>检索</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pResultSet = mysql_store_result(connecthandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!pResultSet)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>获取逐条记录</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i&lt;iReturnNumRows; i++)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>获取逐个字段</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = mysql_fetch_row(pResultSet);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(row[0] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(hostcache[i].sessionid, row[0]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(row[1] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].externalIP&nbsp;&nbsp; = atoi(row[1]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(row[2] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].externalPort = atoi(row[2]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(row[3] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].internalIP&nbsp;&nbsp; = atoi(row[3]);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(row[4] != NULL)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostcache[i].internalPort = atoi(row[4]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>释放结果集内容</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_free_result(pResultSet);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return iReturnNumRows;</span></div>
<div twffan="done">}</div>
<div twffan="done">&nbsp;</div>
<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt" twffan="done"><span twffan="done">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用连接池管理连接.</div>
<div style="MARGIN: 0cm 0cm 0pt 21pt" twffan="done">在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.</div>
<div twffan="done">一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.</div>
<div twffan="done">当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.</div>
<div style="TEXT-INDENT: 21pt" twffan="done">设计代码如下:</div>
<div style="TEXT-INDENT: 21pt" twffan="done">&nbsp;</div>
<div twffan="done">//定义句柄队列</div>
<div twffan="done">typedef std::list&lt;MYSQL *&gt; CONNECTION_HANDLE_LIST;</div>
<div twffan="done">typedef std::list&lt;MYSQL *&gt;::iterator&nbsp;CONNECTION_HANDLE_LIST_IT;</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//连接数据库的参数结构</div>
<div twffan="done">class CDBParameter<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done">{</div>
<div twffan="done">public:</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *host;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>主机名</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *user;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>用户名</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *password;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>密码</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *database;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>数据库名</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int port;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>端口，一般为0</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *unix_socket;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>套接字，一般为NULL</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int client_flag;&nbsp;///&lt;</span>一般为0</div>
<div twffan="done">};</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//创建两个队列</div>
<div twffan="done">CONNECTION_HANDLE_LIST m_lsBusyList;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>正在使用的连接句柄</div>
<div twffan="done">CONNECTION_HANDLE_LIST m_lsIdleList;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;</span>未使用的连接句柄</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//所有的连接句柄先连上数据库,加入到空闲队列中,等待使用.</div>
<div twffan="done">bool CDBManager::Connect(char * host /* = "localhost" */, char * user /* = "chenmin" */,&nbsp;\</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;char * password /* = "chenmin" */, char * database /* = "HostCache" */)</span></div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDBParameter * lpDBParam = new CDBParameter();</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;host = host;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;user = user;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;password = password;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;database = database;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;port = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;unix_socket = NULL;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;client_flag = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>连接</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int index = 0; index &lt; CONNECTION_NUM; index++)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL * pConnectHandle = mysql_init((MYSQL*) 0);&nbsp;&nbsp;&nbsp;&nbsp; //</span>初始化连接句柄</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!mysql_real_connect(pConnectHandle, lpDBParam-&gt;host, lpDBParam-&gt;user, lpDBParam-&gt;password,\</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDBParam-&gt;database,lpDBParam-&gt;port,lpDBParam-&gt;unix_socket,lpDBParam-&gt;client_fla))</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 21pt" twffan="done">//加入到空闲队列中</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_lsIdleList.push_back(pConnectHandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(...)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span></div>
<div twffan="done">}</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//提取一个空闲句柄供使用</div>
<div twffan="done">MYSQL * CDBManager::GetIdleConnectHandle()</div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL * pConnectHandle = NULL;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_ListMutex.acquire();</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_lsIdleList.size())</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pConnectHandle = m_lsIdleList.front();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_lsIdleList.pop_front();</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_lsBusyList.push_back(pConnectHandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;//</span>特殊情况,闲队列中为空,返回为空</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pConnectHandle = 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_ListMutex.release();</span></div>
<div twffan="done">&nbsp;</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pConnectHandle;</span></div>
<div twffan="done">}</div>
<div twffan="done">&nbsp;</div>
<div twffan="done">//从使用队列中释放一个使用完毕的句柄,插入到空闲队列</div>
<div twffan="done">void CDBManager::SetIdleConnectHandle(MYSQL * connecthandle)</div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_ListMutex.acquire();</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_lsBusyList.remove(connecthandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_lsIdleList.push_back(connecthandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_ListMutex.release();</span></div>
<div twffan="done">}</div>
<div twffan="done">//使用示例,首先获取空闲句柄,利用这个句柄做真正的操作,然后再插回到空闲队列</div>
<div twffan="done">bool CDBManager::DeleteHostCacheBySessionID(char * sessionid)</div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYSQL * pConnectHandle = GetIdleConnectHandle();</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!pConnectHandle)</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool bRet = DeleteHostCacheBySessionID(pConnectHandle, sessionid);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetIdleConnectHandle(pConnectHandle);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bRet;</span></div>
<div twffan="done">}</div>
<div twffan="done">//传入空闲的句柄,做真正的删除操作</div>
<div twffan="done">bool CDBManager::DeleteHostCacheBySessionID(MYSQL * connecthandle, char * sessionid)</div>
<div twffan="done">{</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char deleteSQL[SQL_LENGTH];</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(deleteSQL, 0, sizeof(deleteSQL));</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(deleteSQL,"delete from HostCache where SessionID = '%s'", sessionid);</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mysql_query(connecthandle,deleteSQL) != 0)&nbsp;//</span>删除</div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</span></div>
<div twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span></div>
<div twffan="done">}</div>
<!-- 翻页 -->
<img src ="http://www.phpweblog.net/wgxjava/aggbug/2664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-01-08 10:34 <a href="http://www.phpweblog.net/wgxjava/archive/2008/01/08/2664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php 性能解决方案-----Cache </title><link>http://www.phpweblog.net/wgxjava/archive/2008/01/07/2654.html</link><dc:creator>php一道</dc:creator><author>php一道</author><pubDate>Mon, 07 Jan 2008 01:44:00 GMT</pubDate><guid>http://www.phpweblog.net/wgxjava/archive/2008/01/07/2654.html</guid><wfw:comment>http://www.phpweblog.net/wgxjava/comments/2654.html</wfw:comment><comments>http://www.phpweblog.net/wgxjava/archive/2008/01/07/2654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/wgxjava/comments/commentRss/2654.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/wgxjava/services/trackbacks/2654.html</trackback:ping><description><![CDATA[<p>大规模的系统开发中，Cache无疑是至关重要的，php世界里，虽然不如java当中，有那么丰富的cache解决方案可以选择，但是，仍然有一些成熟的方案，从《advanced PHP programming》中我就学到了如下一些：</p>
<p>1、语言层面的优化：php具有不少引擎(engine)层面的api，通过这些api，可以改变引擎执行的行为，从而达到优化运行的目的。其中，最值得去做的就是对编译结果cache。众所周知，php每次执行都需要经历源代码&#8211;〉编译&#8211;〉中间代码&#8211;〉引擎执行 这样的过程，对于一些大型应用，相当多的时间花费在无益的编译上了（不仅仅是访问页面的php文件需要经过编译环节，当脚本中利用require(),include()包含的一些文件都需要经过编译）。通过对编译结果的cache，能够极大地提高系统的性能（和系统复杂性、规模成正比） 。</p>
<p>php世界中三个主流的能够实现编译cache的工具是：</p>
<p>The Zend Accelerator—A commercial, closed-source, for-cost compiler cache produced by Zend Industries <br>The ionCube Accelerator—A commercial, closed-source, but free compiler cache written by Nick Lindridge and distributed by his company, ionCube <br>APC—A free and open-source compiler cache written by Daniel Cowgill and George Schlossnagle <br>APC的安装方法，APC包含在PECL中，具体安装如下 <a href="http://www.pass4sure.com/190-823.html">190-823</a>&nbsp; <a href="http://www.pass4sure.com/190-802.html">190-802</a>&nbsp;：</p>
<p>运行命令</p>
<p>#pear install apc</p>
<p>之后，在php.ini文件中添加：</p>
<p>extension = /path/to/apc.so</p>
<p>这样，就完成了安装，当下次运行php，APC就会自动激活，将编译结果放入共享内存中cache起来，下次再执行的时候就直接从内存中获取编辑结果执行，不需要再次编译。</p>
<p>疑问：对于自上次编译后变动了的php，APC是否能够自动重新编译？</p>
<p>2、php代码优化：利用一些工具能够市的编译后产生优质中间代码，具体如下：</p>
<p>The Zend Optimizer is a closed-source but freely available optimizer. <br>The ionCube accelerator contains an integrated optimizer. <br>proof-of-concept optimizer in PEAR. <br>优化器主要的功能：</p>
<p>1、清除无用的代码，例如永远也不会执行的死代码。</p>
<p>2、常量的计算，例如将$seconds_in_day = 24*60*60直接变为$seconds_in_day = 86400; </p>
<p>3、其它代码优化功能，例如有这么一个语句：</p>
<p>&nbsp;&nbsp;&nbsp; $count++;</p>
<p>&nbsp;&nbsp;&nbsp; 会优化为++$count，使得执行速度更快。 当然，如果语句是$i = $count++；则不会进行优化</p>
<img src ="http://www.phpweblog.net/wgxjava/aggbug/2654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/wgxjava/" target="_blank">php一道</a> 2008-01-07 09:44 <a href="http://www.phpweblog.net/wgxjava/archive/2008/01/07/2654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>