﻿<?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>BlogJava-jacky-文章分类-PHP</title><link>http://www.blogjava.net/jackywjj/category/2056.html</link><description>To follow the path:
look to the master,
follow the master,
walk with the master,
see through the master,
become the master.</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:39:02 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:39:02 GMT</pubDate><ttl>60</ttl><item><title>Eclipse支持PHP自动提示</title><link>http://www.blogjava.net/jackywjj/articles/68749.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Sat, 09 Sep 2006 12:10:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/68749.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/68749.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/68749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/68749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/68749.html</trackback:ping><description><![CDATA[
		<p>其实如果你已经安装好了php环境(安装过程见)的话，只需要下面2步就可以了。hoho，很简单的。</p>
		<p>1,下载eclipse中php的插件<br />地址：<a href="http://www.phpeclipse.de/tiki-view_articles.php">http://www.phpeclipse.de/tiki-view_articles.php</a><br /><a href="http://prdownloads.sourceforge.net/phpeclipse/PHPEclipse1.1.3-2005-01-29.zip?use_mirror=jaist">http://prdownloads.sourceforge.net/phpeclipse/PHPEclipse1.1.3-2005-01-29.zip?use_mirror=jaist</a></p>
		<p>2,解压缩。plugins文件夹下内容copy至eclipse\plugins文件夹下，features文件夹下内容copy至eclipse\features文件夹下。</p>
		<p>使用Eclipse环境来编写PHP程序，以下是详细说明。有基础的朋友可以不看。</p>
		<p>简单介绍：<br />Eclipse，著名开源软件，IDE，广泛用于Java开发等。<br />加上相应插件后，可支持大部分编程语言。</p>
		<p>使用前提：<br />已正确搭建安装了AMP（A=Apache, M=Mysql, P=PHP）环境，操作系统平台不限</p>
		<p>下载：<br />Eclipse3.0.1: <a href="http://www.eclipse.org/downloads/index.php">http://www.eclipse.org/downloads/index.php</a><br />(选择适合你系统的相应版本，支持windows,linux,max等，建议选择最新版本3.0.1)</p>
		<p>PHPeclipse插件： <a href="http://sourceforge.net/project/">http://sourceforge.net/project/</a> showfiles.php?group_id=57621<br />(同上，最新版本1.1.2)</p>
		<p>安装：<br />均为绿色软件，无须安装 <br />将下载回来的Eclipse压缩包解开，放到常用安装软件文件夹即可（请勿急着马上启动Eclipse）<br />将PHPeclipse插件（下载的压缩包内有features及plugins两个文件夹，跟Eclipse目录下的一样，应该是对应的）解压到Eclipse相应目录下即可<br />注意：<br />如果已经事先安装过Eclipse或者在未解压插件之前已经启动过，因为它第一次启动会扫描全部xml文件并缓存以加快启动速度，所以PHP插件不会被马上识别。需要用选项-clean来强行启动一次。（win下直接cmd到Eclipse目录再Eclipse.exe –clean即可，其他平台类似）</p>
		<p>配置：<br />1、Eclipse启动比较慢，在硬件配置比较好的机器上也需要好几秒钟，请耐心等待。首次启动会让你选择工作目录(workspace)，制定后打个勾下次就不会再问。<br />2、另外指定一个用来放置PHP项目的目录，如果不指定默认就在workspace的子目录下，最好事先想好名字，比如我的：workspace/phpeclipse<br />3、修改httpd.conf文件，新建一个指向workspace/phpeclipse的别名(Alias)---PHP安装的问题，恕不多述。我这里还是叫phpeclipse。当然如果你把PHP项目放在DocumentRoot下的话这步就可以省略了。<br />4、本次启动后会发现菜单和工具栏上多了一些东西（如果你之前用过Eclipse的话，呵呵）<br />到Window - Preferences – PHPeclipse Web Development – PHP中指定一下你的PHP环境中Apache,php,mysql三个执行文件的相应位置，至于参数似乎默认的就可以了，我用的是Apache2，修改了一下，启动用：-w -n "Apache2" -k start ；停止用：-w -n "Apache2" -k stop；重启用-w -n "Apache2" -k restart<br />这样工具栏上的那几个apache和mysql的按钮就可以用了。</p>
		<p>使用：<br />菜单－&gt;new－&gt;Project－&gt;PHP－&gt;PHP Project，指定一个名字，然后就可以用了，不过要注意跟前面的别名部分对应，否则无法访问<br />在Navigator栏的项目名称上右击，new一个php file,然后保存，Eclipse就自动打开web browser显示结果了。相当不错。主要是看中它集成开发的方便性，代码块伸缩，自动完成等众多特性。</p>
		<p>关于在Eclipse中加入PHP插件的更详细内容可以参考这篇文章（英文）：<br /><a href="http://www.phpbuilder.com/columns/c...921.php3?page=1">http://www.phpbuilder.com/columns/c...921.php3?page=1</a><br />PHPeclipse插件的主页在 <a href="http://phpeclipse.de/">http://phpeclipse.de/</a> ，安装中如果有问题或者需要更详细的文档可以到上面去找寻。</p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/68749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-09 20:10 <a href="http://www.blogjava.net/jackywjj/articles/68749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php手机信息类</title><link>http://www.blogjava.net/jackywjj/articles/68031.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 06 Sep 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/68031.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/68031.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/68031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/68031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/68031.html</trackback:ping><description><![CDATA[
		<p>&lt;?php<br />/**<br />* 类名: mobile<br />* 描述: 手机信息类<br />* 其他: 偶然 编写<br />*/</p>
		<p>class mobile{<br /> /**<br /> * 函数名称: getPhoneNumber<br /> * 函数功能: 取手机号<br /> * 输入参数: none<br /> * 函数返回值: 成功返回号码，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function getPhoneNumber(){<br />  if (isset($_SERVER['HTTP_X_NETWORK_INFO'])){<br />   $str1 = $_SERVER['HTTP_X_NETWORK_INFO'];<br />   $getstr1 = preg_replace('/(.*,)(11[d])(,.*)/i','\2',$str1);<br />   Return $getstr1;<br />  }elseif (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])){<br />   $getstr2 = $_SERVER['HTTP_X_UP_CALLING_LINE_ID'];<br />   Return $getstr2;<br />  }elseif (isset($_SERVER['HTTP_X_UP_SUBNO'])){<br />   $str3 = $_SERVER['HTTP_X_UP_SUBNO'];<br />   $getstr3 = preg_replace('/(.*)(11[d])(.*)/i','\2',$str3);<br />   Return $getstr3;<br />  }elseif (isset($_SERVER['DEVICEID'])){<br />   Return $_SERVER['DEVICEID'];<br />  }else{<br />   Return false;<br />  }<br /> }</p>
		<p> /**<br /> * 函数名称: getHttpHeader<br /> * 函数功能: 取头信息<br /> * 输入参数: none<br /> * 函数返回值: 成功返回号码，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function getHttpHeader(){<br />  $str = '';<br />  foreach ($_SERVER as $key=&gt;$val){<br />   $gstr = str_replace("&amp;","&amp;",$val);<br />   $str.= "$key -&gt; ".$gstr."\r\n";<br />  }<br />  Return $str;<br /> }</p>
		<p> /**<br /> * 函数名称: getUA<br /> * 函数功能: 取UA<br /> * 输入参数: none<br /> * 函数返回值: 成功返回号码，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function getUA(){<br />  if (isset($_SERVER['HTTP_USER_AGENT'])){<br />   Return $_SERVER['HTTP_USER_AGENT'];<br />  }else{<br />   Return false;<br />  }<br /> }</p>
		<p> /**<br /> * 函数名称: getPhoneType<br /> * 函数功能: 取得手机类型<br /> * 输入参数: none<br /> * 函数返回值: 成功返回string，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function getPhoneType(){<br />  $ua = $this-&gt;getUA();<br />  if($ua!=false){<br />   $str = explode(' ',$ua);<br />   Return $str[0];<br />  }else{<br />   Return false;<br />  }<br /> }</p>
		<p> /**<br /> * 函数名称: isOpera<br /> * 函数功能: 判断是否是opera<br /> * 输入参数: none<br /> * 函数返回值: 成功返回string，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function isOpera(){<br />  $uainfo = $this-&gt;getUA();<br />  if (preg_match('/.*Opera.*/i',$uainfo)){<br />   Return true;<br />  }else{<br />   Return false;<br />  }<br /> }</p>
		<p> /**<br /> * 函数名称: isM3gate<br /> * 函数功能: 判断是否是m3gate<br /> * 输入参数: none<br /> * 函数返回值: 成功返回string，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function isM3gate(){<br />  $uainfo = $this-&gt;getUA();<br />  if (preg_match('/M3Gate/i',$uainfo)){<br />   Return true;<br />  }else{<br />   Return false;<br />  }<br /> }</p>
		<p> /**<br /> * 函数名称: getHttpAccept<br /> * 函数功能: 取得HA<br /> * 输入参数: none<br /> * 函数返回值: 成功返回string，失败返回false<br /> * 其它说明: 说明<br /> */<br /> function getHttpAccept(){<br />  if (isset($_SERVER['HTTP_ACCEPT'])){<br />   Return $_SERVER['HTTP_ACCEPT'];<br />  }else{<br />   Return false;<br />  }<br /> }</p>
		<p> /**<br /> * 函数名称: getIP<br /> * 函数功能: 取得手机IP<br /> * 输入参数: none<br /> * 函数返回值: 成功返回string<br /> * 其它说明: 说明<br /> */<br /> function getIP(){<br />  $ip=getenv('REMOTE_ADDR');<br />  $ip_ = getenv('HTTP_X_FORWARDED_FOR');<br />  if (($ip_ != "") &amp;&amp; ($ip_ != "unknown")){<br />   $ip=$ip_;<br />  }<br />  return $ip;<br /> }<br />}<br />?&gt;<br /></p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/68031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-06 14:53 <a href="http://www.blogjava.net/jackywjj/articles/68031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的基本语法</title><link>http://www.blogjava.net/jackywjj/articles/67943.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 06 Sep 2006 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/67943.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/67943.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/67943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/67943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/67943.html</trackback:ping><description><![CDATA[
		<p>
				<br />首先让我们看两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束。例子如 <br />下： </p>
		<p>"^The"：表示所有以"The"开始的字符串（"There"，"The cat"等）； <br />"of despair$"：表示所以以"of despair"结尾的字符串； <br />"^abc$"：表示开始和结尾都是"abc"的字符串——呵呵，只有"abc"自己了； <br />"notice"：表示任何包含"notice"的字符串。 </p>
		<p>象最后那个例子，如果你不使用两个特殊字符，你就在表示要查找的串在被查找串的任意部分——你 <br />并 <br />不把它定位在某一个顶端。 </p>
		<p>其它还有'*'，'+'和'?'这三个符号，表示一个或一序列字符重复出现的次数。它们分别表示“没有 <br />或 <br />更多”，“一次或更多”还有“没有或一次”。下面是几个例子： </p>
		<p>"ab*"：表示一个字符串有一个a后面跟着零个或若干个b。（"a", "ab", "abbb",……）； <br />"ab+"：表示一个字符串有一个a后面跟着至少一个b或者更多； <br />"ab?"：表示一个字符串有一个a后面跟着零个或者一个b； <br />"a?b+$"：表示在字符串的末尾有零个或一个a跟着一个或几个b。 </p>
		<p>你也可以使用范围，用大括号括起，用以表示重复次数的范围。 </p>
		<p>"ab{2}"：表示一个字符串有一个a跟着2个b（"abb"）； <br />"ab{2,}"：表示一个字符串有一个a跟着至少2个b； <br />"ab{3,5}"：表示一个字符串有一个a跟着3到5个b。 </p>
		<p>请注意，你必须指定范围的下限（如："{0,2}"而不是"{,2}"）。还有，你可能注意到 <br />了，'*'，'+'和 <br />'?'相当于"{0,}"，"{1,}"和"{0,1}"。 <br />还有一个'&amp;brvbar;'，表示“或”操作： </p>
		<p>"hi&amp;brvbar;hello"：表示一个字符串里有"hi"或者"hello"； <br />"(b&amp;brvbar;cd)ef"：表示"bef"或"cdef"； <br />"(a&amp;brvbar;b)*c"：表示一串"a""b"混合的字符串后面跟一个"c"； </p>
		<p>'.'可以替代任何字符： </p>
		<p>"a.[0-9]"：表示一个字符串有一个"a"后面跟着一个任意字符和一个数字； <br />"^.{3}$"：表示有任意三个字符的字符串（长度为3个字符）； </p>
		<p>方括号表示某些字符允许在一个字符串中的某一特定位置出现： </p>
		<p>"[ab]"：表示一个字符串有一个"a"或"b"（相当于"a&amp;brvbar;b"）； <br />"[a-d]"：表示一个字符串包含小写的'a'到'd'中的一个（相当于"a&amp;brvbar;b&amp;brvbar;c&amp;brvbar;d"或 <br />者"[abcd]"）； <br />"^[a-zA-Z]"：表示一个以字母开头的字符串； <br />"[0-9]%"：表示一个百分号前有一位的数字； <br />",[a-zA-Z0-9]$"：表示一个字符串以一个逗号后面跟着一个字母或数字结束。 </p>
		<p>你也可以在方括号里用'^'表示不希望出现的字符，'^'应在方括号里的第一位。（如："%[^a-zA- <br />Z]%"表 <br />示两个百分号中不应该出现字母）。 </p>
		<p>为了逐字表达，你必须在"^.$()&amp;brvbar;*+?{\"这些字符前加上转移字符'\'。 </p>
		<p>请注意在方括号中，不需要转义字符。 <br /></p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/67943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-06 09:01 <a href="http://www.blogjava.net/jackywjj/articles/67943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP中的类</title><link>http://www.blogjava.net/jackywjj/articles/67940.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 06 Sep 2006 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/67940.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/67940.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/67940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/67940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/67940.html</trackback:ping><description><![CDATA[
		<p>
				<br />类说穿了就是一些变量(OOP概念中的成员变量，译者注)和一些操作处理这些变量的函数(OOP概念中的成员函数)的集 <br />合。它提供了一种在程序中以现实生活的形态来思考问题的方法，换句话说，就是描述了一个对象。反之，一个对象或 <br />者实例，就是这个类的真正实现。比如说我们要描述一辆自行车：一个合适的自行车类应该含有如下变量：$pedals(脚 <br />蹬)，$chain(链条),$front wheel(前轮),$rear wheel（后轮）,$brakes(刹车), and $handl_bars(车把)。你可以参考 <br />现实生活中对一辆自行车的操作来实现你的脚本。比如可以通过向函数Accelerate()传递一个$Braking_Force，并将这 <br />个变量应用于你所定义的实例的其他变量如$front_wheel, $rear_wheel，也可以返回操作的结果，从而实现相应的操 <br />作。 </p>
		<p>看起来很美，但是这些通过常规的函数和变量不是也能够实现吗？不错，如果你的程序中只有一个自行车的实例，为它 <br />单独定义一个类的确意思不大，但是如果你需要很多自行车实例的时候呢？但是你程序中的变量传递流会变得相当复 <br />杂，你得时时保证每个自行车实例指定的变量都正确的传递给了不同的函数。但是使用对象大大降低了你所传递的变量 <br />的数量，因为对象中的处理函数(所谓的方法method,译者著。)自动的认定作用范围就限制在本对象之内，那么它所能够 <br />操作的对象也就限制在了对象范围内。而且对象的定义可以非常容易的包含到不同的脚本只用，（在得到可重用性的同 <br />时）还从而保证了每一个自行车的在不同的脚本中工作方式都是一致的。 </p>
		<p>让我们来创建一个实际的类，这个类我几乎用在了我站点的每一个页面中，也许你会从中发现值得参考的东西。 </p>
		<p>我不知道你是什么情况，但是对我来说，当我写一个动态Web页面的时候，我最痛恨的就是时不时要中断对程序流程的思 <br />考，转而思考HTML的合适的表现格式。这样做的结果就是使我最终作出来的页面缺少吸引力，因为我没有那么多的精力 <br />去顾及字体、字号、背景、以及文字的颜色。解决方法就是：通过PHP类来实现对文本的格式化，从而实现HTML的输出属 <br />性定制。 </p>
		<p>
				<br />我把这个类命名为“Style”。其中包含了如下一些对于设置HTML属性至关重要成员变量： </p>
		<p>&lt;?php </p>
		<p>class Style { </p>
		<p>var $text; <br />var $alink; <br />var $vlink; <br />var $link; <br />var $bgcol; <br />var $face; <br />var $size; <br />var $align; <br />var $valign; </p>
		<p>} </p>
		<p>?&gt; </p>
		<p>我想你已经对于HTML语法相当熟悉了，以上的变量名就是他们在HTML语法中的名字。接下来我为类Style创建一个名称为 <br />Style的成员函数。 </p>
		<p>&lt;?php </p>
		<p>class Style { </p>
		<p>function Style <br />($text= "#000000",$alink= "#AA00AA",$vlink= "#AA00AA",$link= "#3333FF",$bgcol= "#999999",$face= "Book <br />Antiqua",$size=3,$align= "CENTER",$valign= "TOP") { </p>
		<p>$this-&gt;text=$text; <br />$this-&gt;alink=$alink; <br />$this-&gt;vlink=$vlink; <br />$this-&gt;link=$link; <br />$this-&gt;bgcol=$bgcol; <br />$this-&gt;face=$face; <br />$this-&gt;size=$size; <br />$this-&gt;align=$align; <br />$this-&gt;valign=$valign; </p>
		<p>} </p>
		<p>} <br />?&gt; </p>
		<p>当你在类中创建一个与类同名的成员函数时，这个函数会在你每次创建一个类的实例的时候被执行，该函数称为构造函 <br />数。我利用这个机制，来使实现在每次创建一个对象的时候，自动的为每个HTML属性变量赋予一个缺省值。 </p>
		<p>&lt;?php $Basic = new Style; ?&gt; </p>
		<p>上面的语法"=new ClassName;”就是为类Style声明了一个实例$Basic。 </p>
		<p>你可以在声明一个类的实例的同时，通过传递参数的形式为类中的某个变量指定不同的值。但是即使你声明只修改其中 <br />一个变量，也得通知指定其他成员变量的值。从这一点来说，类和常规函数是相同的。比如说你要为Style类中的text变 <br />量指定一个缺省值以外的值，其他的变量你也要指定一遍。不过这还有更简单的方法(实际上这就是通常使用的方法，没 <br />有什么新鲜的—译者注)，就是通过在类中加一个成员函数来改变其中类中某个变量的值： </p>
		<p>&lt;?php </p>
		<p>Function Set($varname,$value) { </p>
		<p>$this-&gt;$varname=$value; </p>
		<p>} </p>
		<p>?&gt; </p>
		<p>然后，我们通过如下的代码就可实现对一个对象实例中指定变量值的修改。 </p>
		<p>&lt;?php $Basic-&gt;Set( "size", "2"); ?&gt; </p>
		<p>你必须使用”-&gt;”操作符以声明是一个对象的变量或函数。上面的代码就是告诉代码解释器”运行$Basic中的Set()成员 <br />函数”。解释器就会知道，$Basic就是类Style的一个实例，因为我们此前已经声明过了。同样我们可以通过如下代码引 <br />用一个实例的变量(如：$Basic-&gt;text) </p>
		<p>让我们创建一个表头样式对象，其属性与缺省值有些不同。 </p>
		<p>&lt;?php </p>
		<p>$Theader= new Style; <br />$Theader-&gt;Set( "text", "#0000FF"); <br />$Theader-&gt;Set( "bgcol", "#000000"); </p>
		<p>?&gt; </p>
		<p>到在这里，够好了吧？现在我的表格头有了蓝色的文字和黑色的北京。我还想要我的表体相对于我的主页而言有些轻 <br />灰，文字用黑色的，而表体中的文字要小一些，于是我可以： </p>
		<p>&lt;?php </p>
		<p>$Tbody=new Style; <br />$Tbody-&gt;Set( "bgcol", "#AAAAAA"); <br />$Tbody-&gt;Set( "size",2); </p>
		<p>?&gt; </p>
		<p>相当不错，现在我们还能够用他来作什么呢？问得好！我很高兴你会问这个问题。我们需要在类中再创建几个成员函数 <br />来是Style可以用到任何HTML页面对象中。首先我要做的就是，为我的页面设置属性，于是： </p>
		<p>&lt;?php </p>
		<p>function Body() { </p>
		<p>PRINT "&lt;BODY BGCOLOR="$this-&gt;bgcol" ". <br />"TEXT="$this-&gt;text" ". <br />"LINK="$this-&gt;link" VLINK="$this-&gt;vlink" ". <br />"ALINK="$this-&gt;alink"&gt; "; </p>
		<p>} </p>
		<p>?&gt; </p>
		<p>上述代码，为我站点中的所有页面设置了整体风格。其中还设计到了一个变量”$this”。我们在类中只用这个变量，解 <br />释器会自动将其理解为我们在引用当前对象本身的一个成员变量。换句话说，$this变量在应用中与对象名称(如本例中 <br />的$Basic)是等义的。你应该注意到我们在此所做的的确要比用常规函数来实现来得简单。我们可以不用向函数传递变量 <br />而在函数中引用这个变量。而通常，常规函数是通过几个全程变量数组才能够实现这种机制的。不过需要声明的是，所 <br />有对象的变量和成员函数的作用域都是在本对象范围以内的。 </p>
		<p>试验以下下面的PHP代码（假设你已经包含了Style类，并为其创建了一个实例$Basic，然后页面中已经有了 和 <br />&lt;HEAD&gt;&lt;/HEAD&gt; 标签） </p>
		<p>&lt;?php $Basic-&gt;Body(); ?&gt; </p>
		<p>这样我们就可以输出一些东西到页面中了，我们可以采用传统的方法，但我想做点不同的….（这个作者故弄玄虚，幽默 <br />过头了—译者注）这就是我用的另外一个成员函数TextOut： </p>
		<p>&lt;?php </p>
		<p>function TextOut($message= " ") { </p>
		<p>PRINT " "text"&gt;$message "; </p>
		<p>} </p>
		<p>?&gt; </p>
		<p>这个函数需要一个参数$message，$message是你要输出的文字，该函数会以指定的属性输出这些文字。我们可以通过如 <br />下方法实现： </p>
		<p>&lt;?php </p>
		<p>$Basic-&gt;TextOut( "This is my test message"); <br />$Tbody-&gt;TextOut( " -- kinda neat, huh?"); </p>
		<p>?&gt; </p>
		<p>注意，由于这两个函数中间没有输出回车换行，所以结果将输出到同一行上。而我还想要第二部分的字体更小一 <br />点，这个我在上面的$Tbody对象中已经声明了，这样比较安全，$Tbody与$Basic唯一的不同还有个$bgcol属性，在这里 <br />没有用到。注意到了程序声明中的” ”吗？这是用来在没有参数传递给函数时函数，函数就输出缺省的不间断空格，原 <br />因后述。 </p>
		<p>到目前为止，我们的工作还没有保存。最后的一个例子说明如何通过一种简单的方法，来修改字体的颜色和或大小，即 <br />使在一个输出语法的中间，也不需要改动整个类。我们加入如下的代码： </p>
		<p>&lt;?php </p>
		<p>function TDOut ($message= " ",$colspan=1) { </p>
		<p>PRINT "&lt;TD COLSPAN=$colspan BGCOLOR="$this-&gt;bgcol" ". <br />"ALIGN="$this-&gt;align" VALIGN="$this-&gt;valign"&gt;"; <br />$this-&gt;TextOut($message); <br />PRINT "&lt;/TD&gt; <br />"; </p>
		<p>} </p>
		<p>?&gt; </p>
		<p>那么，讲解就到此为止！记住我想让我的表格有不同的背景颜色，我可以这样实现： </p>
		<p>&lt;TABLE&gt; <br />&lt;TR&gt; <br />&lt;?php </p>
		<p>$Theader-&gt;TDOut( "Name",2); <br />$Theader-&gt;TDOut( "Location",3); </p>
		<p>?&gt; <br />&lt;/TR&gt; <br />&lt;TR&gt; <br />&lt;?php </p>
		<p>$Theader-&gt;TDOut( "Last"); <br />$Theader-&gt;TDOut( "First"); <br />$Theader-&gt;TDOut( "City"); <br />$Theader-&gt;TDOut( "State/Province"); <br />$Theader-&gt;TDOut( "Country"); </p>
		<p>?&gt; <br />&lt;/TR&gt; </p>
		<p>这里，你可以看到colspan参数是如何起作用的，如果没有声明，将会有个缺省值1。于是在第一个行“Name”中，合并 <br />了2列；Location行合并了3列。第二行，所有的列都被合并成了一个。 </p>
		<p>我们通过如下方式来实现表体： </p>
		<p>&lt;TR&gt; <br />&lt;?php </p>
		<p>$Tbody-&gt;TDOut( "Kreisler"); <br />$Tbody-&gt;TDOut( "Rod"); <br />$Tbody-&gt;TDOut( "Cortlandt"); <br />$Tbody-&gt;TDOut( "New York"); <br />$Tbody-&gt;TDOut( "USA"); <br />?&gt; <br />&lt;/TR&gt; </p>
		<p>但看起来似乎仍然有些繁琐，我们是否可以节省更多的步骤？那么采用下面的函数： </p>
		<p>&lt;?php </p>
		<p>function TROut($message) { /*And NO comments about fish, please! ;) */ </p>
		<p>PRINT "&lt;TR&gt; <br />"; <br />$cells=explode( "|",$message); <br />$iterations=count($cells); <br />$i=0; <br />while ($i&lt;$iterations) { <br />list($message,$span)=explode( ":",$cells[$i]); <br />if (strlen($message)&lt;1) $message= " "; <br />if ($span){ <br />$this-&gt;TDOut ($message,$span); <br />}else{ <br />$this-&gt;TDOut ($message); <br />} <br />$i++; <br />} <br />PRINT "&lt;/TR&gt; <br />"; </p>
		<p>} </p>
		<p>?&gt; </p>
		<p>WOW！看起来有些繁琐，我们来分解一下： </p>
		<p>第3行根据”|”符号分解一个字符串，并且将分解出来的每个元素都放到数组$cell中。第四行取得数组的中数组元素的 <br />个数到$iterations；第6行开始一个循环处理数组中的每个元素。第7行以”:”作为分隔符分解一个数组元素，将其存 <br />储到$message和$span中。第8行检查$message是否有值。如果没有就赋一个缺省值。第九行检查有没有$span（就是合并 <br />不合并单元格，通过$cell数据中冒号后还有$span来要确定），如果是这样，第10行调用TDOut函数，传递$message和单 <br />元格个数参数；如果没有第12行程序单纯输出$message信息（TDOut函数就用缺省值1来设置$colspan属性）。最后，我 <br />们结束一个表格行(通过&lt;/tr&gt;)。 </p>
		<p>或许你看了还有些糊涂(不糊涂才怪)，到底如何传递给TROut参数才能包括所有的必要信息？正确地格式就是：celldata <br />[:colspan]|celldata[:colspan]|......celldata[:colspan]（用|分隔单元格，单元格中数据后跟：号分隔的合并单元 <br />格的数目来指定要扩展本单元格的个数—译者注。） </p>
		<p>所以，总结一下我们以前所作的工作，表头和表体可以通过下面的调用来完成： </p>
		<p>&lt;TABLE&gt; <br />&lt;? <br />$Theader-&gt;TROut( "Name:2|Address:3"); <br />$Theader-&gt;TROut( "First|Last|City|State/Province|Country"); <br />$Tbody-&gt;TROut( "Rod|Kreisler|Cortlandt|New York|USA"); <br />?&gt; <br />&lt;/TABLE&gt; </p>
		<p>Wow!是不是非常的简单？(实际上的确非常简单，但是这个作者写的还不足以让人认识到这一点。也就是说给的例子缺乏 <br />说服力，我个人就觉得依靠TROut这行代码，输出一个行还不如样式表来得简单。作者起码用一个BBS的例子来说明OOP在 <br />PHP中的用处才有意义。当然了，作为PHP中OOP的入门课程，本文也算生动了，而且各个方面讲得也差不多。)。 </p>
		<p>如果有单元格中的数据存放在变量中的情况怎么办？只要Join数组就可以了： </p>
		<p>&lt;?php </p>
		<p>$message=join($arry, "|"); <br />$Tbody-&gt;TROut($message); </p>
		<p>?&gt; </p>
		<p>当然，你不能在一个Join中同时输入列扩展的单元格数，但是你可以再用一个。假设你的数组包含6个元素，第3和第4行 <br />分别要扩展2个和3个单元格，你可以通过如下代码实现将:#扩展格数参数指定到$message中 </p>
		<p>$newarray=$arry; <br />$newarray[2]=join(list($newarray[2],"2"),":"); <br />$newarray[4]=join(list($newarray[4],"3"),":"); <br />$message=join($newarray,"|"); <br />$Tbody-&gt;TROut($message); </p>
		<p>显然，你可以加入更多的成员函数。如果有人有更好的想法，可以Email给我，我会封装更多的代码并发表出来。 </p>
		<p> </p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/67940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-06 09:00 <a href="http://www.blogjava.net/jackywjj/articles/67940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用PHP将mysql数据表转换为excel文件格式</title><link>http://www.blogjava.net/jackywjj/articles/67941.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 06 Sep 2006 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/67941.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/67941.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/67941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/67941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/67941.html</trackback:ping><description><![CDATA[&lt;?php  <br />$DB_Server = "localhost";  <br />$DB_Username = "mydowns";  <br />$DB_Password = "";  <br />$DB_DBName = "mydowns";  <br />$DB_TBLName = "user";  <br />$Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password)  <br />or die("Couldn't connect.");  <br />$Db = @mysql_select_db($DB_DBName, $Connect)  <br />or die("Couldn't select database.");  <br />$file_type = "vnd.ms-excel";  <br />$file_ending = "xls";  <br />header("Content-Type: application/$file_type");  <br />header("Content-Disposition: attachment; filename=mydowns.$file_ending");  <br />header("Pragma: no-cache");  <br />header("Expires: 0");  <br />$now_date = date('Y-m-d H:i');  <br />$title = "数据库名:$DB_DBName,数据表:$DB_TBLName,备份日期:$now_date";  <br />$sql = "Select * from $DB_TBLName";  <br />$ALT_Db = @mysql_select_db($DB_DBName, $Connect)  <br />or die("Couldn't select database");  <br />$result = @mysql_query($sql,$Connect)  <br />or die(mysql_error());  <br />echo("$title\n");  <br />$sep = "\t";  <br />for ($i = 0; $i &lt; mysql_num_fields($result); $i++) {  <br />echo mysql_field_name($result,$i) . "\t";  <br />}  <br />print("\n");  <br />$i = 0;  <br />while($row = mysql_fetch_row($result))  <br />{  <br />$schema_insert = "";  <br />for($j=0; $j&lt;mysql_num_fields($result);$j++)  <br />{  <br />if(!isset($row[$j]))  <br />$schema_insert .= "NULL".$sep;  <br />elseif ($row[$j] != "")  <br />$schema_insert .= "$row[$j]".$sep;  <br />else  <br />$schema_insert .= "".$sep;  <br />}  <br />$schema_insert = str_replace($sep."$", "", $schema_insert);  <br />$schema_insert .= "\t";  <br />print(trim($schema_insert));  <br />print "\n";  <br />$i++;  <br />}  <br />return (true);  <br />?&gt;  <br /><img src ="http://www.blogjava.net/jackywjj/aggbug/67941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-06 09:00 <a href="http://www.blogjava.net/jackywjj/articles/67941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用PHP实现windows资源管理器风格的树型菜单</title><link>http://www.blogjava.net/jackywjj/articles/67942.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Wed, 06 Sep 2006 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/67942.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/67942.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/67942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/67942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/67942.html</trackback:ping><description><![CDATA[
		<p>　　以下是一个风格类似windows资源管理器的树型菜单 <br />将下面的脚本包含到你的页面中 <br />另外需要从资源管理器中截取一些gif图片,祥见脚本中的注释 <br />菜单结构文件的格式为: <br />tree level|item text|item link|link target|last item in subtree <br />例如 <br />.&lt;b&gt;Demo menu&lt;/b&gt;|javascript: alert('This is the demo menu for TreeMenu 1.0'); <br />..&lt;b&gt;目录1&lt;/b&gt; <br />...&lt;b&gt;子目录 1.1&lt;/b&gt; <br />....item 1.1.1|javascript: alert('Item 1.1.1');  <br />....item 1.1.2|javascript: alert('Item 1.1.1'); <br />...item 1.2|javascript: alert('Item 1.2'); <br />...item 1.3|javascript: alert('Item 1.3'); <br />..&lt;b&gt;子目录 2&lt;/b&gt; <br />...item 2.1|javascript: alert('Item 2.1'); <br />...item 2.2|javascript: alert('Item 2.2'); <br />...&lt;b&gt;子目录 2.3&lt;/b&gt; <br />....item 2.3.1|javascript: alert('Item 2.3.1'); <br />....item 2.3.2|javascript: alert('Item 2.3.2'); <br />&lt;?php  <br />// file:tremenu.inc <br />// PHP TreeMenu <br />///////////////// <br />// 初始化 // <br />///////////////// </p>
		<p>$treefile = "demomenu.txt";//设置有菜单结构的文件 </p>
		<p>if(isset($PATH_INFO))  <br />$script = $PATH_INFO;  <br />else  <br />$script = $SCRIPT_NAME;  </p>
		<p>//以下图片可截取windows资源管理器中的相应位置的图 </p>
		<p>$img_expand = "tree_expand.gif";//形如资源管理器中可扩展节点+ <br />$img_collapse = "tree_collapse.gif";//形如资源管理器中已扩展节点- <br />$img_line = "tree_vertline.gif";//形如| <br />$img_split = "tree_split.gif";//形如|- <br />$img_end = "tree_end.gif";//形如L <br />$img_leaf = "tree_leaf.gif";//形如o <br />$img_spc = "tree_space.gif";//空白图 </p>
		<p>//以下是菜单处理脚本 </p>
		<p>$maxlevel=0;  <br />$cnt=0;  </p>
		<p>$fd = fopen($treefile, "r");  <br />if ($fd==0) die("treemenu.inc : Unable to open file ".$treefile);  <br />while ($buffer = fgets($fd, 4096))  <br />{  <br />$tree[$cnt][0]=strspn($buffer,".");  <br />$tmp=rtrim(substr($buffer,$tree[$cnt][0]));  <br />$node=explode("|",$tmp);  <br />$tree[$cnt][1]=$node[0];  <br />$tree[$cnt][2]=$node[1];  <br />$tree[$cnt][3]=$node[2];  <br />$tree[$cnt][4]=0;  <br />if ($tree[$cnt][0] &gt; $maxlevel) $maxlevel=$tree[$cnt][0];  <br />$cnt++;  <br />}  <br />fclose($fd);  </p>
		<p>for ($i=0; $i&lt;count($tree); $i++)  <br />{  <br />$expand[$i]=0;  <br />$visible[$i]=0;  <br />$levels[$i]=0;  <br />}  </p>
		<p>if ($p!="")  <br />$explevels = explode("|",$p);  <br />$i=0;  <br />while($i&lt;count($explevels))  <br />{  <br />$expand[$explevels[$i]]=1;  <br />$i++;  <br />}  </p>
		<p>$lastlevel=$maxlevel;  <br />for ($i=count($tree)-1; $i&gt;=0; $i--)  <br />{  <br />if ( $tree[$i][0] &lt; $lastlevel )  <br />for ($j=$tree[$i][0]+1; $j &lt;= $maxlevel; $j++)  <br />$levels[$j]=0;  <br />if ( $levels[$tree[$i][0]]==0 )  <br />{  <br />$levels[$tree[$i][0]]=1;  <br />$tree[$i][4]=1;  <br />}  <br />else  <br />$tree[$i][4]=0;  <br />$lastlevel=$tree[$i][0];  <br />}  </p>
		<p>for ($i=0; $i &lt; count($tree); $i++)  <br />if ($tree[$i][0]==1)  <br />$visible[$i]=1;  <br />for ($i=0; $i &lt; count($explevels); $i++)  <br />{  <br />$n=$explevels[$i];  <br />if ( ($visible[$n]==1) &amp;&amp; ($expand[$n]==1) )  <br />{  <br />$j=$n+1;  <br />while ( $tree[$j][0] &gt; $tree[$n][0] )  <br />{  <br />if ($tree[$j][0]==$tree[$n][0]+1) $visible[$j]=1;  <br />$j++;  <br />}  <br />}  <br />}  </p>
		<p>for ($i=0; $i&lt;$maxlevel; $i++)  <br />$levels[$i]=1;  </p>
		<p>$maxlevel++;  </p>
		<p>echo "&lt;table cellspacing=0 cellpadding=0 border=0 cols=".($maxlevel+3)."&gt;\n";  <br />echo "&lt;tr&gt;";  <br />for ($i=0; $i&lt;$maxlevel; $i++)  <br />echo "&lt;td width=16&gt;&lt;/td&gt;";  <br />echo "&lt;td width=100%&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;\n";  <br />$cnt=0;  <br />while ($cnt&lt;count($tree))  <br />{  <br />if ($visible[$cnt])  <br />{  <br />echo "&lt;tr&gt;";  <br />$i=0;  <br />while ($i&lt;$tree[$cnt][0]-1)  <br />{  <br />if ($levels[$i]==1)  <br />echo "&lt;td&gt;&lt;a name='$cnt'&gt;&lt;/a&gt;&lt;img src=\"".$img_line."\"&gt;&lt;/td&gt;";  <br />else  <br />echo "&lt;td&gt;&lt;a name='$cnt'&gt;&lt;/a&gt;&lt;img src=\"".$img_spc."\"&gt;&lt;/td&gt;";  <br />$i++;  <br />}  <br />if ($tree[$cnt][4]==1)  <br />{  <br />echo "&lt;td&gt;&lt;img src=\"".$img_end."\"&gt;&lt;/td&gt;";  <br />$levels[$tree[$cnt][0]-1]=0;  <br />}  <br />else  <br />{  <br />echo "&lt;td&gt;&lt;img src=\"".$img_split."\"&gt;&lt;/td&gt;";  <br />$levels[$tree[$cnt][0]-1]=1;  <br />}  </p>
		<p>if ($tree[$cnt+1][0]&gt;$tree[$cnt][0])  <br />{  </p>
		<p>$i=0; $params="?p=";  <br />while($i&lt;count($expand))  <br />{  <br />if ( ($expand[$i]==1) &amp;&amp; ($cnt!=$i) || ($expand[$i]==0 &amp;&amp; $cnt==$i))  <br />{  <br />$params=$params.$i;  <br />$params=$params."|";  <br />}  <br />$i++;  <br />}  </p>
		<p>if ($expand[$cnt]==0)  <br />echo "&lt;td&gt;&lt;a href=\"".$script.$params."#$cnt\"&gt;&lt;img src=\"".$img_expand."\" <br />border=no&gt;&lt;/a&gt;&lt;/td&gt;";  <br />else  <br />echo "&lt;td&gt;&lt;a href=\"".$script.$params."#$cnt\"&gt;&lt;img src=\"".$img_collapse."\" <br />border=no&gt;&lt;/a&gt;&lt;/td&gt;";  <br />}  <br />else  <br />echo "&lt;td&gt;&lt;img src=\"".$img_leaf."\"&gt;&lt;/td&gt;";  </p>
		<p>if ($tree[$cnt][2]=="")  <br />echo "&lt;td colspan=".($maxlevel-$tree[$cnt][0])."&gt;".$tree[$cnt][1]."&lt;/td&gt;";  <br />else  <br />echo "&lt;td colspan=".($maxlevel-$tree[$cnt][0])."&gt;&lt;a href=\"".$tree[$cnt][2]."\" <br />target=\"".$tree[$cnt][3]."\"&gt;".$tree[$cnt][1]."&lt;/a&gt;&lt;/td&gt;";  <br />echo "&lt;/tr&gt;\n";  <br />}  <br />$cnt++;  <br />}  <br />echo "&lt;/table&gt;\n";  <br />?&gt; </p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/67942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-06 09:00 <a href="http://www.blogjava.net/jackywjj/articles/67942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP的XML分析函数</title><link>http://www.blogjava.net/jackywjj/articles/67572.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 04 Sep 2006 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/67572.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/67572.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/67572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/67572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/67572.html</trackback:ping><description><![CDATA[
		<p>PHP的XML分析函数<br /><br />介绍 </p>
		<p>首先我得承认我喜欢计算机标准。如果每个人都遵从这个行业的标准，互联网将会是一个更好的媒 <br />体。使用标准化的数据交换格式才能使开放的和独立于平台的计算模式切实可行。这就是我作为XML爱 <br />好者的原因。 </p>
		<p>幸运的是，我最喜爱的脚本语言不但支持XML而且对其支持正不断加强。PHP可以让我迅速将XML文档发 <br />布到互联网上，收集XML文档的统计信息，将XML文档转换成其它格式。例如，我时常用PHP的XML处理 <br />能力来管理我用XML所写的文章和书。 </p>
		<p>本文中，我将讨论任何用PHP内建的Expat解析器来处理XML文档。通过范例，我将演示Expat的处理方 <br />法。同时，范例可以告诉你如何： </p>
		<p>建立你自己的处理函数 <br />将XML文档转换成你自己的PHP数据结构 </p>
		<p>介绍Expat </p>
		<p>XML的解析器，同样称为XML处理器，可以使程序访问XML文档的结构和内容。Expat是PHP脚本语言的 <br />XML解析器。它同时也运用在其它项目中，例如Mozilla、Apache和Perl。 </p>
		<p>什么是基于事件的解析器？ </p>
		<p>XML解析器的两种基本类型： </p>
		<p>基于树型的解析器：将XML文档转换成树型结构。这类解析器分析整篇文章，同时提供一个API来访问 <br />所产生树的每个元素。其通用的标准为DOM（文档对象模式）。 <br />基于事件的解析器：将XML文档视为一系列的事件。当一个特殊事件发生时，解析器将调用开发者提供 <br />的函数来处理。 <br />基于事件的解析器有一个XML文档的数据集中视图，也就是说它集中在XML文档的数据部分，而不是其 <br />结构。这些解析器从头到尾处理文档，并将类似于－元素的开始、元素的结尾、特征数据的开始等等 <br />－事件通过回调（callback）函数报告给应用程序。以下是一个"Hello-World"的XML文档范例： </p>
		<p>&lt;greeting&gt; <br />Hello World <br />&lt;/greeting&gt; </p>
		<p>基于事件的解析器将报告为三个事件： </p>
		<p>开始元素：greeting <br />CDATA项的开始，值为：Hello World <br />结束元素：greeting <br />不像基于树型的解析器，基于事件的解析器不产生描述文档的结构。在CDATA项中，基于事件的解析器 <br />不会让你得到父元素greeting的信息。 <br />然而，它提供一个更底层的访问，这就使得可以更好地利用资源和更快地访问。通过这种方式，就没 <br />有必要将整个文档放入内存；而事实上，整个文档甚至可以大于实际内存值。 </p>
		<p>
				<br />Expat就是这样的一种基于事件的解析器。当然如果使用Expat，必要时它一样可以在PHP中生成完全的 <br />原生树结构。 </p>
		<p>
				<br />上面Hello-World的范例包括完整的XML格式。但它是无效的，因为既没有DTD（文档类型定义）与其联 <br />系，也没有内嵌DTD。 </p>
		<p>
				<br />对于Expat，这并没有区别：Expat是一个不检查有效性的解析器，因此忽略任何与文档联系的DTD。但 <br />应注意的是文档仍然需要完整的格式，否则Expat（和其他符合XML标准的解析器一样）将会随着出错 <br />信息而停止。 </p>
		<p>
				<br />作为不检查有效性的解析器，Exapt的快速性和轻巧性使其十分适合互联网程序。 </p>
		<p>
				<br />编译Expat </p>
		<p>Expat可以编译进PHP3.0.6版本（或以上）中。从Apache1.3.9开始，Expat已经作为Apache的一部分。 <br />在Unix系统中，通过-with-xml选项配置PHP，你可以将其编译入PHP。 </p>
		<p>
				<br />如果你将PHP编译为Apache的模块，而Expat将默认作为Apache的一部分。在Windows中，你则必须要加 <br />载XML动态连接库。 </p>
		<p>XML范例：XMLstats </p>
		<p>了解Expat的函数的一个办法就是通过范例。我们所要讨论的范例是使用Expat来收集XML文档的统计数 <br />据。 </p>
		<p>
				<br />对于文档中每个元素，以下信息都将被输出： </p>
		<p>该元素在文档中使用的次数 <br />该元素中字符数据的数量 <br />元素的父元素 <br />元素的子元素 <br />注意：为了演示，我们利用PHP来产生一个结构来保存元素的父元素和子元素 </p>
		<p>准备 </p>
		<p>用于产生XML解析器实例的函数为xml_parser_create()。该实例将用于以后的所有函数。这个思路非 <br />常类似于PHP中MySQL函数的连接标记。在解析文档前，基于事件的解析器通常要求你注册回调函数－ <br />用于特定的事件发生时调用。Expat没有例外事件，它定义了如下七个可能事件： </p>
		<p>
				<br />对象 XML解析函数 描述 </p>
		<p>元素 xml_set_element_handler() 元素的开始和结束 </p>
		<p>字符数据 xml_set_character_data_handler() 字符数据的开始 </p>
		<p>外部实体 xml_set_external_entity_ref_handler() 外部实体出现 </p>
		<p>未解析外部实体 xml_set_unparsed_entity_decl_handler() 未解析的外部实体出现 </p>
		<p>处理指令 xml_set_processing_instruction_handler() 处理指令的出现 </p>
		<p>记法声明 xml_set_notation_decl_handler() 记法声明的出现 </p>
		<p>默认 xml_set_default_handler() 其它没有指定处理函数的事件 </p>
		<p>所有的回调函数必须将解析器的实例作为其第一个参数（此外还有其它参数）。 </p>
		<p>
				<br />对于本文最后的范例脚本。你需要注意的是它既用到了元素处理函数又用到了字符数据处理函数。元 <br />素的回调处理函数通过xml_set_element_handler()来注册。 </p>
		<p>
				<br />这个函数需要三个参数： </p>
		<p>解析器的实例 <br />处理开始元素的回调函数的名称 <br />处理结束元素的回调函数的名称 <br />当开始解析XML文档时，回调函数必须存在。它们必须定义为与PHP手册中所描述的原型一致。 </p>
		<p>
				<br />例如，Expat将三个参数传递给开始元素的处理函数。在脚本范例中，其定义如下： </p>
		<p>
				<br />function start_element($parser, $name, $attrs) </p>
		<p>
				<br />第一个参数是解析器标示，第二个参数是开始元素的名称，第三参数为包含元素所有属性和值的数 <br />组。 </p>
		<p>
				<br />一旦你开始解析XML文档，Expat在遇到开始元素是都将调用你的start_element()函数并将参数传递过 <br />去。 </p>
		<p>
				<br />XML的Case Folding选项 </p>
		<p>用xml_parser_set_option()函数将Case folding选项关闭。这个选项默认是打开的，使得传递给处理 <br />函数的元素名自动转换为大写。但XML对大小写是敏感的（所以大小写对统计XML文档是非常重要 <br />的）。对于我们的范例，case folding选项必须关闭。 </p>
		<p>
				<br />解析文档 </p>
		<p>在完成所有的准备工作后，现在脚本终于可以解析XML文档： </p>
		<p>Xml_parse_from_file()，一个自定义的函数，打开参数中指定的文件，并以4kb的大小进行解析 <br />xml_parse()和xml_parse_from_file()一样，当发生错误时，即XML文档的格式不完全时，将会返回 <br />false。 <br />你可以使用xml_get_error_code()函数来得到最后一个错误的数字代码。将此数字代码传递给 <br />xml_error_string()函数即可得到错误的文本信息。 <br />输出XML当前的行数，使得调试更容易。 <br />在解析的过程中，调用回调函数。 <br />描述文档结构 </p>
		<p>当解析文档时，对于Expat需要强调问题的是：如何保持文档结构的基本描述？ </p>
		<p>
				<br />如前所述，基于事件的解析器本身并不产生任何结构信息。 </p>
		<p>
				<br />不过标签(tag)结构是XML的重要特性。例如，元素序列&lt;book&gt;&lt;title&gt;表示的意思不同于 <br />&lt;figure&gt;&lt;title&gt;。也就是说，任何作者都会告诉你书名和图名是没有关系的，虽然它们都用 <br />到"title"这个术语。因此，为了更有效地使用基于事件的解析器处理XML，你必须使用自己的栈 <br />(stacks)或列表(lists)来维护文档的结构信息。 </p>
		<p>
				<br />为了产生文档结构的镜像，脚本至少需要知道目前元素的父元素。用Exapt的API是无法实现的，它只 <br />报告目前元素的事件，而没有任何前后关系的信息。因此，你需要建立自己的栈结构。 </p>
		<p>
				<br />脚本范例使用先进后出(FILO)的栈结构。通过一个数组，栈将保存全部的开始元素。对于开始元素处 <br />理函数，目前的元素将被array_push()函数推到栈的顶部。相应的，结束元素处理函数通过array_pop <br />()将最顶的元素移走。 </p>
		<p>
				<br />对于序列&lt;book&gt;&lt;title&gt;&lt;/title&gt;&lt;/book&gt;，栈的填充如下： </p>
		<p>开始元素book：将"book"赋给栈的第一个元素($stack[0])。 <br />开始元素title：将"title"赋给栈的顶部($stack[1])。 <br />结束元素title：从栈中将最顶部的元素移去($stack[1])。 <br />结束元素title：从栈中将最顶部的元素移去($stack[0])。 <br />PHP3.0通过一个$depth变量手动控制元素的嵌套来实现范例。这就使脚本看起来比较复杂。PHP4.0通 <br />过array_pop()和array_push()两个函数来使脚本看起来更简洁。 </p>
		<p>
				<br />收集数据 </p>
		<p>为了收集每个元素的信息，脚本需要记住每个元素的事件。通过使用一个全局的数组变量$elements来 <br />保存文档中所有不同的元素。数组的项目是元素类的实例，有4个属性（类的变量） </p>
		<p>$count -该元素在文档中被发现的次数 <br />$chars -元素中字符事件的字节数 <br />$parents -父元素 <br />$childs - 子元素 <br />正如你所看到的，将类实例保存在数组中是轻而易举的。 </p>
		<p>
				<br />注意：PHP的一个特性是你可以通过while(list() = each())loop遍历整个类结构，如同你遍历整个相 <br />应的数组一样。所有的类变量（当你用PHP3.0时还有方法名）都以字符串的方式输出。 </p>
		<p>
				<br />当发现一个元素时，我们需要增加其相应的记数器来跟踪它在文档中出现多少次。在相应的$elements <br />项中的记数元素也要加一。 </p>
		<p>
				<br />我们同样要让父元素知道目前的元素是它的子元素。因此，目前元素的名称将会加入到父元素的 <br />$childs数组的项目中。最后，目前元素应该记住谁是它的父元素。所以，父元素被加入到目前元素 <br />$parents数组的项目中。 </p>
		<p>
				<br />显示统计信息 </p>
		<p>剩下的代码在$elements数组和其子数组中循环显示其统计结果。这就是最简单的嵌套循环，尽管输出 <br />正确的结果，但代码既不简洁又没有任何特别的技巧，它仅仅是一个你可能每天用他来完成工作的循 <br />环。 </p>
		<p>
				<br />脚本范例被设计为通过PHP的CGI方式的命令行来调用。因此，统计结果输出的格式为文本格式。如果 <br />你要将脚本运用到互联网上，那么你需要修改输出函数来产生HTML格式。 </p>
		<p>总结 </p>
		<p>Exapt是PHP的XML解析器。作为基于事件的解析器，它不产生文档的结构描述。但通过提供底层访问， <br />这就使得可以更好地利用资源和更快地访问。 </p>
		<p>
				<br />作为一个不检查有效性的解析器，Expat忽略与XML文档连接的DTD，但如果文档的格式不完整，它将会 <br />随着出错信息而停止。 </p>
		<p>
				<br />提供事件处理函数来处理文档 <br />建立自己的事件结构例如栈和树来获得XML结构信息标记的优点。 <br />每天都有新的XML程序出现，而PHP对XML的支持也不断加强（例如，增加了支持基于DOM的XML解析器 <br />LibXML）。 </p>
		<p>
				<br />有了PHP和Expat，你就可以为即将出现的有效、开放和独立于平台的标准作准备。 </p>
		<p>范例 </p>
		<p>&lt;? <br />/***************************************************************************** <br />* 名称：XML解析范例：XML文档信息统计 <br />* 描述 <br />* 本范例通过PHP的Expat解析器收集和统计XML文档的信息（例如：每个元素出现的次数、父元素和子 <br />元素 <br />* XML文件作为一个参数 ./xmlstats_PHP4.php3 test.xml <br />* $Requires: Expat 要求：Expat PHP4.0编译为CGI模式 <br />*****************************************************************************/ </p>
		<p>// 第一个参数是XML文件 <br />$file = $argv[1]; </p>
		<p>// 变量的初始化 <br />$elements = $stack = array(); <br />$total_elements = $total_chars = 0; </p>
		<p>// 元素的基本类 <br />class element <br />{ <br />var $count = 0; <br />var $chars = 0; <br />var $parents = array(); <br />var $childs = array(); <br />} </p>
		<p>// 解析XML文件的函数 <br />function xml_parse_from_file($parser, $file) <br />{ <br />if(!file_exists($file)) <br />{ <br />die("Can't find file \"$file\"."); <br />} </p>
		<p>if(!($fp = @fopen($file, "r"))) <br />{ <br />die("Can't open file \"$file\"."); <br />} </p>
		<p>while($data = fread($fp, 4096)) <br />{ <br />if(!xml_parse($parser, $data, feof($fp))) <br />{ <br />return(false); <br />} <br />} </p>
		<p>fclose($fp); </p>
		<p>return(true); <br />} </p>
		<p>// 输出结果函数（方框形式） <br />function print_box($title, $value) <br />{ <br />printf("\n+%'-60s+\n", ""); <br />printf("|%20s", "$title:"); <br />printf("%14s", $value); <br />printf("%26s|\n", ""); <br />printf("+%'-60s+\n", ""); <br />} </p>
		<p>// 输出结果函数（行形式） <br />function print_line($title, $value) <br />{ <br />printf("%20s", "$title:"); <br />printf("%15s\n", $value); <br />} </p>
		<p>// 排序函数 <br />function my_sort($a, $b) <br />{ <br />return(is_object($a) &amp;&amp; is_object($b) ? $b-&gt;count - $a-&gt;count: 0); <br />} </p>
		<p>function start_element($parser, $name, $attrs) <br />{ <br />global $elements, $stack; </p>
		<p>// 元素是否已在全局$elements数组中？ <br />if(!isset($elements[$name])) <br />{ <br />// 否－增加一个元素的类实例 <br />$element = new element; <br />$elements[$name] = $element; <br />} </p>
		<p>// 该元素的记数器加一 <br />$elements[$name]-&gt;count++; </p>
		<p>// 是否有父元素？ <br />if(isset($stack[count($stack)-1])) <br />{ <br />// 是－将父元素赋给$last_element <br />$last_element = $stack[count($stack)-1]; </p>
		<p>// 如果目前元素的父元素数组为空，初始化为0 <br />if(!isset($elements[$name]-&gt;parents[$last_element])) <br />{ <br />$elements[$name]-&gt;parents[$last_element] = 0; <br />} </p>
		<p>// 该元素的父元素记数器加一 <br />$elements[$name]-&gt;parents[$last_element]++; </p>
		<p>// 如果目前元素的父元素的子元素数组为空，初始化为0 </p>
		<p>if(!isset($elements[$last_element]-&gt;childs[$name])) <br />{ <br />$elements[$last_element]-&gt;childs[$name] = 0; <br />} </p>
		<p>// 该元素的父元素的子元素记数器加一 <br />$elements[$last_element]-&gt;childs[$name]++; <br />} </p>
		<p>// 将目前的元素加入到栈中 <br />array_push($stack, $name); <br />} </p>
		<p>function stop_element($parser, $name) <br />{ <br />global $stack; </p>
		<p>// 从栈中将最顶部的元素移去 <br />array_pop($stack); <br />} </p>
		<p>function char_data($parser, $data) <br />{ <br />global $elements, $stack, $depth; </p>
		<p>// 增加目前元素的字符数目 <br />$elements[$stack[count($stack)-1]]-&gt;chars += strlen(trim($data)); <br />} </p>
		<p>// 产生解析器的实例 <br />$parser = xml_parser_create(); </p>
		<p>// 设置处理函数 <br />xml_set_element_handler($parser, "start_element", "stop_element"); <br />xml_set_character_data_handler($parser, "char_data"); <br />xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); </p>
		<p>// 解析文件 <br />$ret = xml_parse_from_file($parser, $file); <br />if(!$ret) <br />{ <br />die(sprintf("XML error: %s at line %d", <br />xml_error_string(xml_get_error_code($parser)), <br />xml_get_current_line_number($parser))); <br />} </p>
		<p>// 释放解析器 <br />xml_parser_free($parser); </p>
		<p>// 释放协助元素 <br />unset($elements["current_element"]); <br />unset($elements["last_element"]); </p>
		<p>// 根据元素的次数排序 <br />uasort($elements, "my_sort"); </p>
		<p>// 在$elements中循环收集元素信息 <br />while(list($name, $element) = each($elements)) <br />{ <br />print_box("Element name", $name); </p>
		<p>print_line("Element count", $element-&gt;count); <br />print_line("Character count", $element-&gt;chars); </p>
		<p>printf("\n%20s\n", "* Parent elements"); </p>
		<p>// 在该元素的父中循环，输出结果 <br />while(list($key, $value) = each($element-&gt;parents)) <br />{ <br />print_line($key, $value); <br />} <br />if(count($element-&gt;parents) == 0) <br />{ <br />printf("%35s\n", "[root element]"); <br />} </p>
		<p>// 在该元素的子中循环，输出结果 <br />printf("\n%20s\n", "* Child elements"); <br />while(list($key, $value) = each($element-&gt;childs)) <br />{ <br />print_line($key, $value); <br />} <br />if(count($element-&gt;childs) == 0) <br />{ <br />printf("%35s\n", "[no childs]"); <br />} </p>
		<p>$total_elements += $element-&gt;count; <br />$total_chars += $element-&gt;chars; <br />} </p>
		<p>// 最终结果 <br />print_box("Total elements", $total_elements); <br />print_box("Total characters", $total_chars); <br />?&gt; <br /></p>
<img src ="http://www.blogjava.net/jackywjj/aggbug/67572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-09-04 14:09 <a href="http://www.blogjava.net/jackywjj/articles/67572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP写的域名查询系统whois</title><link>http://www.blogjava.net/jackywjj/articles/28206.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 16 Jan 2006 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/28206.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/28206.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/28206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/28206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/28206.html</trackback:ping><description><![CDATA[&lt;?PHP&nbsp;&nbsp; <BR>if&nbsp;($domain)&nbsp;&nbsp; <BR>{&nbsp;&nbsp; <BR>if&nbsp;($domain)&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fp&nbsp;=&nbsp;fsockopen(&nbsp;"rs.internic.net",&nbsp;43,&nbsp;&amp;$errno,&nbsp;&amp;$errstr,&nbsp;10);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$fp)&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&nbsp;"$errstr&nbsp;($errno)<BR>n";&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($fp,&nbsp;"$domainrn");&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!feof($fp))&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$buf&nbsp;=&nbsp;fgets($fp,128);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ereg(&nbsp;"Whois&nbsp;Server:",&nbsp;$buf))&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$server&nbsp;=&nbsp;str_replace(&nbsp;"Whois&nbsp;Server:&nbsp;",&nbsp;&nbsp;"",&nbsp;$buf);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$server&nbsp;=&nbsp;trim($server);&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose($fp);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($server)&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&nbsp;"&lt;B&gt;$domain&nbsp;is&nbsp;registered&nbsp;at&nbsp;$server:&lt;/B&gt;&lt;BR&gt;";&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&nbsp;"&lt;PRE&gt;";&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fp&nbsp;=&nbsp;fsockopen($server,&nbsp;43,&nbsp;&amp;$errno,&nbsp;&amp;$errstr,&nbsp;10);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$fp)&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&nbsp;"Could&nbsp;not&nbsp;open&nbsp;connection&nbsp;to&nbsp;$server&nbsp;on&nbsp;port&nbsp;43.n";&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&nbsp;"$errstr&nbsp;($errno)<BR>n";&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs($fp,&nbsp;"$domainrn");&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!feof($fp))&nbsp;&nbsp; <BR>&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; <BR>&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;echo&nbsp;fgets($fp,128);&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose($fp);&nbsp;&nbsp; <BR>&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; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo(&nbsp;"&lt;b&gt;$domain&nbsp;does&nbsp;not&nbsp;appear&nbsp;to&nbsp;be&nbsp;registered.&lt;/b&gt;&lt;BR&gt;");&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;(&nbsp;"&lt;/PRE&gt;&lt;BR&gt;");&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>}&nbsp;&nbsp; <BR>?&gt;&nbsp;&nbsp; <BR>&lt;FORM&nbsp;ACTION="&nbsp;&lt;?PHP&nbsp;echo($PHP_SELF);&nbsp;?&gt;"&nbsp;METHOD="post"&gt;&nbsp;&nbsp; <BR>&nbsp;&nbsp;查找&nbsp;.com,&nbsp;.org,&nbsp;and&nbsp;.net&nbsp;主机<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;主机名:&nbsp;&lt;INPUT&nbsp;TYPE="text"&nbsp;NAME="domain"&nbsp;SIZE="40"&nbsp;MAXLENGTH="100"&gt;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&lt;INPUT&nbsp;TYPE=submit&nbsp;VALUE="Find&nbsp;out"&gt;&lt;INPUT&nbsp;TYPE=reset&nbsp;VALUE="Reset"&gt;&nbsp;&nbsp; <BR>&lt;/FORM&gt;&nbsp;<img src ="http://www.blogjava.net/jackywjj/aggbug/28206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2006-01-16 15:55 <a href="http://www.blogjava.net/jackywjj/articles/28206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php.ini中文解释</title><link>http://www.blogjava.net/jackywjj/articles/25165.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 23 Dec 2005 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/25165.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/25165.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/25165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/25165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/25165.html</trackback:ping><description><![CDATA[<P>[PHP] <BR>; PHP还是一个不断发展的工具，其功能还在不断地删减 <BR>; 而php.ini的设置更改可以反映出相当的变化， <BR>; 在使用新的PHP版本前，研究一下php.ini会有好处的 </P>
<P>;;;;;;;;;;;;;;;;;;; <BR>; 关于这个文件 ; <BR>;;;;;;;;;;;;;;;;;;; </P>
<P>; 这个文件控制了PHP许多方面的观点.为了让PHP读取这个文件，它必须被命名为 <BR>; 'php.ini'.PHP 将在这些地方依次查找该文件：当前工作目录；环境变量PHPRC <BR>; 指明的路径；编译时指定的路径. <BR>; 在windows下，编译时的路径是Windows安装目录. <BR>; 在命令行模式下，php.ini的查找路径可以用 -c 参数替代. </P>
<P>; 该文件的语法非常简单.空白字符和用分号';'开始的行被简单地忽略（就象你可能 <BR>; 猜到的一样）. 章节标题（例如 : [Foo]）也被简单地忽略，即使将来它们可能 <BR>; 有某种的意义. <BR>; <BR>; 指示被指定使用如下语法： <BR>; 指示标识符 = 值 <BR>; directive = value <BR>; 指示标识符 是 *大小写敏感的* - foo=bar 不同于 FOO = bar. <BR>; <BR>; 值可以是一个字符串，一个数字，一个 PHP 常量 (如： E_ALL or M_PI), INI 常量中的 <BR>; 一个 (On, Off, True, False, Yes, No and None) ，或是一个表达式 <BR>; (如: E_ALL &amp; ~E_NOTICE), 或是用引号括起来的字符串("foo"). <BR>; <BR>; INI 文件的表达式被限制于位运算符和括号. <BR>; | bitwise OR <BR>; &amp; bitwise AND <BR>; ~ bitwise NOT <BR>; ! boolean NOT <BR>; <BR>; 布尔标志可用 1, On, True or Yes 这些值置于开的状态. <BR>; 它们可用 0, Off, False or No 这些值置于关的状态. <BR>; <BR>; 一个空字符串可以用在等号后不写任何东西表示，或者用 None 关键字: <BR>; <BR>; foo = ; 将foo置为空字符串 <BR>; foo = none ; 将foo置为空字符串 <BR>; foo = "none" ; 将foo置为字符串'none' <BR>; <BR>; 如果你值设置中使用常量，而这些常量属于动态调入的扩展库（不是 PHP 的扩展，就是 <BR>; Zend 的扩展），你仅可以调入这些扩展的行*之后*使用这些常量. <BR>; <BR>; 所有在 php.ini-dist 文件里设定的值与内建的默认值相同（这是说，如果 php.ini <BR>; 没被使用或者你删掉了这些行，默认值与之相同）. </P>
<P><BR>;;;;;;;;;;;;;;;;;;;; <BR>; 语言选项 ; <BR>;;;;;;;;;;;;;;;;;;;; </P>
<P>engine = On <BR>; 使 PHP scripting language engine（PHP 脚本语言引擎）在 Apache下有效. <BR>short_open_tag = On <BR>; 允许 tags 将被识别. <BR>asp_tags = Off <BR>; 允许ASP-style tags <BR>precision = 14 <BR>; 浮点类型数显示时的有效位数 </P>
<P>y2k_compliance = Off <BR>; 是否打开 2000年适应 (可能在非Y2K适应的浏览器中导致问题) </P>
<P>output_buffering = Off <BR>; 输出缓存允许你甚至在输出正文内容之后发送 header（标头，包括cookies）行 <BR>; 其代价是输出层减慢一点点速度.你可以使用输出缓存在运行时打开输出缓存， <BR>; 或者在这里将指示设为 On 而使得所有文件的输出缓存打开. <BR>output_handler = ; 你可以重定向你的脚本的所有输出到一个函数， <BR>; 那样做可能对处理或以日志记录它有用. <BR>; 例如若你将这个output_handler 设为"ob_gzhandler", <BR>; 则输出会被透明地为支持gzip或deflate编码的浏览器压缩. <BR>; 设一个输出处理器自动地打开输出缓冲. </P>
<P>implicit_flush = Off <BR>; 强制flush（刷新）让PHP 告诉输出层在每个输出块之后自动刷新自身数据. <BR>; 这等效于在每个 print() 或 echo() 调用和每个 HTML 块后调用flush()函数. <BR>; 打开这项设置会导致严重的运行时冲突，建议仅在debug过程中打开. </P>
<P>allow_call_time_pass_reference = On <BR>; 是否让强迫函数调用时按引用传递参数.这一方法遭到抗议， <BR>; 并可能在将来版本的PHP/Zend里不再支持. <BR>; 受到鼓励的指定哪些参数按引用传递的方法是在函数声明里. <BR>; 你被鼓励尝试关闭这一选项并确认你的脚本仍能正常工作，以保证在将来版本的语言里 <BR>; 它们仍能工作.（你将在每次使用该特点时得到一个警告，而参数将按值而不是按引用 <BR>; 传递）. </P>
<P>; Safe Mode 安全模式 <BR>safe_mode = Off <BR>safe_mode_exec_dir = <BR>safe_mode_allowed_env_vars = PHP_ <BR>; ？Setting certain environment variables <BR>; ？may be a potential security breach. <BR>; 该指示包含用逗号分隔的前缀列表.安全模式中，用户仅可以替换 <BR>; 以在此列出的前缀开头的环境变量的值. <BR>; 默认地，用户将仅能 设定以PHP_开头的环境变量，（如: PHP_FOO=BAR）. <BR>; 注意: 如果这一指示为空，PHP 将让用户更改任意环境变量! </P>
<P>safe_mode_protected_env_vars = LD_LIBRARY_PATH <BR>; 这条指示包含一个用逗号分隔的环境变量列表，那是最终用户将不能用putenv () 更改的. <BR>; 这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护. </P>
<P>disable_functions = <BR>; 这条指示让你可以为了安全的原因让特定函数失效. <BR>; 它接受一个用逗号分隔的函数名列表. <BR>; 这条指示 *不受* 安全模式是否打开的影响. </P>
<P>; 语法高亮模式的色彩. <BR>; 只要能被接受的东西就能工作. </P>
<P>highlight.string = #DD0000 <BR>highlight.comment = #FF8000 <BR>highlight.keyword = #007700 <BR>highlight.bg = #FFFFFF <BR>highlight.default = #0000BB <BR>highlight.html = #000000 </P>
<P>; Misc 杂项 <BR>expose_php = Off <BR>; 决定 PHP 是否标示它装在服务器上的事实（例如：加在它 —PHP—给Web服务 <BR>; 发送的信号上）. <BR>; （我个人的意见，在出现什么power-by的header的时候，把这关掉.） <BR>; 它不会有安全上的威胁, 但它使检查你的服务器上是否安装了PHP成为了可能. </P>
<P><BR>;;;;;;;;;;;;;;;;;;; <BR>; Resource Limits ; <BR>;;;;;;;;;;;;;;;;;;; </P>
<P>max_execution_time = 30 ; 每个脚本的最大执行时间, 按秒计 <BR>memory_limit = 8388608 ; 一个脚本最大可使用的内存总量 (这里是8MB) </P>
<P><BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; <BR>; Error handling and logging ; <BR>; 出错控制和登记 ; <BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; <BR>; 错误报告是按位的.或者将数字加起来得到想要的错误报告等级. <BR>; E_ALL - 所有的错误和警告 <BR>; E_ERROR - 致命性运行时错 <BR>; E_WARNING - 运行时警告（非致命性错） <BR>; E_PARSE - 编译时解析错误 <BR>; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的， <BR>;也可能是有意的行为造成的.(如：基于未初始化的变量自动初始化为一个 <BR>;空字符串的事实而使用一个未初始化的变量) </P>
<P>; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误 <BR>; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错) <BR>; E_COMPILE_ERROR - 编译时致命性错 <BR>; E_COMPILE_WARNING - 编译时警告(非致命性错) <BR>; E_USER_ERROR - 用户产生的出错消息 <BR>; E_USER_WARNING - 用户产生的警告消息 <BR>; E_USER_NOTICE - 用户产生的提醒消息 <BR>; 例子: <BR>; error_reporting = E_ALL &amp; ~E_NOTICE ; 显示所有的错误，除了提醒 <BR>; error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显示错误 <BR>error_reporting = E_ALL &amp; ~E_NOTICE ; 显示所有的错误，除了提醒 <BR>display_errors = On ; 显示出错误信息(作为输出的一部分) <BR>; 在最终发布的web站点上，强烈建议你关掉这个特性，并使用 <BR>; 错误日志代替（参看下面）. <BR>; 在最终发布的web站点继续让 display_errors 有效可能 <BR>; 暴露一些有关安全的信息，例如你的web服务上的文件路径、 <BR>; 你的数据库规划或别的信息. <BR>display_startup_errors = Off ; 甚至当display_erroes打开了，发生于PHP的启动的步骤中 <BR>; 的错误也不会被显示. <BR>; 强烈建议保持使 display_startup_errors 关闭， <BR>; 除了在改错过程中. <BR>log_errors = Off ; 在日志文件里记录错误（服务器指定的日志，stderr标准错误输出，或error_log(下面的）） <BR>; 正如上面说明的那样，强烈建议你在最终发布的web站点以日志记录错误 <BR>; 取代直接错误输出. </P>
<P>track_errors = Off ; 保存最近一个 错误/警告 消息于变量 $php_errormsg (boolean) <BR>;error_prepend_string = "" ; 于错误信息前输出的字符串 <BR>;error_append_string = "" ; 于错误信息后输出的字符串 <BR>;error_log = filename ; 记录错误日志于指定文件 <BR>;error_log = syslog ; 记录错误日志于系统日志 syslog (NT 下的事件日志, Windows 95下无效) <BR>warn_plus_overloading = Off ; 当将‘+’用于字符串时警告 </P>
<P><BR>;;;;;;;;;;;;;;;;; <BR>; Data Handling ; <BR>;;;;;;;;;;;;;;;;; <BR>variables_order = "EGPCS" ; 这条指示描述了PHP 记录 <BR>; GET, POST, Cookie, Environment and Built-in 这些变量的顺序. <BR>; （以 G, P, C, E &amp; S 代表，通常以 EGPCS 或 GPC 的方式引用）. <BR>; 按从左到右记录，新值取代旧值. </P>
<P>register_globals = On ; 是否将这些 EGPCS 变量注册为全局变量. <BR>; 若你不想让用户数据不在全局范围内混乱的话，你可能想关闭它. <BR>; 这和 track_vars 连起来用更有意义 — 这样你可以通过 <BR>; $HTTP_*_VARS[] 数组访问所有的GPC变量. </P>
<P>register_argc_argv = On ; 这条指示告诉 PHP 是否声明 argv和argc 变量 <BR>; （注：这里argv为数组,argc为变量数） <BR>; （其中包含用GET方法传来的数据）. <BR>; 若你不想用这些变量，你应当关掉它以提高性能. </P>
<P>track_vars = On ; 使$HTTP_*_VARS[]数组有效，这里*在使用时用 <BR>; ENV, POST, GET, COOKIE or SERVER替换 <BR>post_max_size = 8M ; PHP将接受的POST数据最大大小. </P>
<P><BR>gpc_order = "GPC" ; 这条指示被人反对.用 variables_order 代替. <BR>&nbsp;<BR>本站发表的文章版权归PHPchina所有，转载者请注明作者和出处！ <BR>【论坛浏览】 【我来说两句】 【打印】 【大】 【中】 【小】 【关闭】 <BR>&nbsp;</P>
<P>&nbsp;相关评论 <BR>作者: feifengxlq 发布日期: 2005-10-02 <BR>; Magic quotes <BR>magic_quotes_gpc = On ; 在输入的GET/POST/Cookie数据里使用魔术引用 <BR>; （原文就这样，呵呵，所谓magic quotes 应该是指用转义符加在引用性的控制字符上，如 '....） <BR>magic_quotes_runtime= Off ; 对运行时产生的数据使用魔术引用， <BR>; 例如：用SQL查询得到的数据，用exec()函数得到的数据，等等 <BR>magic_quotes_sybase = Off ; 采用 Sybase形式的魔术引用（用 '' 脱出 ' 而不用 '） </P>
<P>; 自动在 PHP 文档之前和之后添加文件 <BR>auto_prepend_file = <BR>auto_append_file = </P>
<P>; 象4.04b4一样，PHP 默认地总是在 “Content-type:” 头标输出一个字符的编码方式. <BR>; 让输出字符集失效，只要设置为空. <BR>; PHP 的内建默认值是 text/html <BR>default_mimetype = "text/html" <BR>;default_charset = "iso-8859-1" </P>
<P>;;;;;;;;;;;;;;;;;;;;;;;;; <BR>; Paths and Directories ; <BR>;;;;;;;;;;;;;;;;;;;;;;;;; <BR>include_path = ; include 路径设置，UNIX: "/path1:/path2" Windows: "\path1;\path2" <BR>doc_root = ; php 页面的根路径，仅在非空时有效 <BR>user_dir = ; 告知 php 在使用 /~username 打开脚本时到哪个目录下去找，仅在非空时有效 <BR>;upload_tmp_dir = ; 存放用HTTP协议上载的文件的临时目录（在没指定时使用系统默认的） <BR>upload_max_filesize = 2097152 ; 文件上载默认地限制为2 Meg <BR>extension_dir = c:\php\ ; 存放可加载的扩充库（模块）的目录 <BR>enable_dl = On ; 是否使dl()有效. <BR>; 在多线程的服务器上 dl()函数*不能*很好地工作， <BR>; 例如IIS or Zeus，并在其上默认为禁止 </P>
<P><BR>;;;;;;;;;;;;;;;; <BR>; File Uploads ; <BR>;;;;;;;;;;;;;;;; <BR>file_uploads = On ; 是否允许HTTP方式文件上载 <BR>;upload_tmp_dir = ; 用于HTTP上载的文件的临时目录（未指定则使用系统默认） <BR>upload_max_filesize = 2M ; 上载文件的最大许可大小 </P>
<P>; Fopen wrappers ; <BR>;;;;;;;;;;;;;;;;;; <BR>allow_url_fopen = On ; 是否允许把URLs当作http:.. 或把文件当作ftp:... </P>
<P><BR>;;;;;;;;;;;;;;;;;;;;;; <BR>; 动态扩展 ; <BR>; Dynamic Extensions ; <BR>;;;;;;;;;;;;;;;;;;;;;; <BR>; 若你希望一个扩展库自动加载，用下面的语法： <BR>; extension=modulename.extension <BR>; 例如，在windows上， <BR>; extension=msql.dll <BR>; or 在UNIX下, <BR>; extension=msql.so <BR>; 注意，这只应当是模块的名字，不需要目录信息放在里面. <BR>; 用上面的 extension_dir 指示指定扩展库的位置. </P>
<P><BR>;Windows 扩展 <BR>;extension=php_nsmail.dll <BR>extension=php_calendar.dll <BR>;extension=php_dbase.dll <BR>;extension=php_filepro.dll <BR>extension=php_gd.dll <BR>;extension=php_dbm.dll <BR>;extension=php_mssql.dll <BR>;extension=php_zlib.dll <BR>;extension=php_filepro.dll <BR>;extension=php_imap4r2.dll <BR>;extension=php_ldap.dll <BR>;extension=php_crypt.dll <BR>;extension=php_msql2.dll <BR>;extension=php_odbc.dll <BR>; 注意， MySQL的支持现在是内建的，因此，不需要用它的dll </P>
<P><BR>;;;;;;;;;;;;;;;;;;; <BR>; 模块设定 ; <BR>; Module Settings ; <BR>;;;;;;;;;;;;;;;;;;; </P>
<P>[Syslog] <BR>define_syslog_variables = Off ; 是否定义各种的系统日志变量 <BR>; 如：$LOG_PID, $LOG_CRON, 等等. <BR>; 关掉它是个提高效率的好主意. <BR>; 运行时，你可以调用函数define_syslog_variables()，来定义这些变量 </P>
<P><BR>[mail function] <BR>SMTP = localhost ;仅用于win32系统 <BR>sendmail_from = <A href="mailto:me@localhost.com">me@localhost.com</A> ;仅用于win32系统 <BR>;sendmail_path = ;仅用于unix, 也可支持参数（默认的是'sendmail -t -i'） </P>
<P>[Debugger] <BR>debugger.host = localhost <BR>debugger.port = 7869 <BR>debugger.enabled = False </P>
<P>[Logging] <BR>; 这些配置指示用于示例的日志记录机制. <BR>; 看 examples/README.logging 以得到更多的解释 <BR>;logging.method = db <BR>;logging.directory = /path/to/log/directory </P>
<P>[Java] <BR>;java.class.path = .\php_java.jar <BR>;java.home = c:\jdk <BR>;java.library = c:\jdk\jre\bin\hotspot\jvm.dll <BR>;java.library.path = .\ </P>
<P>[SQL] <BR>sql.safe_mode = Off </P>
<P>[ODBC] <BR>;uodbc.default_db = Not yet implemented <BR>;uodbc.default_user = Not yet implemented <BR>;uodbc.default_pw = Not yet implemented <BR>uodbc.allow_persistent = On ; 允许或禁止 持久连接 <BR>uodbc.check_persistent = On ; 在重用前检查连接是否还可用 <BR>uodbc.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>uodbc.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>uodbc.defaultlrl = 4096 ; 控制 LONG 类型的字段.返回变量的字节数，0 代表通过（？）0 means passthru <BR>uodbc.defaultbinmode = 1 ; 控制 二进制数据.0 代表?????Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char <BR>; 见有关 odbc_binmode 和 odbc_longreadlen 的文档以得到 uodbc.defaultlrl 和 uodbc.defaultbinmode 的解释. </P>
<P>[MySQL] <BR>mysql.allow_persistent = On ; 允许或禁止 持久连接 <BR>mysql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>mysql.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>mysql.default_port = ; mysql_connect() 使用的默认端口，如不设置，mysql_connect() <BR>; 将使用变量 $MYSQL_TCP_PORT，或在/etc/services 下的mysql-tcp 条目(unix)， <BR>; 或在编译是定义的 MYSQL_PORT(按这样的顺序) <BR>; Win32环境，将仅检查MYSQL_PORT. <BR>mysql.default_socket = ; 用于本地 MySql 连接的默认的套接字名.为空，使用 MYSQL 内建值 </P>
<P>mysql.default_host = ; mysql_connect() 默认使用的主机（安全模式下无效） <BR>mysql.default_user = ; mysql_connect() 默认使用的用户名（安全模式下无效） <BR>mysql.default_password = ; mysql_connect() 默认使用的密码（安全模式下无效） <BR>; 注意，在这个文件下保存密码通常是一个*坏*主意 <BR>; *任何*可以使用PHP访问的用户可以运行 <BR>; 'echo cfg_get_var("mysql.default_password")'来显示那个密码! <BR>; 而且当然地，任何有读该文件权力的用户也能看到那个密码. </P>
<P>[mSQL] <BR>msql.allow_persistent = On ; 允许或禁止 持久连接 <BR>msql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>msql.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 </P>
<P>[PostgresSQL] <BR>pgsql.allow_persistent = On ; 允许或禁止 持久连接 <BR>pgsql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>pgsql.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 </P>
<P>[Sybase] <BR>sybase.allow_persistent = On ; 允许或禁止 持久连接 <BR>sybase.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>sybase.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>;sybase.interface_file = "/usr/sybase/interfaces" <BR>sybase.min_error_severity = 10 ; 显示的错误的最低严重性 <BR>sybase.min_message_severity = 10 ; 显示的消息的最低重要性 <BR>sybase.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模式.若打开，这将导致 PHP 自动地 <BR>; 把根据结果的 Sybase 类型赋予它们， <BR>; 而不是把它们全当成字符串. <BR>; 这个兼容模式不会永远留着， <BR>; 因此，将你的代码进行需要的修改， <BR>; 并将该项关闭. </P>
<P>[Sybase-CT] <BR>sybct.allow_persistent = On ; 允许或禁止 持久连接 <BR>sybct.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>sybct.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>sybct.min_server_severity = 10 ; 显示的错误的最低严重性 <BR>sybct.min_client_severity = 10 ; 显示的消息的最低重要性 </P>
<P>[bcmath] <BR>bcmath.scale = 0 ; 用于所有bcmath函数的10十进制数数字的个数number of decimal digits for all bcmath functions </P>
<P>[browscap] <BR>;browscap = extra/browscap.ini <BR>browscap = C:\WIN\SYSTEM\inetsrv\browscap.ini <BR>[Informix] <BR>ifx.default_host = ; ifx_connect() 默认使用的主机（安全模式下无效） <BR>ifx.default_user = ; ifx_connect() 默认使用的用户名（安全模式下无效） <BR>ifx.default_password = ; ifx_connect() 默认使用的密码（安全模式下无效） <BR>ifx.allow_persistent = On ; 允许或禁止 持久连接 <BR>ifx.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>ifx.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>ifx.textasvarchar = 0 ; 若打开，select 状态符返回一个 ‘text blob’字段的内容，而不是它的id <BR>ifx.byteasvarchar = 0 ; 若打开，select 状态符返回一个 ‘byte blob’字段的内容，而不是它的id <BR>ifx.charasvarchar = 0 ; 追踪从固定长度的字符列里剥离的空格. <BR>; 可能对 Informix SE 用户有效. <BR>ifx.blobinfile = 0 ; 若打开，text和byte blobs 的内容被导出到一个文件 <BR>; 而不是保存到内存. <BR>ifx.nullformat = 0 ; NULL（空）被作为空字段返回，除非，这里被设为1. <BR>; 这种情况下（为1），NULL作为字串NULL返回. </P>
<P>[Session] <BR>session.save_handler = files ; 用于保存/取回数据的控制方式 <BR>session.save_path = C:\win\temp ; 在 save_handler 设为文件时传给控制器的参数， <BR>; 这是数据文件将保存的路径. <BR>session.use_cookies = 1 ; 是否使用cookies <BR>session.name = PHPSESSID <BR>; 用在cookie里的session的名字 <BR>session.auto_start = 0 ; 在请求启动时初始化session <BR>session.cookie_lifetime = 0 ; 为按秒记的cookie的保存时间， <BR>; 或为0时，直到浏览器被重启 <BR>session.cookie_path = / ; cookie的有效路径 <BR>session.cookie_domain = ; cookie的有效域 <BR>session.serialize_handler = php ; 用于连接数据的控制器 <BR>; php是 PHP 的标准控制器. <BR>session.gc_probability = 1 ; 按百分比的'garbage collection（碎片整理）'进程 <BR>; 在每次 session 初始化的时候开始的可能性. <BR>session.gc_maxlifetime = 1440 ; 在这里数字所指的秒数后，保存的数据将被视为 <BR>; '碎片(garbage)'并由gc 进程清理掉. <BR>session.referer_check = ; 检查 HTTP引用以使额外包含于URLs中的ids无效 <BR>session.entropy_length = 0 ; 从文件中读取多少字节 <BR>session.entropy_file = ; 指定这里建立 session id <BR>; session.entropy_length = 16 <BR>; session.entropy_file = /dev/urandom <BR>session.cache_limiter = nocache ; 设为{nocache,private,public},以决定 HTTP 的 <BR>; 缓存问题 <BR>session.cache_expire = 180 ; 文档在 n 分钟后过时 <BR>session.use_trans_sid = 1 ; 使用过渡性的 sid 支持，若编译时许可了 <BR>; --enable-trans-sid <BR>url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" <BR>作者: feifengxlq 发布日期: 2005-10-02 <BR>[MSSQL] <BR>;extension=php_mssql.dll <BR>mssql.allow_persistent = On ; 允许或禁止 持久连接 <BR>mssql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>mssql.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>mssql.min_error_severity = 10 ; 显示的错误的最低严重性 <BR>mssql.min_message_severity = 10 ; 显示的消息的最低重要性 <BR>mssql.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模式. </P>
<P>[Assertion] <BR>; ？？？？？ <BR>;assert.active = On ; ？assert(expr); active by default <BR>;assert.warning = On ; issue a PHP warning for each failed assertion. <BR>;assert.bail = Off ; don't bail out by default. <BR>;assert.callback = 0 ; user-function to be called if an assertion fails. <BR>;assert.quiet_eval = 0 ; eval the expression with current error_reporting(). set to true if you want error_reporting(0) around the eval(). </P>
<P>[Ingres II] <BR>ii.allow_persistent = On ; 允许或禁止 持久连接 <BR>ii.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制 <BR>ii.max_links = -1 ; 连接的最大数目（持久和非持久）.-1 代表无限制 <BR>ii.default_database = ; 默认 database (format : [node_id::]dbname[/srv_class] <BR>ii.default_user = ; 默认 user <BR>ii.default_password = ; 默认 password </P>
<P>[Verisign Payflow Pro] <BR>pfpro.defaulthost = "test.signio.com" ; 默认的 Signio 服务器 <BR>pfpro.defaultport = 443 ; 连接的默认端口 <BR>pfpro.defaulttimeout = 30 ; 按秒计的默认超时时间 </P>
<P>; pfpro.proxyaddress = ; 默认的代理的 IP 地址（如果需要） <BR>; pfpro.proxyport = ; 默认的代理的端口 <BR>; pfpro.proxylogon = ; 默认的代理的登录（logon 用户名） <BR>; pfpro.proxypassword = ; 默认的代理的密码 </P>
<P>[Sockets] <BR>sockets.use_system_read = On ; 使用系统的read() 函数替代 php_read()封装 <BR>; Local Variables: （局部变量） <BR>; tab-width: 4 <BR>; End: <BR>------- <BR>作者: xlmo 发布日期: 2005-10-05 <BR>很好的东西。 <BR>作者: hosander 发布日期: 2005-10-08 <BR>初学者必需品 <BR>作者: 61.51.142.* 发布日期: 2005-10-08 <BR>hao <BR>very good<BR>&nbsp;<BR>作者: Per 发布日期: 2005-10-14 <BR>利害，不错，鼎鼎 <BR>作者: abtclhyc 发布日期: 2005-10-26 <BR>谢谢你的翻译，我自己只能看懂一部分，顶顶顶！！ <BR>作者: zhangshun 发布日期: 2005-11-10 <BR>楼主辛苦了<BR>我们还可以深入的研究。比如：<BR>1、output_buffering = On 时，即使页面已经有内容输出我们依然可以使用header("Location: xxx.php")<BR>2、要想让表单可以上传1G的数据，这两个参数都得改：upload_max_filesize 和 post_max_size<BR>3、如果从SQL Server数据库里取出大于4096字节的数据，那么mssql.textlimit和mssql.textsize都得改，否则就会被截断。<BR>4、现在默认支持的数据库已经由mysql改为sqlite了。<BR>5 、现在要支持mysql，不但需要extension=php_mysql.dll，有时候还需要把“libmySQL.dll”拷贝到系统目录下，不然怎么也加载不了。<BR>…… <BR>作者: galaxyz 发布日期: 2005-11-11 <BR>不错！<BR>要是早有人翻译就好了</P>
<P>想当初我可是对着PHP、MySQL和Apache的英文资料将这三个配置成功的<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/25165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-23 10:12 <a href="http://www.blogjava.net/jackywjj/articles/25165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP经典的给图片加水印程序</title><link>http://www.blogjava.net/jackywjj/articles/25154.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 23 Dec 2005 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/25154.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/25154.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/25154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/25154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/25154.html</trackback:ping><description><![CDATA[<P>如果对PHP的GD库比较熟悉，看懂这篇文章一点都不难了! <BR>&lt;?php <BR>/****************************************************************************** </P>
<P>参数说明: <BR>$max_file_size&nbsp; : 上传文件大小限制, 单位BYTE <BR>$destination_folder : 上传文件路径 <BR>$watermark&nbsp;&nbsp; : 是否附加水印(1为加水印,其他为不加水印); </P>
<P>使用说明: <BR>1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用到GD库; <BR>2. 将extension_dir =改为你的php_gd2.dll所在目录; <BR>******************************************************************************/ </P>
<P>//上传文件类型列表 <BR>$uptypes=array( <BR>&nbsp;&nbsp;&nbsp; 'image/jpg', <BR>&nbsp;&nbsp;&nbsp; 'image/jpeg', <BR>&nbsp;&nbsp;&nbsp; 'image/png', <BR>&nbsp;&nbsp;&nbsp; 'image/pjpeg', <BR>&nbsp;&nbsp;&nbsp; 'image/gif', <BR>&nbsp;&nbsp;&nbsp; 'image/bmp', <BR>&nbsp;&nbsp;&nbsp; 'image/x-png' <BR>); </P>
<P>$max_file_size=2000000;&nbsp;&nbsp;&nbsp;&nbsp; //上传文件大小限制, 单位BYTE <BR>$destination_folder="uploadimg/"; //上传文件路径 <BR>$watermark=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //是否附加水印(1为加水印,其他为不加水印); <BR>$watertype=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //水印类型(1为文字,2为图片) <BR>$waterposition=1;&nbsp;&nbsp;&nbsp;&nbsp; //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居中); <BR>$waterstring="<A href="http://www.xplore.cn/">http://www.xplore.cn/</A>";&nbsp; //水印字符串 <BR>$waterimg="xplore.gif";&nbsp;&nbsp;&nbsp; //水印图片 <BR>$imgpreview=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //是否生成预览图(1为生成,其他为不生成); <BR>$imgpreviewsize=1/2;&nbsp;&nbsp;&nbsp; //缩略图比例 <BR>?&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;ZwelL图片上传程序&lt;/title&gt; <BR>&lt;style type="text/css"&gt; <BR>&lt;!-- <BR>body <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp; font-size: 9pt; <BR>} <BR>input <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp; background-color: #66CCFF; <BR>&nbsp;&nbsp;&nbsp;&nbsp; border: 1px inset #CCCCCC; <BR>} <BR>--&gt; <BR>&lt;/style&gt; <BR>&lt;/head&gt; </P>
<P>&lt;body&gt; <BR>&lt;form enctype="multipart/form-data" method="post" name="upform"&gt; <BR>&nbsp; 上传文件: <BR>&nbsp; &lt;input name="upfile" type="file"&gt; <BR>&nbsp; &lt;input type="submit" value="上传"&gt;&lt;br&gt; <BR>&nbsp; 允许上传的文件类型为:&lt;?=implode(', ',$uptypes)?&gt; <BR>&lt;/form&gt; </P>
<P>&lt;?php <BR>if ($_SERVER['REQUEST_METHOD'] == 'POST') <BR>{ <BR>&nbsp;&nbsp;&nbsp; if (!is_uploaded_file($_FILES["upfile"][tmp_name])) <BR>&nbsp;&nbsp;&nbsp; //是否存在文件 <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "图片不存在!"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; $file = $_FILES["upfile"]; <BR>&nbsp;&nbsp;&nbsp; if($max_file_size &lt; $file["size"]) <BR>&nbsp;&nbsp;&nbsp; //检查文件大小 <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "文件太大!"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; if(!in_array($file["type"], $uptypes)) <BR>&nbsp;&nbsp;&nbsp; //检查文件类型 <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "文件类型不符!".$file["type"]; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; if(!file_exists($destination_folder)) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mkdir($destination_folder); <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; $filename=$file["tmp_name"]; <BR>&nbsp;&nbsp;&nbsp; $image_size = getimagesize($filename); <BR>&nbsp;&nbsp;&nbsp; $pinfo=pathinfo($file["name"]); <BR>&nbsp;&nbsp;&nbsp; $ftype=$pinfo['extension']; <BR>&nbsp;&nbsp;&nbsp; $destination = $destination_folder.time().".".$ftype; <BR>&nbsp;&nbsp;&nbsp; if (file_exists($destination) &amp;&amp; $overwrite != true) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "同名文件已经存在了"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; if(!move_uploaded_file ($filename, $destination)) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "移动文件出错"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; $pinfo=pathinfo($destination); <BR>&nbsp;&nbsp;&nbsp; $fname=$pinfo[basename]; <BR>&nbsp;&nbsp;&nbsp; echo " &lt;font color=red&gt;已经成功上传&lt;/font&gt;&lt;br&gt;文件名:&nbsp; &lt;font color=blue&gt;".$destination_folder.$fname."&lt;/font&gt;&lt;br&gt;"; <BR>&nbsp;&nbsp;&nbsp; echo " 宽度:".$image_size[0]; <BR>&nbsp;&nbsp;&nbsp; echo " 长度:".$image_size[1]; <BR>&nbsp;&nbsp;&nbsp; echo "&lt;br&gt; 大小:".$file["size"]." bytes"; </P>
<P>&nbsp;&nbsp;&nbsp; if($watermark==1) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $iinfo=getimagesize($destination,$iinfo); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $nimage=imagecreatetruecolor($image_size[0],$image_size[1]); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $white=imagecolorallocate($nimage,255,255,255); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $black=imagecolorallocate($nimage,0,0,0); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $red=imagecolorallocate($nimage,255,0,0); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagefill($nimage,0,0,$white); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($iinfo[2]) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $simage =imagecreatefromgif($destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $simage =imagecreatefromjpeg($destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $simage =imagecreatefrompng($destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $simage =imagecreatefromwbmp($destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; die("不支持的文件类型"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagefilledrectangle($nimage,1,$image_size[1]-15,80,$image_size[1],$white); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch($watertype) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:&nbsp;&nbsp; //加水印字符串 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:&nbsp;&nbsp; //加水印图片 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $simage1 =imagecreatefromgif("xplore.gif"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagecopy($nimage,$simage1,0,0,0,0,85,15); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagedestroy($simage1); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($iinfo[2]) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //imagegif($nimage, $destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagejpeg($nimage, $destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagejpeg($nimage, $destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagepng($nimage, $destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagewbmp($nimage, $destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //imagejpeg($nimage, $destination); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //覆盖原上传文件 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagedestroy($nimage); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagedestroy($simage); <BR>&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; if($imgpreview==1) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp; echo "&lt;br&gt;图片预览:&lt;br&gt;"; <BR>&nbsp;&nbsp;&nbsp; echo "&lt;img src=\"".$destination."\" width=".($image_size[0]*$imgpreviewsize)." height=".($image_size[1]*$imgpreviewsize); <BR>&nbsp;&nbsp;&nbsp; echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\"&gt;"; <BR>&nbsp;&nbsp;&nbsp; } <BR>} <BR>?&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; </P>
<P>&nbsp;</P>
<P>最后我觉得有必要说一下给图片加水印的原理： </P>
<P>取得上传的文件信息，建立一个真彩色图象，分配颜色方案并且填充图像。 </P>
<P>通过判断文件类型建立图形，然后把其复制到原建立的图形上，填充并建立rectangle，以备写入imagestring()或是原已经定好的图像 </P>
<P>程序当中判断水印类型：一是字符串，另是增加一个图形对象在上面。<BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/25154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-23 09:41 <a href="http://www.blogjava.net/jackywjj/articles/25154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最令PHP初学者头痛的十四个问题</title><link>http://www.blogjava.net/jackywjj/articles/23498.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 12 Dec 2005 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/23498.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/23498.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/23498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/23498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/23498.html</trackback:ping><description><![CDATA[<P>　　【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']来得到。当然也可以修改自动全局变量为开(php.ini改为 register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。</P>
<P>　　【2】Win32下apache2 用get方法传递中文参数会出错：</P>
<P>　　test.php?a=你好&amp;b=你也好</P>
<P>　　传递参数是会导致一个内部错误<BR>　<BR>　　解决办法:"test.php?a=".urlencode(你好)."&amp;b=".urlencode(你也好)</P>
<P>　　 .............</P>
<P>　　【3】win32下的session不能正常工作</P>
<P>　　php.ini默认的session.save_path = /tmp</P>
<P>　　这显然是linux下的配置，win32下php无法读写session文件导致session无法使用，把它改成一个绝对路径就可以了，例如session.save_path = c:windows emp</P>
<P>　　【4】显示错误信息</P>
<P>　　当php.ini的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示，解决办法是探测或者屏蔽。</P>
<P>　　例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo</P>
<P>　　【5】Win32下mail()不能发送电子邮件</P>
<P>　　在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件，修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)</P>
<P>　　php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器。</P>
<P>　　【6】初装的mysql如果没有设置密码，应该使用update mysql.user set password="yourpassword" where user="root" 修改密码</P>
<P>　　【7】header already sent</P>
<P>　　这个错误通常会在你使用HEADER的时候出现，他可能是几种原因：1，你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！</P>
<P>　　【8】更改php.ini后没有变化</P>
<P>　　重新启动web server，比如IIS，Apache等等，然后才会应用最新的设置。</P>
<P>　　【9】php在2003上面安装（ISAPI的安装方法恳请高手指教）</P>
<P>　　PHP4的php4isapi.dll好像和2003有些冲突，只能用CGI模式安装</P>
<P>　　步骤一，先<A href="http://www.php.net">www.php.net</A> 下在一个安装程序，我是装的是：php-4.2.3-installer.exe，你也可以去找最新的版本，在安装php-4.2.3- installer.exe之前保证你的IIS6.0启动了，并能够访问。安装好以后，在默认网站--＞应用程序配置。</P>
<P>　　步骤二：点击 web服务扩展 --＞新建web服务扩展。</P>
<P>　　步骤三： 扩展名--＞php,然后添加</P>
<P>　　步骤四：找到php.exe的路径添加上去。</P>
<P>　　步骤五： 确定就可以了！<BR>　<BR>　　步骤六： 选择php的服务扩展，然后点击允许。</P>
<P>　　【10】有时候sql语句不起作用，对数据库操作失败，最简便的调试方法，echo那句sql，看看变量的值能得到不。</P>
<P>　　【11】include和require的区别</P>
<P>　　两者没有太大的区别，如果要包含的文件不存在，include提示notice，然后继续执行下面的语句，require提示致命错误并且退出。</P>
<P>　　据我测试，win32平台下它们都是先包含后执行，所以被包含文件里最好不要再有include或require语句，这样会造成目录混乱。或许*nux下情况不同，暂时还没测试。</P>
<P>　　如果一个文件不想被包含多次可以使用include_once或require_once## 读取，写入文档数据。</P>
<P>function r($file_name) {<BR>　<A href='mailto:$filenum=@fopen($file_name,"r'>$filenum=@fopen($file_name,"r</A>");<BR>　@flock($filenum,LOCK_SH);<BR>　<A href="mailto:$file_data=@fread($filenum,filesize($file_name">$file_data=@fread($filenum,filesize($file_name</A>));<BR>　@fclose($filenum);<BR>　return $file_data;<BR>}<BR>function w($file_name,$data,$method="w"){<BR>　<A href="mailto:$filenum=@fopen($file_name,$method">$filenum=@fopen($file_name,$method</A>);<BR>　flock($filenum,LOCK_EX);<BR>　$file_data=fwrite($filenum,$data);<BR>　fclose($filenum);<BR>　return $file_data;<BR>}<BR>　　【12】isset()和empty()的区别</P>
<P>　　两者都是测试变量用的，但是isset()是测试变量是否被赋值，而empty()是测试一个已经被赋值的变量是否为空。</P>
<P>　　如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示，如果一个变量被赋空值，$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真，isset($foo)也返回真，就是说赋空值不会注销一个变量。<BR>　<BR>　　要注销一个变量，可以用 unset($foo)或者$foo=NULL</P>
<P>　　【13】mysql查询语句包含有关键字</P>
<P>　　php查询mysql的时候，有时候mysql表名或者列名会有关键字，这时候查询会有错误。例如表名是order,查询时候会出错，简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别，例如select * from `order`</P>
<P>　　【14】通过HTTP协议一次上传多个文件的方法</P>
<P>　　有两个思路，是同一个方法的两种实现。具体程序还需自己去设计。</P>
<P>　　1、在form中设置多个文件输入框，用数组命名他们的名字，如下：</P>
<P>＜form action="" method=post＞<BR>＜input type=file name=usefile[]＞<BR>＜input type=file name=usefile[]＞<BR>＜input type=file name=usefile[]＞<BR>＜/form＞<BR>　　这样，在服务器端做以下测试：</P>
<P>echo "＜pre＞";<BR>print_r($_FILES);<BR>echo "＜/pre＞";<BR>　　2、在form中设置多个文件输入框，但名字不同，如下：</P>
<P>＜form action="" method=post＞<BR>＜input type=file name=usefile_a＞<BR>＜input type=file name=usefile_b＞<BR>＜input type=file name=usefile_c＞<BR>＜/form＞<BR>　　在服务器端做同样测试：</P>
<P>echo "＜pre＞";<BR>print_r($_FILES);<BR>echo "＜/pre＞";</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/jackywjj/aggbug/23498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-12-12 16:09 <a href="http://www.blogjava.net/jackywjj/articles/23498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP开发框架总结[转]</title><link>http://www.blogjava.net/jackywjj/articles/19654.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Mon, 14 Nov 2005 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/19654.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/19654.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/19654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/19654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/19654.html</trackback:ping><description><![CDATA[收集整理了一些主要的PHP开发框架和CMS系统平台，在此一并作个总结，或许以后会有补充。<BR><BR>开发框架WACT <A href="http://wact.sourceforge.net/" target=_blank><FONT color=#22229c>http://wact.sourceforge.net/</FONT></A>老牌的PHP编程框架，实现了很多企业级的开发模式<BR><BR>Horde <A href="http://www.horde.org/horde/" target=_blank><FONT color=#22229c>http://www.horde.org/horde/</FONT></A>提供了一些常用类库，可以满足参数处理、数据压缩、浏览器检测、链接跟踪以及 MIME。需要PEAR类库的支持，提供了API参考。<BR><BR>Seagull <A href="http://seagull.phpkitchen.com/" target=_blank><FONT color=#22229c>http://seagull.phpkitchen.com/</FONT></A>一个面向对象的PHP开发框架，使用了Pear类库，其主要特性有：运用组件方式、简化数据访问、错误处理机制和权限认证管理等。<BR><BR>studs <A href="http://mojavelinux.com/projects/studs/Jakarta" target=_blank><FONT color=#22229c>http://mojavelinux.com/projects/studs/Jakarta</FONT></A> Struts结构移植过来的PHP开发框架，使用面向对象的开发结构和API，模拟了一个HTTP Servlet容器和使用了PHP服务页面引擎技术<BR><BR>InterJinn <A href="http://www.interjinn.com/" target=_blank><FONT color=#22229c>http://www.interjinn.com/</FONT></A>有很多扩展模块提供下载，可惜配置文件使用的是inc格式<BR><BR>Php.MVC <A href="http://www.phpmvc.net/" target=_blank><FONT color=#22229c>http://www.phpmvc.net/</FONT></A>知名的PHP开发框架 ，基于Java的Struts<BR><BR>Phrame <A href="http://phrame.sourceforge.net/" target=_blank><FONT color=#22229c>http://phrame.sourceforge.net/</FONT></A>虽然不大，但用的很多，也是基于Struts思想<BR><BR>Ambivalence <A href="http://amb.sourceforge.net/" target=_blank><FONT color=#22229c>http://amb.sourceforge.net/</FONT></A>基于Maverick思想实现的PHP开发框架<BR><BR>binarycloud <A href="http://www.binarycloud.com/" target=_blank><FONT color=#22229c>http://www.binarycloud.com/</FONT></A>使用了Smarty模板引擎，文档很完善<BR><BR>Prado <A href="http://www.xisc.com/Zend" target=_blank><FONT color=#22229c>http://www.xisc.com/Zend</FONT></A>获奖作品，基于事件驱动的PHP开发框架<BR><BR>rwfphp <A href="http://www.rwfphp.org/" target=_blank><FONT color=#22229c>http://www.rwfphp.org/</FONT></A>面向对象和事件驱动的php开发框架<BR><BR>Krysalis <A href="http://www.kompletecms.com/" target=_blank><FONT color=#22229c>http://www.kompletecms.com/</FONT></A>把XML文档转换为XHTML文档的PHP系统<BR><BR>FastFrame <A href="http://codejanitor.com/wp/apps/fastframe/" target=_blank><FONT color=#22229c>http://codejanitor.com/wp/apps/fastframe/</FONT></A>可以快速地实现表单提交<BR><BR>Blueshoes <A href="http://www.blueshoes.net/" target=_blank><FONT color=#22229c>http://www.blueshoes.net/</FONT></A>比较先进的一个framework，提供了很多GUI组件<BR><BR>下面这些我也没有详细看Cgiapp <A href="http://weierophinney.net/matthew/downloadFuselogic" target=_blank><FONT color=#22229c>http://weierophinney.net/matthew/downloadFuselogic</FONT></A> <A href="http://www.haltebis.com/index/wakka/main/FuseLogicCopix" target=_blank><FONT color=#22229c>http://www.haltebis.com/index/wakka/main/FuseLogicCopix</FONT></A> <A href="http://copix.aston.fr/logicreate" target=_blank><FONT color=#22229c>http://copix.aston.fr/logicreate</FONT></A> <A href="http://www.logicreate.com/booby" target=_blank><FONT color=#22229c>http://www.logicreate.com/booby</FONT></A> <A href="http://www.nauta.be/booby/" target=_blank><FONT color=#22229c>http://www.nauta.be/booby/</FONT></A> <BR><BR>主要的CMS系统Drupal <A href="http://www.drupal.org/Mambo" target=_blank><FONT color=#22229c>http://www.drupal.org/Mambo</FONT></A> <A href="http://www.mamboportal.com/Nucleus" target=_blank><FONT color=#22229c>http://www.mamboportal.com/Nucleus</FONT></A> <A href="http://nucleuscms.org/Midgard" target=_blank><FONT color=#22229c>http://nucleuscms.org/Midgard</FONT></A> <A href="http://www.midgard-project.org/Pmachine" target=_blank><FONT color=#22229c>http://www.midgard-project.org/Pmachine</FONT></A> <A href="http://www.pmachine.com/PostNuke" target=_blank><FONT color=#22229c>http://www.pmachine.com/PostNuke</FONT></A> <A href="http://www.post-nuke.net/sitellite" target=_blank><FONT color=#22229c>http://www.post-nuke.net/sitellite</FONT></A> <A href="http://www.sitellite.org/" target=_blank><FONT color=#22229c>http://www.sitellite.org/</FONT></A> eZPublish <A href="http://ez.no/limb" target=_blank><FONT color=#22229c>http://ez.no/limb</FONT></A> <A href="http://limb-project.com/" target=_blank><FONT color=#22229c>http://limb-project.com/</FONT></A><img src ="http://www.blogjava.net/jackywjj/aggbug/19654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-11-14 09:51 <a href="http://www.blogjava.net/jackywjj/articles/19654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 php 实现的购物车类</title><link>http://www.blogjava.net/jackywjj/articles/7538.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Tue, 12 Jul 2005 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7538.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7538.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7538.html</trackback:ping><description><![CDATA[<P>&lt;?php</P>
<P>返回的数据形式如下</P>
<P>Array<BR>(<BR>　　[汽车] =&gt; Array<BR>　　　　(<BR>　　　　　　[三菱] =&gt; 20<BR>　　　　　　[本田] =&gt; 500<BR>　　　　)</P>
<P>　　[蛋] =&gt; Array<BR>　　　　(<BR>　　　　　　[鸡蛋] =&gt; 20<BR>　　　　　　[鸭蛋] =&gt; 20<BR>　　　　)<BR>}</P>
<P>######################################################################################*/<BR>class ShopCar{<BR>　　var $carName;<BR>　　var $debug;<BR>　　/**<BR>　　@desc 新建一辆购物车.指定购物车名,如果有,将返回原来的购物车<BR>　　@param String $carName<BR>　　@param Boolean $get<BR>　　@return void<BR>　　*/<BR>　　function ShopCar($carName){<BR>　　　　$this-&gt;carName=$carName;<BR>　　　　if (!isset($_SESSION[$carName])){<BR>　　　　　　$_SESSION[$carName]=array();<BR>　　　　}<BR>　　}<BR>　　/**<BR>　　@desc 向购物车内增加一件商品,类型,商品名,数量,插入成功返回真,否则返回假<BR>　　@param String $type<BR>　　@param String $name<BR>　　@param String $val<BR>　　@return bool<BR>　　*/<BR>　　function addCar($type,$name,$val){<BR>　　　　if(array_key_exists($type,$_SESSION[$this-&gt;carName])){//总类别是否存在..如　汽车 有<BR>　　　　　　if (array_key_exists($name,$_SESSION[$this-&gt;carName][$type])){//分类别是否存在　如　三菱 有<BR>　　　　　　　　if ($this-&gt;debug)echo "&lt;br/&gt;已有{$name}商品,不必增加&lt;br/&gt;";<BR>　　　　　　　　return false;<BR>　　　　　　}else {<BR>　　　　　　　　$_SESSION[$this-&gt;carName][$type][$name]=$val;<BR>　　　　　　}<BR>　　　　}else {<BR>　　　　　　$_SESSION[$this-&gt;carName][$type]=array($name=&gt;$val);<BR>　　　　}<BR>　　　　return true;<BR>　　}<BR>　　/**<BR>　　@desc 编辑商品<BR>　　@param string $type<BR>　　@param string $name<BR>　　@param string $var<BR>　　@return bool<BR>　　*/<BR>　　function editCar($type,$name,$var){<BR>　　　　if (!array_key_exists($name,$_SESSION[$this-&gt;carName][$type])){<BR>　　　　　　if ($this-&gt;debug)echo "&lt;BR&gt;没有{$name}商品,修改失败&lt;br/&gt;";<BR>　　　　　　return false;<BR>　　　　}<BR>　　　　$_SESSION[$this-&gt;carName][$type][$name]=$var;<BR>　　　　return true;<BR>　　}<BR>　　/**<BR>　　@desc 删除类别<BR>　　@param string $type<BR>　　@return bool<BR>　　*/　　<BR>　　function delCarType($type){<BR>　　　　if (!array_key_exists($type,$_SESSION[$this-&gt;carName])){<BR>　　　　　　if ($this-&gt;debug)echo "&lt;br/&gt;没有{$type}类别,删除失败&lt;br/&gt;";<BR>　　　　　　return false;<BR>　　　　}<BR>　　　　unset($_SESSION[$this-&gt;carName][$type]);<BR>　　　　return true;<BR>　　}<BR>　　/**<BR>　　@desc 删除商品<BR>　　@param string $type<BR>　　@param string $name<BR>　　@return bool<BR>　　*/　　<BR>　　function delCarPro($type,$name){<BR>　　　　if (!array_key_exists($name,$_SESSION[$this-&gt;carName][$type])){<BR>　　　　　　if ($this-&gt;debug)echo "&lt;br/&gt;没有{$name}商品,删除失败&lt;br/&gt;";<BR>　　　　　　return false;<BR>　　　　}<BR>　　　　unset($_SESSION[$this-&gt;carName][$type][$name]);　　　　<BR>　　　　return true;<BR>　　}<BR>　　/**<BR>　　@desc 删除此购物车<BR>　　@return bool<BR>　　*/　　<BR>　　function delCar(){<BR>　　　　session_unregister($this-&gt;carName);<BR>　　}<BR>　　/**<BR>　　@desc 获得购物车数据<BR>　　@return array[array[]]<BR>　　*/　　<BR>　　function getCarData(){<BR>　　　　return $_SESSION[$this-&gt;carName];<BR>　　}<BR>}<BR>?&gt;</P><img src ="http://www.blogjava.net/jackywjj/aggbug/7538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-12 12:50 <a href="http://www.blogjava.net/jackywjj/articles/7538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Eclipse开发PHP项目</title><link>http://www.blogjava.net/jackywjj/articles/7392.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 08 Jul 2005 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7392.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7392.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7392.html</trackback:ping><description><![CDATA[<P>一、安装<BR>&nbsp;&nbsp;&nbsp; 初次使用Eclipse开发PHP项目，安装还是得花费一定的时间的，仔细看一下本文，可以节约不少时间。首先。Eclipse项目是用Java开发的，所以需要在Java的虚拟机上运行，而Eclipse缺省是没有带虚拟机的，所以如果你的机器上没有安装Java虚拟机（一般的Windows机器上都没安装），你先得安装一个，在这里顺便说一下，安装Java虚拟机有J2SDK和J2RE供选择，J2SDK中包含有J2RE，另外开有供Java开发者使用的源程序、文档等，比J2RE大多了，Eclipse的运行只要J2RE支援就可以了，所以建议安装一个J2RE，版本根据Eclipse的说明,J2RE1.3.1以上就可以了，一般从网上下载的是J2RE1.4.x。<BR>&nbsp;&nbsp;&nbsp; Eclipse是一个很优秀的开发环境，对Java的支持是最强大的，但是他设计成了一个面向插件的结构，给它再安装一个插件，他就可以很好地开发C++程序或PHP程序了，甚至是UML。在这里，下面我们就要用到Eclipse的插件，名字叫PHPEclipse。这个插件提供了创建PHP工程，PHP语法加亮，PHP代码自动补全、以及从帮助中呼出PHP文档等很实用的功能，还有一个值得一提的是，用PHP开发的一般是WEB网页，这个插件带了一个PHPBrowser，当你保存PHP程序时，网页自动刷新，这就使得省得你每次修改了程序代码想看一下运行结果都要切换到另一个窗口去刷新一个的麻烦。当然，我觉得用Eclipse的Console窗口运行PHP程序感觉也很好，能够有在WIN2000命令提示符下的感觉，不像在Zend Studio或Edit plus等其它的软件，非等到全部程序都运行完了才把结果显示出来，感觉真是很爽。当然要想运行基于Web的PHP程序，Apache,IIS你得自己安装，PHP也得你自已安装和配置，PHPEclipse是不会为你包办的，更别指望Eclipse了，也许它并不知道什么叫PHP呢！不过，有一个wampp软件包，把它下载下来一解压什么都搞定了，PHPEclipse正是和它相配合的。<BR>&nbsp;&nbsp;&nbsp; 说了这么多，也许早就把你说得不耐烦了吧，哪有这么麻烦呢？别急，只要你尝到了用Eclipse开发PHP的好处，也许你很快就爱上他了呢！并且，这一切都是免费的，不用打补丁，不用下载注册码-）。<BR>&nbsp;&nbsp;&nbsp; 下面我们就一步一步地来安装吧。<BR>&nbsp;&nbsp;&nbsp; 第一步、下载安装J2RE或J2SDK。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [url=http://java.sun.com/j2se/1.4.2/jre/install-windows.html]J2RE 1.4.2[/url]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [url=http://java.sun.com/j2se/1.4.2/install-windows.html]J2SDK 1.4.2[/url]<BR>&nbsp;&nbsp;&nbsp; 第二步、下载Eclipse<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [url=http://www.eclipse.org/downloads/index.php]Eclipse[/url]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并解压到d:\盘，自动生成eclipse目录<BR>&nbsp;&nbsp;&nbsp; 第三步、下载PHPEclipse<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [url=http://www.phpeclipse.de]PHPEclipse[/url]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并复制到d:\eclipse目录，点击右键，解压到当前目录<BR>&nbsp;&nbsp;&nbsp; 第四步、启动Eclipse<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 双击Eclipse或在命令提示符下输入Eclipse，即可启动Eclipse</P>
<P>&nbsp;&nbsp;&nbsp; 以下的步骤是可选的，建议在第一次安装时候不要做以下操作，等对Eclipse有些熟悉了之后再进行下面的操作，wampp的目的是安装已经配置好的Apache,MySQL,PHP，安装dbg插件的目的是调试PHP程序，这些插件在以后需要的时候安装也是可以的。<BR>&nbsp;&nbsp;&nbsp; 第五步、安装wampp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [url=http://prdownloads.sourceforge.net/xampp/wampp-2.2.zip?download ]wampp2.2[/url]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解压到d:\wampp2目录，安装详见d:\wampp2\wamp-2.2.txt文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按以下修改Apache的配置文件：d:\wampp2\apache\conf\httpd.conf<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Alias /eclipse "/wampp2/eclipse/workspace/"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Directory "/wampp2/eclipse/workspace/"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options Indexes MultiViews<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AllowOverride None<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order allow,deny<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allow from all<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Directory&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把d:\eclipse目录移动到d:\wampp2\eclipse目录，在d:\wampp2下创建一个批处理文件 starteclips.bar，输入下面命令：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eclipse\eclipse.exe -clean<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用这种方式启动eclipse会自动重新装载插件。至此，安装可以结束了。</P>
<P>二、开发PHP项目<BR>&nbsp;&nbsp;&nbsp; 启动eclipse后，用菜单 "new"-&gt;"PHP Project"，可以成功的创建一个PHP项目。<BR>&nbsp;&nbsp;&nbsp; 再"new"-&gt;"file"，就可以创建PHP源程序文件了，可以输入以下代码<BR>&nbsp;&nbsp; [code]<BR>&lt;?</P>
<P>class Foo {<BR>&nbsp; var ＄name = "";<BR>&nbsp; function bar() {<BR>&nbsp;&nbsp;&nbsp; echo "Foo::bar()";<BR>&nbsp; }<BR>}</P>
<P>Foo::bar();<BR>?&gt;<BR>&nbsp;&nbsp; [/code]<BR>&nbsp;&nbsp; PHP的类如Foo和函数bar()系统都可以识别，并在outline窗口中以树形显示出来，这在开发大型项目时十分有用。<BR>&nbsp;&nbsp; 如果安装了wampp，就可以单击"Start Apache"菜单或快捷图标启动Apache，就可以显示出运行的结果了。<BR>&nbsp;&nbsp; 如果你手工安装了PHP，可以在Run/External tools中配置PHP.exe来运行程序，并把结果显示在Console窗口中。</P>
<P>三、PHPUnit<BR>&nbsp;&nbsp; PHPEclipse中包含一个PHPUnit窗口，但我查看了很多关于PHPEclipse的文档，没有找出PHPUnit窗口的用法，希望有知道的写文章告诉大家或发给我一份，不胜感谢。<BR>&nbsp;&nbsp; 经常用PHP开发的人可能知道，在PEAR中有一个PHPUnit2项目，我查到了PHPUnit2的作者Sebastian在2004年12月16日所说的一段话：<BR>&gt;&nbsp; I am the author of PHPUnit2 [1] and recently started using PHPEclipse.<BR>&nbsp;&gt; <BR>&nbsp;&gt;&nbsp; What would be needed in order to get PHPUnit2 support in PHPEclipse?<BR>&nbsp;&gt;&nbsp; AFAICS currently only the outdated PHPUnit that is hosted at SourceForge<BR>&nbsp;&gt;&nbsp; is supported.<BR>&nbsp;&nbsp;&nbsp; A.C.Kramer的回复是：<BR>Sorry for answering so late.<BR>&nbsp;Don"t know exactly why, but your mail slipped through my filters.<BR>&nbsp;<BR>&nbsp;Ali Echihabi [1] has started a first PHPUnit plugin in the CVS module:<BR>&nbsp;net.sourceforge.phpeclipse.phpunit [2]<BR>&nbsp;<BR>&nbsp;I don"t know exactly the current development status,<BR>&nbsp;but I didn"t hear from Ali the last 2 months.<BR>&nbsp;If you are interested in improving the module, I can give you developer <BR>&nbsp;access.<BR>&nbsp;Please let us know if you need further help with the existing CVS module.<BR>&nbsp;&nbsp;&nbsp; 仅供有兴趣的读者参考，在这里我就不翻译了。</P>
<P>四、总结</P>
<P>&nbsp;&nbsp;&nbsp; PHPEclipse利用Eclipse工具，提供了一个方便的PHP开发环境，不仅像Sebastian这样的高手在用，大型的项目也可以获得几乎不逊色于作为Java开发工具的支持能力。<BR>&nbsp;&nbsp;&nbsp; 另外，我也希望PHP Refactor Browser，PHP Unit 等优秀的工具能在PHPEclipse下配合的更好，为PHP的开发者提供一个近乎完美的解决方案。</P>
<P>&nbsp;&nbsp; Jack,PHPMVC2开发者，开发的软件项目有EasyWebOA，网站：<A href="http://www.easyweboa.com">http://www.easyweboa.com</A> blog: <A href="http://www.blogcn.com/user39/chenwumail/index.html">http://www.blogcn.com/user39/chenwumail/index.html</A><BR></P><img src ="http://www.blogjava.net/jackywjj/aggbug/7392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-08 22:51 <a href="http://www.blogjava.net/jackywjj/articles/7392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP4.0+APACHE2.0+MYSQL4.0配置方法</title><link>http://www.blogjava.net/jackywjj/articles/7345.html</link><dc:creator>jacky wu</dc:creator><author>jacky wu</author><pubDate>Fri, 08 Jul 2005 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/jackywjj/articles/7345.html</guid><wfw:comment>http://www.blogjava.net/jackywjj/comments/7345.html</wfw:comment><comments>http://www.blogjava.net/jackywjj/articles/7345.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackywjj/comments/commentRss/7345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackywjj/services/trackbacks/7345.html</trackback:ping><description><![CDATA[<P><FONT color=#0000ff><STRONG>1.下载如下程序，都是免费的，在官方网站都有下</STRONG><BR></FONT>apache_2.0.50-win32-x86-no_ssl.msi<BR>mysql-4.0.20d-win<BR>php-4.3.8-installer.exe</P>
<P><FONT color=#ff0000><EM>注：php有zip压缩的和install的两种版本，强烈建议使用install的版本，否则有时配置完全正确的情况下，apache还是找不到php。</EM></FONT></P>
<P><FONT color=#0000ff><STRONG>2.安装<BR></STRONG></FONT>1）先安装mysql，然后安装apache，最后安装php，因为php安装时有个选择服务器的设置。<BR>mysql安装之后，执行安装目录下bin目录中的winmysqladmin.exe，会提示输入超级用户名和密码，填写即可，然后在右下角托盘右键菜单中选择Install srevice，然后start service即可。</P>
<P><BR>2）apache的安装配置过程中要填写域名之类的地方都可以随便添，因为以后在httpd.conf中都可以改，我都填的是localhost。安装快结束的时候，它会自动配置脚本，但是如果你的机子上装了IIS，都用的80端口，会提示失败，不过没关系，后面配置的时候改端口就行了。</P>
<P><BR>3）php安装的时候选择apache作服务器，另外安装的路径写简单些，如D:\php，要是放在program files这样的目录中，有可能在使用的时候会崩溃。</P>
<P><FONT color=#0000ff><STRONG>3.配置<BR></STRONG></FONT>1）mysql没有什么好说得，启动服务就能用了。<BR>2）打开apache安装路径下的CONF目录，找httpd.conf文件，用文本编辑器打开，修改如下：<BR>把<BR><FONT color=#ff0000>#Listen 12.34.56.78:80<BR>Listen 80</FONT></P>
<P>改成<BR><FONT color=#006400>#Listen 12.34.56.78:8080<BR>Listen 8080</FONT></P>
<P>把<BR><FONT color=#ff0000>#ScriptAlias /cgi-bin/ "D:/Program Files/Apache Group/Apache2/cgi-bin/"&nbsp; 注释掉</FONT></P>
<P>改成<BR><FONT color=#006400>ScriptAlias /php/ "D:/php/"<BR>AddType application/x-httpd-php .php&nbsp; （如果要支持更多的扩展名，可以添加多行，如AddType application/x-httpd-php .php3） <BR>Action application/x-httpd-php "/php/php.exe</FONT></P>
<P><EM><FONT color=#ff0000>注意：反斜杠</FONT></EM></P>
<P>把<BR><FONT color=#ff0000>ServerName localhost:80<BR></FONT>改成<BR><FONT color=#006400>ServerName localhost:8080</FONT></P>
<P>如果你是用的英文版，想要支持中文<BR>在配置文件中找包含“AddLanguage”或“AddCharset”的行，在这些行最前面增加一行(最好“AddCharset”行前)：<BR><FONT color=#006400>AddDefaultCharset GB2312</FONT></P>
<P><FONT color=#ff0000><EM>注：中文版的已经有AddCharset ISO-2022-CN .iso2022-cn .cis这行了，所以不用加。</EM></FONT></P>
<P>apache安装完后默认的虚拟路径是安装目录下的htdocs目录，如果要将其它目录设为虚拟路径，参考最后的附录。</P>
<P>3）将php安装目录中的php4ts.dll拷贝到system32目录下，如XP中拷贝到c:\windows\system32；<BR>然后将BACKUP目录下的PHP.INI拷贝到windows目录中，用文本编辑器打开它，</P>
<P>查找 [MySQL] 字段内的内容.修改如下.</P>
<P><FONT color=#006400>mysql.default_port = 3306 <BR>// 这里是MYSQL的端口.</FONT></P>
<P><FONT color=#006400>mysql.default_host = localhost<BR>// 这里是本地主机.</FONT></P>
<P><FONT color=#006400>mysql.default_user = root<BR>// 这里是超级用户</FONT></P>
<P><FONT color=#006400>mysql.default_password = 123456<BR>// 这里是超级用户密码</FONT></P>
<P>修改到这里就可以让 Php 与 MYSQL 关联了.</P>
<P>&nbsp;</P>
<P>最后启动 PHP 对 MYSQL 模块支持.</P>
<P>查找 <FONT color=#ff0000>;extension</FONT><FONT color=#ff0000>=php_mysql.dll</FONT> 字串.删除掉前面的 <FONT color=#ff0000>;</FONT> 号,变成<BR><FONT color=#006400>extension=php_mysql.dll</FONT></P>
<P>然后找到<FONT color=#ff0000>doc_root</FONT>字段，填入apache的虚拟路径<BR><FONT color=#006400>doc_root =D:\Program Files\Apache Group\Apache2\htdocs</FONT></P>
<P><STRONG><FONT color=#0000ff>4.运行</FONT></STRONG></P>
<P>重启apache，在htdocs目录中放一个PHP文件，如a.php</P>
<P>然后在IE中输入<A href="http://localhost:8080/a.php">http://localhost:8080/a.php</A>就可以看见内容了。</P>
<P><FONT color=#0000ff><STRONG>5.附录：如何改变默认的虚拟路径。</STRONG></FONT></P>
<P>首先我們要在<B> c:\web\</B> 下新增目录，例如<B>www</B><BR>然后在httpd.conf 中作如下改动即可：</P>
<P>－－－－－－－－－改动前－－－－－－－－－－－－－</P>
<P><FONT size=2><I>DocumentRoot <B>"<FONT color=#ff0000>C:/web/Apache/htdocs</FONT>" 原始路徑 </B></I></FONT></P>
<P><I><FONT size=2>#<BR># Each directory to which Apache has access, can be configured with respect<BR># to which services and features are allowed and/or disabled in that<BR># directory (and its subdirectories). <BR>#<BR># First, we configure the "default" to be a very restrictive set of <BR># permissions. <BR>#<BR>&lt; Directory /&gt;<BR><FONT color=#ff0000><B>Options FollowSymLinks<BR>AllowOverride None</B></FONT><BR>&lt; /Directory &gt;</FONT></I></P>
<P><I><FONT size=2>#<BR># Note that from this point forward you must specifically allow<BR># particular features to be enabled - so if something's not working as<BR># you might expect, make sure that you have specifically enabled it<BR># below.<BR>#</FONT></I></P>
<P><I><FONT size=2>#<BR># This should be changed to whatever you set DocumentRoot to.<BR>#<BR>&lt; Directory "<B><FONT color=#ff0000>C:/web/Apache/htdocs</FONT></B>"&gt;</FONT></I></P>
<P><I><FONT size=2>#<BR># This may also be "None", "All", or any combination of "Indexes",<BR># "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".<BR>#<BR># Note that "MultiViews" must be named *explicitly* --- "Options All"<BR># doesn't give it to you.<BR>#<BR><FONT color=#ff0000><B>Options Indexes FollowSymLinks MultiViews</B></FONT></FONT></I></P>
<P><I><FONT size=2>#<BR># This controls which options the .htaccess files in directories can<BR># override. Can also be "All", or any combination of "Options", "FileInfo", <BR># "AuthConfig", and "Limit"<BR>#<BR><FONT color=#ff0000><B>AllowOverride None</B></FONT></FONT></I></P>
<P><I><FONT size=2>#<BR># Controls who can get stuff from this server.<BR>#<BR>Order allow,deny<BR>Allow from all<BR>&lt; / Directory&gt;</FONT></I></P>
<P>－－－－－－－－－－改动后－－－－－－－－－－－－－</P>
<P><FONT size=2>DocumentRoot <B><FONT color=#ff0000>"C:/web/www" </FONT></B></FONT></P>
<P><FONT size=2>#<BR># Each directory to which Apache has access, can be configured with respect<BR># to which services and features are allowed and/or disabled in that<BR># directory (and its subdirectories). <BR>#<BR># First, we configure the "default" to be a very restrictive set of <BR># permissions. <BR>#<BR>&lt; Directory /&gt;<BR></FONT><FONT size=2><FONT color=#ff0000><B>Options All<BR>AllowOverride None</B></FONT><BR>&lt; /Directory&gt;</FONT></P>
<P><FONT size=2>#<BR># Note that from this point forward you must specifically allow<BR># particular features to be enabled - so if something's not working as<BR># you might expect, make sure that you have specifically enabled it<BR># below.<BR>#</FONT></P>
<P><FONT size=2>#<BR># This should be changed to whatever you set DocumentRoot to.<BR>#<BR><FONT color=#ff0000><B>&lt; Directory "C:/web/www"&gt;</B></FONT></FONT></P>
<P><FONT size=2>#<BR># This may also be "None", "All", or any combination of "Indexes",<BR># "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".<BR>#<BR># Note that "MultiViews" must be named *explicitly* --- "Options All"<BR># doesn't give it to you.<BR>#<BR><B><FONT color=#ff0000>Options All</FONT></B></FONT></P>
<P><FONT size=2>#<BR># This controls which options the .htaccess files in directories can<BR># override. Can also be "All", or any combination of "Options", "FileInfo", <BR># "AuthConfig", and "Limit"<BR>#<BR><FONT color=#ff0000><B>AllowOverride All</B></FONT></FONT></P>
<P><FONT size=2>#<BR># Controls who can get stuff from this server.<BR>#<BR><B><FONT color=#ff0000>Order allow,deny<BR>Allow from all</FONT></B><BR>&lt; / Directory&gt; </FONT></P>
<P><FONT size=2>#<BR># UserDir: The name of the directory which is appended onto a user's home<BR># directory if a ~user request is received.<BR>#<BR># Under Win32, we do not currently try to determine the home directory of<BR># a Windows login, so a format such as that below needs to be used. See<BR># the UserDir documentation for details.<BR>#<BR>&lt; IfModule mod_userdir.c&gt;<BR><B><FONT color=#ff0000>UserDir "C:/web/www/"</FONT></B><BR>&lt; /IfModule&gt;</FONT></P>
<P><FONT color=#0000ff><STRONG>6.附录：如何设置默认启动页</STRONG></FONT></P>
<P>同样在HTTPD.CONF中</P>
<P>找到下面字段并加上你要的文件名，<FONT color=#ff0000>注意：</FONT>每个文件名之间要加一个空格</P>
<P><FONT size=2>&lt; IfModule mod_dir.c&gt;<BR><FONT color=#ff0000><B>DirectoryIndex index.html index.htm index.php index.php3</B></FONT><BR>&lt; /IfModule&gt;<BR><BR>PS:在安装Apache时最好将IIS停止,否则服务可能安装不上</FONT></P><img src ="http://www.blogjava.net/jackywjj/aggbug/7345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackywjj/" target="_blank">jacky wu</a> 2005-07-08 11:43 <a href="http://www.blogjava.net/jackywjj/articles/7345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>