??xml version="1.0" encoding="utf-8" standalone="yes"?> 1,下蝲eclipse中php的插?br />地址Q?a >http://www.phpeclipse.de/tiki-view_articles.php 2,解压~。plugins文g夹下内容copy至eclipse\plugins文g夹下Qfeatures文g夹下内容copy至eclipse\features文g夹下?/p>
使用Eclipse环境来编写PHPE序Q以下是详细说明。有基础的朋友可以不看?/p>
单介l: 使用前提Q?br />已正搭建安装了AMPQA=Apache, M=Mysql, P=PHPQ环境,操作pȝq_不限 下蝲Q?br />Eclipse3.0.1: http://www.eclipse.org/downloads/index.php PHPeclipse插gQ?http://sourceforge.net/project/ showfiles.php?group_id=57621 安装Q?br />均ؓl色软gQ无d? 配置Q?br />1、Eclipse启动比较慢,在硬仉|比较好的机器上也需要好几秒钟,误心{待。首ơ启动会让你选择工作目录(workspace)Q制定后打个勾下ơ就不会再问?br />2、另外指定一个用来放|PHP目的目录,如果不指定默认就在workspace的子目录下,最好事先想好名字,比如我的Qworkspace/phpeclipse 使用Q?br />菜单Q?gt;newQ?gt;ProjectQ?gt;PHPQ?gt;PHP ProjectQ指定一个名字,然后可以用了,不过要注意跟前面的别名部分对应,否则无法讉K 关于在Eclipse中加入PHP插g的更详细内容可以参考这文章(英文Q:
http://prdownloads.sourceforge.net/phpeclipse/PHPEclipse1.1.3-2005-01-29.zip?use_mirror=jaist
EclipseQ著名开源YӞIDEQ广泛用于Java开发等?br />加上相应插g后,可支持大部分~程语言?/p>
(选择适合你系l的相应版本Q支持windows,linux,max{,选择最新版?.0.1)
(同上Q最新版?.1.2)
下载回来的Eclipse压羃包解开Q放到常用安装Y件文件夹卛_Q请勿急着马上启动EclipseQ?br />PHPeclipse插gQ下载的压羃包内有features及plugins两个文g夹,跟Eclipse目录下的一P应该是对应的Q解压到Eclipse相应目录下即?br />注意Q?br />如果已经事先安装qEclipse或者在未解压插件之前已l启动过Q因为它W一ơ启动会扫描全部xml文gq缓存以加快启动速度Q所以PHP插g不会被马上识别。需要用选项-clean来强行启动一ơ。(win下直接cmd到Eclipse目录再Eclipse.exe –clean卛_Q其他^台类|
3、修改httpd.conf文gQ新Z个指向workspace/phpeclipse的别?Alias)---PHP安装的问题,恕不多述。我q里q是叫phpeclipse。当然如果你把PHP目攑֜DocumentRoot下的话这步就可以省略了?br />4、本ơ启动后会发现菜单和工具栏上多了一些东西(如果你之前用qEclipse的话Q呵呵)
到Window - Preferences ?PHPeclipse Web Development ?PHP中指定一下你的PHP环境中Apache,php,mysql三个执行文g的相应位|,至于参数g默认的就可以了,我用的是Apache2Q修改了一下,启动用:-w -n "Apache2" -k start Q停止用Q?w -n "Apache2" -k stopQ重启用-w -n "Apache2" -k restart
q样工具栏上的那几个apache和mysql的按钮就可以用了?/p>
在Navigator栏的目名称上右击,new一个php file,然后保存QEclipsep动打开web browser昄l果了。相当不错。主要是看中它集成开发的方便性,代码块~,自动完成{众多特性?/p>
http://www.phpbuilder.com/columns/c...921.php3?page=1
PHPeclipse插g的主在 http://phpeclipse.de/ Q安装中如果有问题或者需要更详细的文档可以到上面L寅R?/p>
/**
* cd: mobile
* 描述: 手机信息c?br />* 其他: 偶然 ~写
*/
class mobile{
/**
* 函数名称: getPhoneNumber
* 函数功能: 取手机号
* 输入参数: none
* 函数q回? 成功q回LQ失败返回false
* 其它说明: 说明
*/
function getPhoneNumber(){
if (isset($_SERVER['HTTP_X_NETWORK_INFO'])){
$str1 = $_SERVER['HTTP_X_NETWORK_INFO'];
$getstr1 = preg_replace('/(.*,)(11[d])(,.*)/i','\2',$str1);
Return $getstr1;
}elseif (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID'])){
$getstr2 = $_SERVER['HTTP_X_UP_CALLING_LINE_ID'];
Return $getstr2;
}elseif (isset($_SERVER['HTTP_X_UP_SUBNO'])){
$str3 = $_SERVER['HTTP_X_UP_SUBNO'];
$getstr3 = preg_replace('/(.*)(11[d])(.*)/i','\2',$str3);
Return $getstr3;
}elseif (isset($_SERVER['DEVICEID'])){
Return $_SERVER['DEVICEID'];
}else{
Return false;
}
}
/**
* 函数名称: getHttpHeader
* 函数功能: 取头信息
* 输入参数: none
* 函数q回? 成功q回LQ失败返回false
* 其它说明: 说明
*/
function getHttpHeader(){
$str = '';
foreach ($_SERVER as $key=>$val){
$gstr = str_replace("&","&",$val);
$str.= "$key -> ".$gstr."\r\n";
}
Return $str;
}
/**
* 函数名称: getUA
* 函数功能: 取UA
* 输入参数: none
* 函数q回? 成功q回LQ失败返回false
* 其它说明: 说明
*/
function getUA(){
if (isset($_SERVER['HTTP_USER_AGENT'])){
Return $_SERVER['HTTP_USER_AGENT'];
}else{
Return false;
}
}
/**
* 函数名称: getPhoneType
* 函数功能: 取得手机cd
* 输入参数: none
* 函数q回? 成功q回stringQ失败返回false
* 其它说明: 说明
*/
function getPhoneType(){
$ua = $this->getUA();
if($ua!=false){
$str = explode(' ',$ua);
Return $str[0];
}else{
Return false;
}
}
/**
* 函数名称: isOpera
* 函数功能: 判断是否是opera
* 输入参数: none
* 函数q回? 成功q回stringQ失败返回false
* 其它说明: 说明
*/
function isOpera(){
$uainfo = $this->getUA();
if (preg_match('/.*Opera.*/i',$uainfo)){
Return true;
}else{
Return false;
}
}
/**
* 函数名称: isM3gate
* 函数功能: 判断是否是m3gate
* 输入参数: none
* 函数q回? 成功q回stringQ失败返回false
* 其它说明: 说明
*/
function isM3gate(){
$uainfo = $this->getUA();
if (preg_match('/M3Gate/i',$uainfo)){
Return true;
}else{
Return false;
}
}
/**
* 函数名称: getHttpAccept
* 函数功能: 取得HA
* 输入参数: none
* 函数q回? 成功q回stringQ失败返回false
* 其它说明: 说明
*/
function getHttpAccept(){
if (isset($_SERVER['HTTP_ACCEPT'])){
Return $_SERVER['HTTP_ACCEPT'];
}else{
Return false;
}
}
/**
* 函数名称: getIP
* 函数功能: 取得手机IP
* 输入参数: none
* 函数q回? 成功q回string
* 其它说明: 说明
*/
function getIP(){
$ip=getenv('REMOTE_ADDR');
$ip_ = getenv('HTTP_X_FORWARDED_FOR');
if (($ip_ != "") && ($ip_ != "unknown")){
$ip=$ip_;
}
return $ip;
}
}
?>
"^The"Q表C所有以"The"开始的字符Ԍ"There"Q?The cat"{)Q?
"of despair$"Q表C所以以"of despair"l尾的字W串Q?
"^abc$"Q表C开始和l尾都是"abc"的字W串——呵呵,只有"abc"自己了;
"notice"Q表CZQ何包?notice"的字W串?
象最后那个例子,如果你不使用两个Ҏ字符Q你在表示要查扄串在被查找串的Q意部分——你
q?
不把它定位在某一个顶端?
其它q有'*'Q?+'??'q三个符P表示一个或一序列字符重复出现的次数。它们分别表C“没?
?
更多”,“一ơ或更多”还有“没有或一ơ”。下面是几个例子Q?
"ab*"Q表CZ个字W串有一个a后面跟着零个或若q个b。("a", "ab", "abbb",……)Q?
"ab+"Q表CZ个字W串有一个a后面跟着臛_一个b或者更多;
"ab?"Q表CZ个字W串有一个a后面跟着零个或者一个bQ?
"a?b+$"Q表C在字符串的末尾有零个或一个a跟着一个或几个b?
你也可以使用范围Q用大括hP用以表示重复ơ数的范围?
"ab{2}"Q表CZ个字W串有一个a跟着2个bQ?abb"Q;
"ab{2,}"Q表CZ个字W串有一个a跟着臛_2个bQ?
"ab{3,5}"Q表CZ个字W串有一个a跟着3?个b?
h意,你必L定范围的下限Q如Q?{0,2}"而不?{,2}"Q。还有,你可能注意到
了,'*'Q?+'?
'?'相当?{0,}"Q?{1,}"?{0,1}"?
q有一?¦'Q表C“或”操作:
"hi¦hello"Q表CZ个字W串里有"hi"或?hello"Q?
"(b¦cd)ef"Q表C?bef"?cdef"Q?
"(a¦b)*c"Q表CZ?a""b"混合的字W串后面跟一?c"Q?
'.'可以替代M字符Q?
"a.[0-9]"Q表CZ个字W串有一?a"后面跟着一个Q意字W和一个数字;
"^.{3}$"Q表C有L三个字符的字W串Q长度ؓ3个字W)Q?
Ҏ可C某些字W允许在一个字W串中的某一特定位置出现Q?
"[ab]"Q表CZ个字W串有一?a"?b"Q相当于"a¦b"Q;
"[a-d]"Q表CZ个字W串包含写?a'?d'中的一个(相当?a¦b¦c¦d"?
?[abcd]"Q;
"^[a-zA-Z]"Q表CZ个以字母开头的字符Ԍ
"[0-9]%"Q表CZ个百分号前有一位的数字Q?
",[a-zA-Z0-9]$"Q表CZ个字W串以一个逗号后面跟着一个字母或数字l束?
你也可以在方括号里用'^'表示不希望出现的字符Q?^'应在Ҏ号里的第一位。(如:"%[^a-zA-
Z]%"?
CZ个百分号中不应该出现字母Q?
Z逐字表达Q你必须?^.$()¦*+?{\"q些字符前加上{UdW?\'?
h意在Ҏ号中Q不需要{义字W?
看v来很,但是q些通过常规的函数和变量不是也能够实现吗Q不错,如果你的E序中只有一个自行R的实例,为它
单独定义一个类的确意思不大,但是如果你需要很多自行R实例的时候呢Q但是你E序中的变量传递流会变得相当复
杂,你得时时保证每个自行车实例指定的变量都正的传递给了不同的函数。但是用对象大大降低了你所传递的变量
的数量,因ؓ对象中的处理函数(所谓的Ҏmethod,译者著?自动的认定作用范围就限制在本对象之内Q那么它所能够
操作的对象也限制在了对象范围内。而且对象的定义可以非常容易的包含C同的脚本只用Q(在得到可重用性的?
Ӟq从而保证了每一个自行R的在不同的脚本中工作方式都是一致的?
让我们来创徏一个实际的c,q个cL几乎用在了我站点的每一个页面中Q也怽会从中发现值得参考的东西?
我不知道你是什么情况,但是Ҏ来说Q当我写一个动态Web面的时候,我最痛恨的就是时不时要中断对E序程的?
考,转而思考HTML的合适的表现格式。这样做的结果就是我最l作出来的页面缺吸引力Q因为我没有那么多的_֊
去顾及字体、字受背景、以及文字的颜色。解x法就是:通过PHPcL实现Ҏ本的格式化,从而实现HTML的输出属
性定制?
我把q个cd名ؓ“Style”。其中包含了如下一些对于设|HTML属性至关重要成员变量:
<?php
class Style {
var $text;
var $alink;
var $vlink;
var $link;
var $bgcol;
var $face;
var $size;
var $align;
var $valign;
}
?>
我想你已l对于HTML语法相当熟悉了,以上的变量名是他们在HTML语法中的名字。接下来我ؓcStyle创徏一个名UCؓ
Style的成员函数?
<?php
class Style {
function Style
($text= "#000000",$alink= "#AA00AA",$vlink= "#AA00AA",$link= "#3333FF",$bgcol= "#999999",$face= "Book
Antiqua",$size=3,$align= "CENTER",$valign= "TOP") {
$this->text=$text;
$this->alink=$alink;
$this->vlink=$vlink;
$this->link=$link;
$this->bgcol=$bgcol;
$this->face=$face;
$this->size=$size;
$this->align=$align;
$this->valign=$valign;
}
}
?>
当你在类中创Z个与cd名的成员函数Ӟq个函数会在你每ơ创Z个类的实例的时候被执行Q该函数UCؓ构造函
数。我利用q个机制Q来使实现在每次创徏一个对象的时候,自动的ؓ每个HTML属性变量赋予一个缺省倹{?
<?php $Basic = new Style; ?>
上面的语?=new ClassName;”就是ؓcStyle声明了一个实?Basic?
你可以在声明一个类的实例的同时Q通过传递参数的形式为类中的某个变量指定不同的倹{但是即使你声明只修改其?
一个变量,也得通知指定其他成员变量的倹{从q一Ҏ_cd常规函数是相同的。比如说你要为StylecM的text?
量指定一个缺省g外的|其他的变量你也要指定一遍。不q这q有更简单的Ҏ(实际上这是通常使用的方法,?
有什么新鲜的—译者注)Q就是通过在类中加一个成员函数来改变其中cM某个变量的|
<?php
Function Set($varname,$value) {
$this->$varname=$value;
}
?>
然后Q我们通过如下的代码就可实现对一个对象实例中指定变量值的修改?
<?php $Basic->Set( "size", "2"); ?>
你必M用?>”操作符以声明是一个对象的变量或函数。上面的代码是告诉代码解释器”运?Basic中的Set()成员
函数”。解释器׃知道Q?Basic是cStyle的一个实例,因ؓ我们此前已经声明q了。同h们可以通过如下代码?
用一个实例的变量(如:$Basic->text)
让我们创Z个表头样式对象,其属性与~省值有些不同?
<?php
$Theader= new Style;
$Theader->Set( "text", "#0000FF");
$Theader->Set( "bgcol", "#000000");
?>
到在q里Q够好了吧?现在我的表格头有了蓝色的文字和黑色的北京。我q想要我的表体相对于我的主页而言有些?
灎ͼ文字用黑色的Q而表体中的文字要一些,于是我可以:
<?php
$Tbody=new Style;
$Tbody->Set( "bgcol", "#AAAAAA");
$Tbody->Set( "size",2);
?>
相当不错Q现在我们还能够用他来作什么呢Q问得好Q我很高兴你会问q个问题。我们需要在cM再创建几个成员函?
来是Style可以用到MHTML面对象中。首先我要做的就是,为我的页面设|属性,于是Q?
<?php
function Body() {
PRINT "<BODY BGCOLOR="$this->bgcol" ".
"TEXT="$this->text" ".
"LINK="$this->link" VLINK="$this->vlink" ".
"ALINK="$this->alink"> ";
}
?>
上述代码Qؓ我站点中的所有页面设|了整体风格。其中还设计C一个变量?this”。我们在cM只用q个变量Q解
释器会自动将其理解ؓ我们在引用当前对象本w的一个成员变量。换句话_$this变量在应用中与对象名U?如本例中
?Basic)是等义的。你应该注意到我们在此所做的的确要比用常规函数来实现来得单。我们可以不用向函数传递变?
而在函数中引用这个变量。而通常Q常规函数是通过几个全程变量数组才能够实现这U机制的。不q需要声明的是,所
有对象的变量和成员函数的作用域都是在本对象范围以内的?
试验以下下面的PHP代码Q假设你已经包含了Stylec,qؓ其创Z一个实?BasicQ然后页面中已经有了 ?
<HEAD></HEAD> 标签Q?
<?php $Basic->Body(); ?>
q样我们可以输Z些东西到面中了Q我们可以采用传l的ҎQ但我想做点不同的?Q这个作者故弄玄虚,q默
q头了—译者注Q这是我用的另外一个成员函数TextOutQ?
<?php
function TextOut($message= " ") {
PRINT " "text">$message ";
}
?>
q个函数需要一个参?messageQ?message是你要输出的文字Q该函数会以指定的属性输些文字。我们可以通过?
下方法实玎ͼ
<?php
$Basic->TextOut( "This is my test message");
$Tbody->TextOut( " -- kinda neat, huh?");
?>
注意Q由于这两个函数中间没有输出回R换行Q所以结果将输出到同一行上。而我q想要第二部分的字体更小一
点,q个我在上面?Tbody对象中已l声明了Q这h较安全,$Tbody?Basic唯一的不同还有个$bgcol属性,在这?
没有用到。注意到了程序声明中的?”吗Q这是用来在没有参数传递给函数时函敎ͼ函数p出缺省的不间断空|?
因后q?
到目前ؓ止,我们的工作还没有保存。最后的一个例子说明如何通过一U简单的ҎQ来修改字体的颜色和或大,?
使在一个输法的中间Q也不需要改动整个类。我们加入如下的代码Q?
<?php
function TDOut ($message= " ",$colspan=1) {
PRINT "<TD COLSPAN=$colspan BGCOLOR="$this->bgcol" ".
"ALIGN="$this->align" VALIGN="$this->valign">";
$this->TextOut($message);
PRINT "</TD>
";
}
?>
那么Q讲解就到此为止Q记住我惌我的表格有不同的背景颜色Q我可以q样实现Q?
<TABLE>
<TR>
<?php
$Theader->TDOut( "Name",2);
$Theader->TDOut( "Location",3);
?>
</TR>
<TR>
<?php
$Theader->TDOut( "Last");
$Theader->TDOut( "First");
$Theader->TDOut( "City");
$Theader->TDOut( "State/Province");
$Theader->TDOut( "Country");
?>
</TR>
q里Q你可以看到colspan参数是如何v作用的,如果没有声明Q将会有个缺省?。于是在W一个行“Name”中Q合q?
?列;Location行合q了3列。第二行Q所有的列都被合q成了一个?
我们通过如下方式来实现表体:
<TR>
<?php
$Tbody->TDOut( "Kreisler");
$Tbody->TDOut( "Rod");
$Tbody->TDOut( "Cortlandt");
$Tbody->TDOut( "New York");
$Tbody->TDOut( "USA");
?>
</TR>
但看hg仍然有些J琐Q我们是否可以节省更多的步骤Q那么采用下面的函数Q?
<?php
function TROut($message) { /*And NO comments about fish, please! ;) */
PRINT "<TR>
";
$cells=explode( "|",$message);
$iterations=count($cells);
$i=0;
while ($i<$iterations) {
list($message,$span)=explode( ":",$cells[$i]);
if (strlen($message)<1) $message= " ";
if ($span){
$this->TDOut ($message,$span);
}else{
$this->TDOut ($message);
}
$i++;
}
PRINT "</TR>
";
}
?>
WOWQ看h有些J琐Q我们来分解一下:
W?行根据”|”符号分解一个字W串Qƈ且将分解出来的每个元素都攑ֈ数组$cell中。第四行取得数组的中数组元素?
个数?iterationsQ第6行开始一个@环处理数l中的每个元素。第7行以?”作为分隔符分解一个数l元素,其?
储到$message?span中。第8行检?message是否有倹{如果没有就赋一个缺省倹{第九行查有没有$spanQ就是合q?
不合q单元格Q通过$cell数据中冒号后q有$span来要定Q,如果是这PW?0行调用TDOut函数Q传?message和单
元格个数参数Q如果没有第12行程序单U输?message信息QTDOut函数q~省?来设|?colspan属性)。最后,?
们结束一个表D(通过</tr>)?
或许你看了还有些p涂(不糊涂才?Q到底如何传递给TROut参数才能包括所有的必要信息Q正地格式是Qcelldata
[:colspan]|celldata[:colspan]|......celldata[:colspan]Q用|分隔单元|单元g数据后跟Q号分隔的合q单?
格的数目来指定要扩展本单元格的个数—译者注。)
所以,ȝ一下我们以前所作的工作Q表头和表体可以通过下面的调用来完成Q?
<TABLE>
<?
$Theader->TROut( "Name:2|Address:3");
$Theader->TROut( "First|Last|City|State/Province|Country");
$Tbody->TROut( "Rod|Kreisler|Cortlandt|New York|USA");
?>
</TABLE>
Wow!是不是非常的单?(实际上的非常简单,但是q个作者写的还不以让识到q一炏V也是说给的例子缺?
说服力,我个人就觉得依靠TROutq行代码Q输Z个行q不如样式表来得单。作者v码用一个BBS的例子来说明OOP?
PHP中的用处才有意义。当然了Q作为PHP中OOP的入门课E,本文也算生动了,而且各个斚w讲得也差不多??
如果有单元格中的数据存放在变量中的情冉|么办?只要Join数组可以了Q?
<?php
$message=join($arry, "|");
$Tbody->TROut($message);
?>
当然Q你不能在一个Join中同时输入列扩展的单元格敎ͼ但是你可以再用一个。假设你的数l包?个元素,W?和第4?
分别要扩?个和3个单元格Q你可以通过如下代码实现?#扩展格数参数指定?message?
$newarray=$arry;
$newarray[2]=join(list($newarray[2],"2"),":");
$newarray[4]=join(list($newarray[4],"3"),":");
$message=join($newarray,"|");
$Tbody->TROut($message);
昄Q你可以加入更多的成员函数。如果有人有更好的想法,可以Emaill我Q我会封装更多的代码q发表出来?
$treefile = "demomenu.txt";//讄有菜单结构的文g
if(isset($PATH_INFO))
$script = $PATH_INFO;
else
$script = $SCRIPT_NAME;
//以下囄可截取windows资源理器中的相应位|的?
$img_expand = "tree_expand.gif";//形如资源理器中可扩展节?
$img_collapse = "tree_collapse.gif";//形如资源理器中已扩展节?
$img_line = "tree_vertline.gif";//形如|
$img_split = "tree_split.gif";//形如|-
$img_end = "tree_end.gif";//形如L
$img_leaf = "tree_leaf.gif";//形如o
$img_spc = "tree_space.gif";//I白?
//以下是菜单处理脚?
$maxlevel=0;
$cnt=0;
$fd = fopen($treefile, "r");
if ($fd==0) die("treemenu.inc : Unable to open file ".$treefile);
while ($buffer = fgets($fd, 4096))
{
$tree[$cnt][0]=strspn($buffer,".");
$tmp=rtrim(substr($buffer,$tree[$cnt][0]));
$node=explode("|",$tmp);
$tree[$cnt][1]=$node[0];
$tree[$cnt][2]=$node[1];
$tree[$cnt][3]=$node[2];
$tree[$cnt][4]=0;
if ($tree[$cnt][0] > $maxlevel) $maxlevel=$tree[$cnt][0];
$cnt++;
}
fclose($fd);
for ($i=0; $i<count($tree); $i++)
{
$expand[$i]=0;
$visible[$i]=0;
$levels[$i]=0;
}
if ($p!="")
$explevels = explode("|",$p);
$i=0;
while($i<count($explevels))
{
$expand[$explevels[$i]]=1;
$i++;
}
$lastlevel=$maxlevel;
for ($i=count($tree)-1; $i>=0; $i--)
{
if ( $tree[$i][0] < $lastlevel )
for ($j=$tree[$i][0]+1; $j <= $maxlevel; $j++)
$levels[$j]=0;
if ( $levels[$tree[$i][0]]==0 )
{
$levels[$tree[$i][0]]=1;
$tree[$i][4]=1;
}
else
$tree[$i][4]=0;
$lastlevel=$tree[$i][0];
}
for ($i=0; $i < count($tree); $i++)
if ($tree[$i][0]==1)
$visible[$i]=1;
for ($i=0; $i < count($explevels); $i++)
{
$n=$explevels[$i];
if ( ($visible[$n]==1) && ($expand[$n]==1) )
{
$j=$n+1;
while ( $tree[$j][0] > $tree[$n][0] )
{
if ($tree[$j][0]==$tree[$n][0]+1) $visible[$j]=1;
$j++;
}
}
}
for ($i=0; $i<$maxlevel; $i++)
$levels[$i]=1;
$maxlevel++;
echo "<table cellspacing=0 cellpadding=0 border=0 cols=".($maxlevel+3).">\n";
echo "<tr>";
for ($i=0; $i<$maxlevel; $i++)
echo "<td width=16></td>";
echo "<td width=100%> </td></tr>\n";
$cnt=0;
while ($cnt<count($tree))
{
if ($visible[$cnt])
{
echo "<tr>";
$i=0;
while ($i<$tree[$cnt][0]-1)
{
if ($levels[$i]==1)
echo "<td><a name='$cnt'></a><img src=\"".$img_line."\"></td>";
else
echo "<td><a name='$cnt'></a><img src=\"".$img_spc."\"></td>";
$i++;
}
if ($tree[$cnt][4]==1)
{
echo "<td><img src=\"".$img_end."\"></td>";
$levels[$tree[$cnt][0]-1]=0;
}
else
{
echo "<td><img src=\"".$img_split."\"></td>";
$levels[$tree[$cnt][0]-1]=1;
}
if ($tree[$cnt+1][0]>$tree[$cnt][0])
{
$i=0; $params="?p=";
while($i<count($expand))
{
if ( ($expand[$i]==1) && ($cnt!=$i) || ($expand[$i]==0 && $cnt==$i))
{
$params=$params.$i;
$params=$params."|";
}
$i++;
}
if ($expand[$cnt]==0)
echo "<td><a href=\"".$script.$params."#$cnt\"><img src=\"".$img_expand."\"
border=no></a></td>";
else
echo "<td><a href=\"".$script.$params."#$cnt\"><img src=\"".$img_collapse."\"
border=no></a></td>";
}
else
echo "<td><img src=\"".$img_leaf."\"></td>";
if ($tree[$cnt][2]=="")
echo "<td colspan=".($maxlevel-$tree[$cnt][0]).">".$tree[$cnt][1]."</td>";
else
echo "<td colspan=".($maxlevel-$tree[$cnt][0])."><a href=\"".$tree[$cnt][2]."\"
target=\"".$tree[$cnt][3]."\">".$tree[$cnt][1]."</a></td>";
echo "</tr>\n";
}
$cnt++;
}
echo "</table>\n";
?>
首先我得承认我喜Ƣ计机标准。如果每个h都遵从这个行业的标准Q互联网会是一个更好的?
体。用标准化的数据交换格式才能开攄和独立于q_的计模式切实可行。这是我作为XML?
好者的原因?
q运的是Q我最喜爱的脚本语a不但支持XML而且对其支持正不断加强。PHP可以让我q速将XML文档?
布到互联|上Q收集XML文档的统计信息,XML文档转换成其它格式。例如,我时常用PHP的XML处理
能力来管理我用XML所写的文章和书?
本文中,我将讨论M用PHP内徏的Expat解析器来处理XML文档。通过范例Q我演CExpat的处理方
法。同Ӟ范例可以告诉你如何:
建立你自q处理函数
XML文档转换成你自己的PHP数据l构
介绍Expat
XML的解析器Q同L为XML处理器,可以使程序访问XML文档的结构和内容。Expat是PHP脚本语言?
XML解析器。它同时也运用在其它目中,例如Mozilla、Apache和Perl?
什么是Z事g的解析器Q?
XML解析器的两种基本cdQ?
Z树型的解析器Q将XML文档转换成树型结构。这c解析器分析整篇文章Q同时提供一个API来访?
所产生树的每个元素。其通用的标准ؓDOMQ文档对象模式)?
Z事g的解析器Q将XML文档视ؓ一pd的事件。当一个特D事件发生时Q解析器调用开发者提?
的函数来处理?
Z事g的解析器有一个XML文档的数据集中视图,也就是说它集中在XML文档的数据部分,而不是其
l构。这些解析器从头到尾处理文档Qƈ类gQ元素的开始、元素的l尾、特征数据的开始等{?
Q事仉过回调QcallbackQ函数报告给应用E序。以下是一?Hello-World"的XML文档范例Q?
<greeting>
Hello World
</greeting>
Z事g的解析器报告ؓ三个事gQ?
开始元素:greeting
CDATA的开始,gؓQHello World
l束元素Qgreeting
不像Z树型的解析器Q基于事件的解析器不产生描述文档的结构。在CDATA中Q基于事件的解析?
不会让你得到父元素greeting的信息?
然而,它提供一个更底层的访问,q就使得可以更好地利用资源和更快地访问。通过q种方式Q就?
有必要将整个文档攑օ内存Q而事实上Q整个文档甚臛_以大于实际内存倹{?
Expat是q样的一U基于事件的解析器。当然如果用ExpatQ必要时它一样可以在PHP中生成完全的
原生树结构?
上面Hello-World的范例包括完整的XML格式。但它是无效的,因ؓ既没有DTDQ文档类型定义)与其?
p,也没有内嵌DTD?
对于ExpatQ这q没有区别:Expat是一个不查有效性的解析器,因此忽略M与文档联pȝDTD。但
应注意的是文档仍焉要完整的格式Q否则ExpatQ和其他W合XML标准的解析器一P会随着出错
信息而停止?
作ؓ不检查有效性的解析器,Exapt的快速性和dy性其十分适合互联|程序?
~译Expat
Expat可以~译qPHP3.0.6版本Q或以上Q中。从Apache1.3.9开始,Expat已经作ؓApache的一部分?
在Unixpȝ中,通过-with-xml选项配置PHPQ你可以其~译入PHP?
如果你将PHP~译为Apache的模块,而Expat默认作为Apache的一部分。在Windows中,你则必须要加
载XML动态连接库?
XML范例QXMLstats
了解Expat的函数的一个办法就是通过范例。我们所要讨论的范例是用Expat来收集XML文档的统计数
据?
对于文档中每个元素,以下信息都将被输出:
该元素在文档中用的ơ数
该元素中字符数据的数?
元素的父元素
元素的子元素
注意Qؓ了演C,我们利用PHP来生一个结构来保存元素的父元素和子元素
准备
用于产生XML解析器实例的函数为xml_parser_create()。该实例用于以后的所有函数。这个思\?
常类gPHP中MySQL函数的连接标记。在解析文档前,Z事g的解析器通常要求你注册回调函敎ͼ
用于特定的事件发生时调用。Expat没有例外事gQ它定义了如下七个可能事Ӟ
对象 XML解析函数 描述
元素 xml_set_element_handler() 元素的开始和l束
字符数据 xml_set_character_data_handler() 字符数据的开?
外部实体 xml_set_external_entity_ref_handler() 外部实体出现
未解析外部实?xml_set_unparsed_entity_decl_handler() 未解析的外部实体出现
处理指o xml_set_processing_instruction_handler() 处理指o的出?
记法声明 xml_set_notation_decl_handler() 记法声明的出?
默认 xml_set_default_handler() 其它没有指定处理函数的事?
所有的回调函数必须解析器的实例作为其W一个参敎ͼ此外q有其它参数Q?
对于本文最后的范例脚本。你需要注意的是它既用C元素处理函数又用C字符数据处理函数。元
素的回调处理函数通过xml_set_element_handler()来注册?
q个函数需要三个参敎ͼ
解析器的实例
处理开始元素的回调函数的名U?
处理l束元素的回调函数的名称
当开始解析XML文档Ӟ回调函数必须存在。它们必d义ؓ与PHP手册中所描述的原型一致?
例如QExpat三个参C递给开始元素的处理函数。在脚本范例中,其定义如下:
function start_element($parser, $name, $attrs)
W一个参数是解析器标C,W二个参数是开始元素的名称Q第三参Cؓ包含元素所有属性和值的?
l?
一旦你开始解析XML文档QExpat在遇到开始元素是都将调用你的start_element()函数q将参数传递过
厅R?
XML的Case Folding选项
用xml_parser_set_option()函数Case folding选项关闭。这个选项默认是打开的,使得传递给处理
函数的元素名自动转换为大写。但XML对大写是敏感的Q所以大写对统计XML文档是非帔R?
的)。对于我们的范例Qcase folding选项必须关闭?
解析文档
在完成所有的准备工作后,现在脚本l于可以解析XML文档Q?
Xml_parse_from_file()Q一个自定义的函敎ͼ打开参数中指定的文gQƈ?kb的大进行解?
xml_parse()和xml_parse_from_file()一P当发生错误时Q即XML文档的格式不完全Ӟ会q回
false?
你可以用xml_get_error_code()函数来得到最后一个错误的数字代码。将此数字代码传递给
xml_error_string()函数卛_得到错误的文本信息?
输出XML当前的行敎ͼ使得调试更容易?
在解析的q程中,调用回调函数?
描述文档l构
当解析文档时Q对于Expat需要强调问题的是:如何保持文档l构的基本描qͼ
如前所qͼZ事g的解析器本nq不产生Ml构信息?
不过标签(tag)l构是XML的重要特性。例如,元素序列<book><title>表示的意思不同于
<figure><title>。也是_M作者都会告诉你书名和图名是没有关系的,虽然它们都用
?title"q个术语。因此,Z更有效地使用Z事g的解析器处理XMLQ你必须使用自己的栈
(stacks)或列?lists)来维护文档的l构信息?
Z产生文档l构的镜像,脚本臛_需要知道目前元素的父元素。用Exapt的API是无法实现的Q它?
报告目前元素的事Ӟ而没有Q何前后关pȝ信息。因此,你需要徏立自q栈结构?
脚本范例使用先进后出(FILO)的栈l构。通过一个数l,栈将保存全部的开始元素。对于开始元素处
理函敎ͼ目前的元素将被array_push()函数推到栈的剙。相应的Q结束元素处理函数通过array_pop
()最的元素U走?
对于序列<book><title></title></book>Q栈的填充如下:
开始元素bookQ将"book"赋给栈的W一个元?$stack[0])?
开始元素titleQ将"title"赋给栈的剙($stack[1])?
l束元素titleQ从栈中最剙的元素移?$stack[1])?
l束元素titleQ从栈中最剙的元素移?$stack[0])?
PHP3.0通过一?depth变量手动控制元素的嵌套来实现范例。这׃脚本看v来比较复杂。PHP4.0?
qarray_pop()和array_push()两个函数来脚本看v来更z?
攉数据
Z攉每个元素的信息,脚本需要记住每个元素的事g。通过使用一个全局的数l变?elements?
保存文档中所有不同的元素。数l的目是元素类的实例,?个属性(cȝ变量Q?
$count -该元素在文档中被发现的次?
$chars -元素中字W事件的字节?
$parents -父元?
$childs - 子元?
正如你所看到的,类实例保存在数l中是轻而易丄?
注意QPHP的一个特性是你可以通过while(list() = each())loop遍历整个cȝ构,如同你遍历整个相
应的数组一栗所有的cd量(当你用PHP3.0时还有方法名Q都以字W串的方式输出?
当发C个元素时Q我们需要增加其相应的记数器来跟t它在文档中出现多少ơ。在相应?elements
中的记数元素也要加一?
我们同样要让父元素知道目前的元素是它的子元素。因此,目前元素的名U将会加入到父元素的
$childs数组的项目中。最后,目前元素应该C谁是它的父元素。所以,父元素被加入到目前元?
$parents数组的项目中?
昄l计信息
剩下的代码在$elements数组和其子数l中循环昄其统计结果。这是最单的嵌套循环Q尽输?
正确的结果,但代码既不简z又没有M特别的技巧,它仅仅是一个你可能每天用他来完成工作的?
环?
脚本范例被设计ؓ通过PHP的CGI方式的命令行来调用。因此,l计l果输出的格式ؓ文本格式。如?
你要脚本运用到互联|上Q那么你需要修改输出函数来产生HTML格式?
ȝ
Exapt是PHP的XML解析器。作为基于事件的解析器,它不产生文档的结构描q。但通过提供底层讉KQ?
q就使得可以更好地利用资源和更快地访问?
作ؓ一个不查有效性的解析器,Expat忽略与XML文档q接的DTDQ但如果文档的格式不完整Q它会
随着出错信息而停止?
提供事g处理函数来处理文?
建立自己的事件结构例如栈和树来获得XMLl构信息标记的优炏V?
每天都有新的XMLE序出现Q而PHP对XML的支持也不断加强Q例如,增加了支持基于DOM的XML解析?
LibXMLQ?
有了PHP和ExpatQ你可以ؓ卛_出现的有效、开攑֒独立于^台的标准作准备?
范例
<?
/*****************************************************************************
* 名称QXML解析范例QXML文档信息l计
* 描述
* 本范例通过PHP的Expat解析器收集和l计XML文档的信息(例如Q每个元素出现的ơ数、父元素和子
元素
* XML文g作ؓ一个参?./xmlstats_PHP4.php3 test.xml
* $Requires: Expat 要求QExpat PHP4.0~译为CGI模式
*****************************************************************************/
// W一个参数是XML文g
$file = $argv[1];
// 变量的初始化
$elements = $stack = array();
$total_elements = $total_chars = 0;
// 元素的基本类
class element
{
var $count = 0;
var $chars = 0;
var $parents = array();
var $childs = array();
}
// 解析XML文g的函?
function xml_parse_from_file($parser, $file)
{
if(!file_exists($file))
{
die("Can't find file \"$file\".");
}
if(!($fp = @fopen($file, "r")))
{
die("Can't open file \"$file\".");
}
while($data = fread($fp, 4096))
{
if(!xml_parse($parser, $data, feof($fp)))
{
return(false);
}
}
fclose($fp);
return(true);
}
// 输出l果函数Q方框Ş式)
function print_box($title, $value)
{
printf("\n+%'-60s+\n", "");
printf("|%20s", "$title:");
printf("%14s", $value);
printf("%26s|\n", "");
printf("+%'-60s+\n", "");
}
// 输出l果函数Q行形式Q?
function print_line($title, $value)
{
printf("%20s", "$title:");
printf("%15s\n", $value);
}
// 排序函数
function my_sort($a, $b)
{
return(is_object($a) && is_object($b) ? $b->count - $a->count: 0);
}
function start_element($parser, $name, $attrs)
{
global $elements, $stack;
// 元素是否已在全局$elements数组中?
if(!isset($elements[$name]))
{
// 否-增加一个元素的cd?
$element = new element;
$elements[$name] = $element;
}
// 该元素的记数器加一
$elements[$name]->count++;
// 是否有父元素Q?
if(isset($stack[count($stack)-1]))
{
// 是-父元素赋给$last_element
$last_element = $stack[count($stack)-1];
// 如果目前元素的父元素数组为空Q初始化?
if(!isset($elements[$name]->parents[$last_element]))
{
$elements[$name]->parents[$last_element] = 0;
}
// 该元素的父元素记数器加一
$elements[$name]->parents[$last_element]++;
// 如果目前元素的父元素的子元素数组为空Q初始化?
if(!isset($elements[$last_element]->childs[$name]))
{
$elements[$last_element]->childs[$name] = 0;
}
// 该元素的父元素的子元素记数器加一
$elements[$last_element]->childs[$name]++;
}
// 目前的元素加入到栈?
array_push($stack, $name);
}
function stop_element($parser, $name)
{
global $stack;
// 从栈中将最剙的元素移?
array_pop($stack);
}
function char_data($parser, $data)
{
global $elements, $stack, $depth;
// 增加目前元素的字W数?
$elements[$stack[count($stack)-1]]->chars += strlen(trim($data));
}
// 产生解析器的实例
$parser = xml_parser_create();
// 讄处理函数
xml_set_element_handler($parser, "start_element", "stop_element");
xml_set_character_data_handler($parser, "char_data");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
// 解析文g
$ret = xml_parse_from_file($parser, $file);
if(!$ret)
{
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
// 释放解析?
xml_parser_free($parser);
// 释放协助元素
unset($elements["current_element"]);
unset($elements["last_element"]);
// Ҏ元素的次数排?
uasort($elements, "my_sort");
// ?elements中@环收集元素信?
while(list($name, $element) = each($elements))
{
print_box("Element name", $name);
print_line("Element count", $element->count);
print_line("Character count", $element->chars);
printf("\n%20s\n", "* Parent elements");
// 在该元素的父中@环,输出l果
while(list($key, $value) = each($element->parents))
{
print_line($key, $value);
}
if(count($element->parents) == 0)
{
printf("%35s\n", "[root element]");
}
// 在该元素的子中@环,输出l果
printf("\n%20s\n", "* Child elements");
while(list($key, $value) = each($element->childs))
{
print_line($key, $value);
}
if(count($element->childs) == 0)
{
printf("%35s\n", "[no childs]");
}
$total_elements += $element->count;
$total_chars += $element->chars;
}
// 最l结?
print_box("Total elements", $total_elements);
print_box("Total characters", $total_chars);
?>
;;;;;;;;;;;;;;;;;;;
; 关于q个文g ;
;;;;;;;;;;;;;;;;;;;
; q个文g控制了PHP许多斚w的观?Z让PHPdq个文gQ它必须被命名ؓ
; 'php.ini'.PHP 在q些地方依次查找该文Ӟ当前工作目录Q环境变量PHPRC
; 指明的\径;~译时指定的路径.
; 在windows下,~译时的路径是Windows安装目录.
; 在命令行模式下,php.ini的查找\径可以用 -c 参数替代.
; 该文件的语法非常?I白字符和用分号';'开始的行被单地忽略Q就象你可能
; 猜到的一P. 章节标题Q例?: [Foo]Q也被简单地忽略Q即使将来它们可?
; 有某U的意义.
;
; 指示被指定用如下语法:
; 指示标识W?= ?
; directive = value
; 指示标识W??*大小写敏感的* - foo=bar 不同?FOO = bar.
;
; 值可以是一个字W串Q一个数字,一?PHP 帔R (如: E_ALL or M_PI), INI 帔R中的
; 一?(On, Off, True, False, Yes, No and None) Q或是一个表辑ּ
; (? E_ALL & ~E_NOTICE), 或是用引hh的字W串("foo").
;
; INI 文g的表辑ּ被限制于位运符和括?
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布尔标志可用 1, On, True or Yes q些值置于开的状?
; 它们可用 0, Off, False or No q些值置于关的状?
;
; 一个空字符串可以用在等号后不写M东西表示Q或者用 None 关键?
;
; foo = ; foo|ؓI字W串
; foo = none ; foo|ؓI字W串
; foo = "none" ; foo|ؓ字符?none'
;
; 如果你D|中使用帔RQ而这些常量属于动态调入的扩展库(不是 PHP 的扩展,是
; Zend 的扩展)Q你仅可以调入这些扩展的?之后*使用q些帔R.
;
; 所有在 php.ini-dist 文g里设定的g内徏的默认值相同(q是_如果 php.ini
; 没被使用或者你删掉了这些行Q默认g之相同).
;;;;;;;;;;;;;;;;;;;;
; 语言选项 ;
;;;;;;;;;;;;;;;;;;;;
engine = On
; ?PHP scripting language engineQPHP 脚本语言引擎Q在 Apache下有?
short_open_tag = On
; 允许 tags 被识别.
asp_tags = Off
; 允许ASP-style tags
precision = 14
; 点cd数显C时的有效位?
y2k_compliance = Off
; 是否打开 2000q适应 (可能在非Y2K适应的浏览器中导致问?
output_buffering = Off
; 输出~存允许你甚臛_输出正文内容之后发?headerQ标_包括cookiesQ行
; 其代h输出层减慢一点点速度.你可以用输出缓存在q行时打开输出~存Q?
; 或者在q里指C?On 而得所有文件的输出~存打开.
output_handler = ; 你可以重定向你的脚本的所有输出到一个函敎ͼ
; 那样做可能对处理或以日志记录它有?
; 例如若你这个output_handler 设ؓ"ob_gzhandler",
; 则输Z被透明Cؓ支持gzip或deflate~码的浏览器压羃.
; 设一个输出处理器自动地打开输出~冲.
implicit_flush = Off
; 强制flushQ刷斎ͼ让PHP 告诉输出层在每个输出块之后自动刷新自w数?
; q等效于在每?print() ?echo() 调用和每?HTML 块后调用flush()函数.
; 打开q项讄会导致严重的q行时冲H,仅在debugq程中打开.
allow_call_time_pass_reference = On
; 是否让强q函数调用时按引用传递参?q一Ҏ遭到抗议Q?
; q可能在来版本的PHP/Zend里不再支?
; 受到鼓励的指定哪些参数按引用传递的Ҏ是在函数声明?
; 你被鼓励试关闭q一选项q确认你的脚本仍能正常工作,以保证在来版本的语a?
; 它们仍能工作.Q你在每次使用该特Ҏ得到一个警告,而参数将按D不是按引用
; 传递).
; Safe Mode 安全模式
safe_mode = Off
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
; QSetting certain environment variables
; Qmay be a potential security breach.
; 该指C包含用逗号分隔的前~列表.安全模式中,用户仅可以替?
; 以在此列出的前缀开头的环境变量的?
; 默认圎ͼ用户仅?讑֮以PHP_开头的环境变量Q(? PHP_FOO=BARQ?
; 注意: 如果q一指示为空QPHP 让用户更改L环境变量!
safe_mode_protected_env_vars = LD_LIBRARY_PATH
; q条指示包含一个用逗号分隔的环境变量列表,那是最l用户将不能用putenv () 更改?
; q些变量甚至在safe_mode_allowed_env_vars 讄为允许的情况下得C?
disable_functions =
; q条指示让你可以Z安全的原因让特定函数失效.
; 它接受一个用逗号分隔的函数名列表.
; q条指示 *不受* 安全模式是否打开的媄?
; 语法高亮模式的色?
; 只要能被接受的东西就能工?
highlight.string = #DD0000
highlight.comment = #FF8000
highlight.keyword = #007700
highlight.bg = #FFFFFF
highlight.default = #0000BB
highlight.html = #000000
; Misc 杂项
expose_php = Off
; 军_ PHP 是否标示它装在服务器上的事实Q例如:加在?—PHP—给Web服务
; 发送的信号上).
; Q我个h的意见,在出C么power-by的header的时候,把这x.Q?
; 它不会有安全上的威胁, 但它使检查你的服务器上是否安装了PHP成ؓ了可?
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 30 ; 每个脚本的最大执行时? 按秒?
memory_limit = 8388608 ; 一个脚本最大可使用的内存总量 (q里?MB)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
; 出错控制和登?;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 错误报告是按位的.或者将数字加v来得到想要的错误报告{.
; E_ALL - 所有的错误和警?
; E_ERROR - 致命性运行时?
; E_WARNING - q行时警告(非致命性错Q?
; E_PARSE - ~译时解析错?
; E_NOTICE - q行时提?q些l常是是你的代码的bug引v的,
;也可能是有意的行为造成?(如:Z未初始化的变量自动初始化Z?
;I字W串的事实而用一个未初始化的变量)
; E_CORE_ERROR - 发生于PHP启动时初始化q程中的致命错误
; E_CORE_WARNING - 发生于PHP启动时初始化q程中的警告(非致命性错)
; E_COMPILE_ERROR - ~译时致命性错
; E_COMPILE_WARNING - ~译时警?非致命性错)
; E_USER_ERROR - 用户产生的出错消?
; E_USER_WARNING - 用户产生的警告消?
; E_USER_NOTICE - 用户产生的提醒消?
; 例子:
; error_reporting = E_ALL & ~E_NOTICE ; 昄所有的错误Q除了提?
; error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显C错?
error_reporting = E_ALL & ~E_NOTICE ; 昄所有的错误Q除了提?
display_errors = On ; 昄出错误信?作ؓ输出的一部分)
; 在最l发布的web站点上,强烈你关掉这个特性,q?
; 错误日志代替Q参看下面).
; 在最l发布的web站点l箋?display_errors 有效可能
; 暴露一些有兛_全的信息Q例如你的web服务上的文g路径?
; 你的数据库规划或别的信息.
display_startup_errors = Off ; 甚至当display_erroes打开了,发生于PHP的启动的步骤?
; 的错误也不会被显C?
; 强烈保持?display_startup_errors 关闭Q?
; 除了在改错过E中.
log_errors = Off ; 在日志文仉记录错误Q服务器指定的日志,stderr标准错误输出Q或error_log(下面的)Q?
; 正如上面说明的那P强烈你在最l发布的web站点以日志记录错?
; 取代直接错误输出.
track_errors = Off ; 保存最q一?错误/警告 消息于变?$php_errormsg (boolean)
;error_prepend_string = "" ; 于错误信息前输出的字W串
;error_append_string = "" ; 于错误信息后输出的字W串
;error_log = filename ; 记录错误日志于指定文?
;error_log = syslog ; 记录错误日志于系l日?syslog (NT 下的事g日志, Windows 95下无?
warn_plus_overloading = Off ; 当将?’用于字W串时警?
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
variables_order = "EGPCS" ; q条指示描述了PHP 记录
; GET, POST, Cookie, Environment and Built-in q些变量的顺?
; Q以 G, P, C, E & S 代表Q通常?EGPCS ?GPC 的方式引用).
; 按从左到双录,新值取代旧?
register_globals = On ; 是否这?EGPCS 变量注册为全局变量.
; 若你不想让用h据不在全局范围内q话,你可能想关闭?
; q和 track_vars qv来用更有意义 ?q样你可以通过
; $HTTP_*_VARS[] 数组讉K所有的GPC变量.
register_argc_argv = On ; q条指示告诉 PHP 是否声明 argv和argc 变量
; Q注Q这里argv为数l?argc为变量数Q?
; Q其中包含用GETҎ传来的数据).
; 若你不想用这些变量,你应当关掉它以提高性能.
track_vars = On ; ?HTTP_*_VARS[]数组有效Q这?在用时?
; ENV, POST, GET, COOKIE or SERVER替换
post_max_size = 8M ; PHP接受的POST数据最大大?
gpc_order = "GPC" ; q条指示被h反对.?variables_order 代替.
本站发表的文章版权归PHPchina所有,转蝲者请注明作者和出处Q?
【论坛浏览?【我来说两句?【打印?【大?【中?【小?【关闭?
相关评论
作? feifengxlq 发布日期: 2005-10-02
; Magic quotes
magic_quotes_gpc = On ; 在输入的GET/POST/Cookie数据里用魔术引?
; Q原文就q样Q呵呵,所谓magic quotes 应该是指用{义符加在引用性的控制字符上,?'....Q?
magic_quotes_runtime= Off ; 对运行时产生的数据用魔术引用,
; 例如Q用SQL查询得到的数据,用exec()函数得到的数据,{等
magic_quotes_sybase = Off ; 采用 Sybase形式的魔术引用(?'' 脱出 ' 而不?'Q?
; 自动?PHP 文档之前和之后添加文?
auto_prepend_file =
auto_append_file =
; ?.04b4一PPHP 默认地L?“Content-type:?头标输出一个字W的~码方式.
; 让输出字W集失效Q只要设|ؓI?
; PHP 的内建默认值是 text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path = ; include 路径讄QUNIX: "/path1:/path2" Windows: "\path1;\path2"
doc_root = ; php 面的根路径Q仅在非I时有效
user_dir = ; 告知 php 在?/~username 打开脚本时到哪个目录下去找,仅在非空时有?
;upload_tmp_dir = ; 存放用HTTP协议上蝲的文件的临时目录Q在没指定时使用pȝ默认的)
upload_max_filesize = 2097152 ; 文g上蝲默认地限制ؓ2 Meg
extension_dir = c:\php\ ; 存放可加载的扩充库(模块Q的目录
enable_dl = On ; 是否使dl()有效.
; 在多U程的服务器?dl()函数*不能*很好地工作,
; 例如IIS or ZeusQƈ在其上默认ؓ止
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
file_uploads = On ; 是否允许HTTP方式文g上蝲
;upload_tmp_dir = ; 用于HTTP上蝲的文件的临时目录Q未指定则用系l默认)
upload_max_filesize = 2M ; 上蝲文g的最大许可大?
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;
allow_url_fopen = On ; 是否允许把URLs当作http:.. 或把文g当作ftp:...
;;;;;;;;;;;;;;;;;;;;;;
; 动态扩?;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; 若你希望一个扩展库自动加蝲Q用下面的语法:
; extension=modulename.extension
; 例如Q在windows上,
; extension=msql.dll
; or 在UNIX?
; extension=msql.so
; 注意Q这只应当是模块的名字,不需要目录信息放在里?
; 用上面的 extension_dir 指示指定扩展库的位置.
;Windows 扩展
;extension=php_nsmail.dll
extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
extension=php_gd.dll
;extension=php_dbm.dll
;extension=php_mssql.dll
;extension=php_zlib.dll
;extension=php_filepro.dll
;extension=php_imap4r2.dll
;extension=php_ldap.dll
;extension=php_crypt.dll
;extension=php_msql2.dll
;extension=php_odbc.dll
; 注意Q?MySQL的支持现在是内徏的,因此Q不需要用它的dll
;;;;;;;;;;;;;;;;;;;
; 模块讑֮ ;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[Syslog]
define_syslog_variables = Off ; 是否定义各种的系l日志变?
; 如:$LOG_PID, $LOG_CRON, {等.
; x它是个提高效率的好主?
; q行Ӟ你可以调用函数define_syslog_variables()Q来定义q些变量
[mail function]
SMTP = localhost ;仅用于win32pȝ
sendmail_from = me@localhost.com ;仅用于win32pȝ
;sendmail_path = ;仅用于unix, 也可支持参数Q默认的?sendmail -t -i'Q?
[Debugger]
debugger.host = localhost
debugger.port = 7869
debugger.enabled = False
[Logging]
; q些配置指示用于CZ的日志记录机?
; ?examples/README.logging 以得到更多的解释
;logging.method = db
;logging.directory = /path/to/log/directory
[Java]
;java.class.path = .\php_java.jar
;java.home = c:\jdk
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
;java.library.path = .\
[SQL]
sql.safe_mode = Off
[ODBC]
;uodbc.default_db = Not yet implemented
;uodbc.default_user = Not yet implemented
;uodbc.default_pw = Not yet implemented
uodbc.allow_persistent = On ; 允许或禁?持久q接
uodbc.check_persistent = On ; 在重用前查连接是否还可用
uodbc.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
uodbc.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
uodbc.defaultlrl = 4096 ; 控制 LONG cd的字D?q回变量的字节数Q? 代表通过Q?Q? means passthru
uodbc.defaultbinmode = 1 ; 控制 二进制数?0 代表?????Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char
; 见有?odbc_binmode ?odbc_longreadlen 的文档以得到 uodbc.defaultlrl ?uodbc.defaultbinmode 的解?
[MySQL]
mysql.allow_persistent = On ; 允许或禁?持久q接
mysql.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
mysql.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
mysql.default_port = ; mysql_connect() 使用的默认端口,如不讄Qmysql_connect()
; 用变?$MYSQL_TCP_PORTQ或?etc/services 下的mysql-tcp 条目(unix)Q?
; 或在~译是定义的 MYSQL_PORT(按这L序)
; Win32环境Q将仅检查MYSQL_PORT.
mysql.default_socket = ; 用于本地 MySql q接的默认的套接字名.为空Q?MYSQL 内徏?
mysql.default_host = ; mysql_connect() 默认使用的主机(安全模式下无效)
mysql.default_user = ; mysql_connect() 默认使用的用户名Q安全模式下无效Q?
mysql.default_password = ; mysql_connect() 默认使用的密码(安全模式下无效)
; 注意Q在q个文g下保存密码通常是一??L
; *M*可以使用PHP讉K的用户可以运?
; 'echo cfg_get_var("mysql.default_password")'来显C那个密?
; 而且当然圎ͼM有读该文件权力的用户也能看到那个密码.
[mSQL]
msql.allow_persistent = On ; 允许或禁?持久q接
msql.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
msql.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
[PostgresSQL]
pgsql.allow_persistent = On ; 允许或禁?持久q接
pgsql.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
pgsql.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
[Sybase]
sybase.allow_persistent = On ; 允许或禁?持久q接
sybase.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
sybase.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
;sybase.interface_file = "/usr/sybase/interfaces"
sybase.min_error_severity = 10 ; 昄的错误的最低严重?
sybase.min_message_severity = 10 ; 昄的消息的最低重要?
sybase.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模?若打开Q这导?PHP 自动?
; 把根据结果的 Sybase cd赋予它们Q?
; 而不是把它们全当成字W串.
; q个兼容模式不会永远留着Q?
; 因此Q将你的代码q行需要的修改Q?
; q将该项关闭.
[Sybase-CT]
sybct.allow_persistent = On ; 允许或禁?持久q接
sybct.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
sybct.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
sybct.min_server_severity = 10 ; 昄的错误的最低严重?
sybct.min_client_severity = 10 ; 昄的消息的最低重要?
[bcmath]
bcmath.scale = 0 ; 用于所有bcmath函数?0十进制数数字的个数number of decimal digits for all bcmath functions
[browscap]
;browscap = extra/browscap.ini
browscap = C:\WIN\SYSTEM\inetsrv\browscap.ini
[Informix]
ifx.default_host = ; ifx_connect() 默认使用的主机(安全模式下无效)
ifx.default_user = ; ifx_connect() 默认使用的用户名Q安全模式下无效Q?
ifx.default_password = ; ifx_connect() 默认使用的密码(安全模式下无效)
ifx.allow_persistent = On ; 允许或禁?持久q接
ifx.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
ifx.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
ifx.textasvarchar = 0 ; 若打开Qselect 状态符q回一?‘text blob’字D늚内容Q而不是它的id
ifx.byteasvarchar = 0 ; 若打开Qselect 状态符q回一?‘byte blob’字D늚内容Q而不是它的id
ifx.charasvarchar = 0 ; q踪从固定长度的字符列里剥离的空?
; 可能?Informix SE 用户有效.
ifx.blobinfile = 0 ; 若打开Qtext和byte blobs 的内容被导出C个文?
; 而不是保存到内存.
ifx.nullformat = 0 ; NULLQ空Q被作ؓI字D返回,除非Q这里被设ؓ1.
; q种情况下(?Q,NULL作ؓ字串NULLq回.
[Session]
session.save_handler = files ; 用于保存/取回数据的控制方?
session.save_path = C:\win\temp ; ?save_handler 设ؓ文g时传l控制器的参敎ͼ
; q是数据文g保存的路径.
session.use_cookies = 1 ; 是否使用cookies
session.name = PHPSESSID
; 用在cookie里的session的名?
session.auto_start = 0 ; 在请求启动时初始化session
session.cookie_lifetime = 0 ; 为按U记的cookie的保存时_
; 或ؓ0Ӟ直到览器被重启
session.cookie_path = / ; cookie的有效\?
session.cookie_domain = ; cookie的有效域
session.serialize_handler = php ; 用于q接数据的控制器
; php?PHP 的标准控制器.
session.gc_probability = 1 ; 按百分比?garbage collectionQ碎片整理)'q程
; 在每?session 初始化的时候开始的可能?
session.gc_maxlifetime = 1440 ; 在这里数字所指的U数后,保存的数据将被视?
; '片(garbage)'q由gc q程清理?
session.referer_check = ; ?HTTP引用以额外包含于URLs中的ids无效
session.entropy_length = 0 ; 从文件中d多少字节
session.entropy_file = ; 指定q里建立 session id
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; 设ؓ{nocache,private,public},以决?HTTP ?
; ~存问题
session.cache_expire = 180 ; 文档?n 分钟后过?
session.use_trans_sid = 1 ; 使用q渡性的 sid 支持Q若~译时许可了
; --enable-trans-sid
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
作? feifengxlq 发布日期: 2005-10-02
[MSSQL]
;extension=php_mssql.dll
mssql.allow_persistent = On ; 允许或禁?持久q接
mssql.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
mssql.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
mssql.min_error_severity = 10 ; 昄的错误的最低严重?
mssql.min_message_severity = 10 ; 昄的消息的最低重要?
mssql.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模?
[Assertion]
; Q?Q?Q?
;assert.active = On ; Qassert(expr); active by default
;assert.warning = On ; issue a PHP warning for each failed assertion.
;assert.bail = Off ; don't bail out by default.
;assert.callback = 0 ; user-function to be called if an assertion fails.
;assert.quiet_eval = 0 ; eval the expression with current error_reporting(). set to true if you want error_reporting(0) around the eval().
[Ingres II]
ii.allow_persistent = On ; 允许或禁?持久q接
ii.max_persistent = -1 ; 持久q接的最大数.-1 代表无限?
ii.max_links = -1 ; q接的最大数目(持久和非持久Q?-1 代表无限?
ii.default_database = ; 默认 database (format : [node_id::]dbname[/srv_class]
ii.default_user = ; 默认 user
ii.default_password = ; 默认 password
[Verisign Payflow Pro]
pfpro.defaulthost = "test.signio.com" ; 默认?Signio 服务?
pfpro.defaultport = 443 ; q接的默认端?
pfpro.defaulttimeout = 30 ; 按秒计的默认时旉
; pfpro.proxyaddress = ; 默认的代理的 IP 地址Q如果需要)
; pfpro.proxyport = ; 默认的代理的端口
; pfpro.proxylogon = ; 默认的代理的dQlogon 用户名)
; pfpro.proxypassword = ; 默认的代理的密码
[Sockets]
sockets.use_system_read = On ; 使用pȝ的read() 函数替代 php_read()装
; Local Variables: Q局部变量)
; tab-width: 4
; End:
-------
作? xlmo 发布日期: 2005-10-05
很好的东ѝ?
作? hosander 发布日期: 2005-10-08
初学者必需?
作? 61.51.142.* 发布日期: 2005-10-08
hao
very good
作? Per 发布日期: 2005-10-14
利害Q不错,鼎鼎
作? abtclhyc 发布日期: 2005-10-26
谢谢你的译Q我自己只能看懂一部分Q顶剙Q!
作? zhangshun 发布日期: 2005-11-10
g辛苦?BR>我们q可以深入的研究。比如:
1、output_buffering = On Ӟ即ə面已经有内容输出我们依然可以用header("Location: xxx.php")
2、要惌表单可以上传1G的数据,q两个参数都得改Qupload_max_filesize ?post_max_size
3、如果从SQL Server数据库里取出大于4096字节的数据,那么mssql.textlimit和mssql.textsize都得改,否则׃被截断?BR>4、现在默认支持的数据库已l由mysql改ؓsqlite了?BR>5 、现在要支持mysqlQ不但需要extension=php_mysql.dllQ有时候还需要把“libmySQL.dll”拷贝到pȝ目录下,不然怎么也加载不了?BR>…?
作? galaxyz 发布日期: 2005-11-11
不错Q?BR>要是早有人翻译就好了
惛_初我可是对着PHP、MySQL和Apache的英文资料将q三个配|成功的
参数说明:
$max_file_size : 上传文g大小限制, 单位BYTE
$destination_folder : 上传文g路径
$watermark : 是否附加水印(1为加水印,其他Z加水?;
使用说明:
1. PHP.INI文g里面?extension=php_gd2.dll"一行前面的;号去?因ؓ我们要用到GD?
2. extension_dir =改ؓ你的php_gd2.dll所在目?
******************************************************************************/
//上传文gcd列表
$uptypes=array(
'image/jpg',
'image/jpeg',
'image/png',
'image/pjpeg',
'image/gif',
'image/bmp',
'image/x-png'
);
$max_file_size=2000000; //上传文g大小限制, 单位BYTE
$destination_folder="uploadimg/"; //上传文g路径
$watermark=1; //是否附加水印(1为加水印,其他Z加水?;
$watertype=1; //水印cd(1为文?2为图?
$waterposition=1; //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居?;
$waterstring="$waterimg="xplore.gif"; //水印囄
$imgpreview=1; //是否生成预览?1为生?其他Z生成);
$imgpreviewsize=1/2; //~略图比?
?>
<html>
<head>
<title>ZwelL囄上传E序</title>
<style type="text/css">
<!--
body
{
font-size: 9pt;
}
input
{
background-color: #66CCFF;
border: 1px inset #CCCCCC;
}
-->
</style>
</head>
<body>
<form enctype="multipart/form-data" method="post" name="upform">
上传文g:
<input name="upfile" type="file">
<input type="submit" value="上传"><br>
允许上传的文件类型ؓ:<?=implode(', ',$uptypes)?>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if (!is_uploaded_file($_FILES["upfile"][tmp_name]))
//是否存在文g
{
echo "囄不存?";
exit;
}
$file = $_FILES["upfile"];
if($max_file_size < $file["size"])
//查文件大?
{
echo "文g太大!";
exit;
}
if(!in_array($file["type"], $uptypes))
//查文件类?
{
echo "文gcd不符!".$file["type"];
exit;
}
if(!file_exists($destination_folder))
{
mkdir($destination_folder);
}
$filename=$file["tmp_name"];
$image_size = getimagesize($filename);
$pinfo=pathinfo($file["name"]);
$ftype=$pinfo['extension'];
$destination = $destination_folder.time().".".$ftype;
if (file_exists($destination) && $overwrite != true)
{
echo "同名文g已经存在?;
exit;
}
if(!move_uploaded_file ($filename, $destination))
{
echo "Ud文g出错";
exit;
}
$pinfo=pathinfo($destination);
$fname=$pinfo[basename];
echo " <font color=red>已经成功上传</font><br>文g? <font color=blue>".$destination_folder.$fname."</font><br>";
echo " 宽度:".$image_size[0];
echo " 长度:".$image_size[1];
echo "<br> 大小:".$file["size"]." bytes";
if($watermark==1)
{
$iinfo=getimagesize($destination,$iinfo);
$nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
$white=imagecolorallocate($nimage,255,255,255);
$black=imagecolorallocate($nimage,0,0,0);
$red=imagecolorallocate($nimage,255,0,0);
imagefill($nimage,0,0,$white);
switch ($iinfo[2])
{
case 1:
$simage =imagecreatefromgif($destination);
break;
case 2:
$simage =imagecreatefromjpeg($destination);
break;
case 3:
$simage =imagecreatefrompng($destination);
break;
case 6:
$simage =imagecreatefromwbmp($destination);
break;
default:
die("不支持的文gcd";
exit;
}
imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
imagefilledrectangle($nimage,1,$image_size[1]-15,80,$image_size[1],$white);
switch($watertype)
{
case 1: //加水印字W串
imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
break;
case 2: //加水印图?
$simage1 =imagecreatefromgif("xplore.gif";
imagecopy($nimage,$simage1,0,0,0,0,85,15);
imagedestroy($simage1);
break;
}
switch ($iinfo[2])
{
case 1:
//imagegif($nimage, $destination);
imagejpeg($nimage, $destination);
break;
case 2:
imagejpeg($nimage, $destination);
break;
case 3:
imagepng($nimage, $destination);
break;
case 6:
imagewbmp($nimage, $destination);
//imagejpeg($nimage, $destination);
break;
}
//覆盖原上传文?
imagedestroy($nimage);
imagedestroy($simage);
}
if($imgpreview==1)
{
echo "<br>囄预览:<br>";
echo "<img src=\"".$destination."\" width=".($image_size[0]*$imgpreviewsize)." height=".($image_size[1]*$imgpreviewsize);
echo " alt=\"囄预览:\r文g?".$destination."\r上传旉:\">";
}
}
?>
</body>
</html>
最后我觉得有必要说一下给囄加水印的原理Q?
取得上传的文件信息,建立一个真彩色图象Q分配颜色方案ƈ且填充图像?
通过判断文gcd建立囑ŞQ然后把其复制到原徏立的囑Ş上,填充q徏立rectangleQ以备写入imagestring()或是原已l定好的囑փ
E序当中判断水印cdQ一是字W串Q另是增加一个图形对象在上面?BR>
?】Win32下apache2 用getҎ传递中文参C出错Q?/P>
test.php?a=你好&b=你也?/P>
传递参数是会导致一个内部错?BR>
解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也?
.............
?】win32下的session不能正常工作
php.ini默认的session.save_path = /tmp
q显然是linux下的配置Qwin32下php无法dsession文gDsession无法使用Q把它改成一个绝对\径就可以了,例如session.save_path = c:windows emp
?】显C错误信?/P>
当php.ini的display_errors = Onq且error_reporting = E_ALLӞ显C所有的错误和提C,调试的时候最好打开以便U错Q如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋g前调用会有提C,解决办法是探或者屏蔽?/P>
例如昄$fooQ可以if(isset($foo)) echo $foo 或者echo @$foo
?】Win32下mail()不能发送电子邮?/P>
在linux下配|好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮Ӟ修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务?|上很难扑ֈ)
php发送邮件的最好解x法是用socket直接发送到Ҏemail服务器而不用{发服务器?/P>
?】初装的mysql如果没有讄密码Q应该用update mysql.user set password="yourpassword" where user="root" 修改密码
?】header already sent
q个错误通常会在你用HEADER的时候出玎ͼ他可能是几种原因Q?Q你在用HEADER前PRING或者ECHO?.你当前文件前面有I3.你可能INCLUDE了一个文?该文件尾部有I或者输Z会出现这U错误。!
?】更改php.ini后没有变?/P>
重新启动web serverQ比如IISQApache{等Q然后才会应用最新的讄?/P>
?】php?003上面安装QISAPI的安装方法恳请高手指教)
PHP4的php4isapi.dll好像?003有些冲突Q只能用CGI模式安装
步骤一Q先www.php.net 下在一个安装程序,我是装的是:php-4.2.3-installer.exeQ你也可以去找最新的版本Q在安装php-4.2.3- installer.exe之前保证你的IIS6.0启动了,q能够访问。安装好以后Q在默认|站--Q应用程序配|?/P>
步骤二:点击 web服务扩展 --Q新建web服务扩展?/P>
步骤三: 扩展?-Qphp,然后d
步骤四:扑ֈphp.exe的\径添加上厅R?/P>
步骤五: 定可以了Q?BR>
步骤六: 选择php的服务扩展,然后点击允许?/P>
?0】有时候sql语句不v作用Q对数据库操作失败,最便的调试ҎQecho那句sqlQ看看变量的D得到不?/P>
?1】include和require的区?/P>
两者没有太大的区别Q如果要包含的文件不存在Qinclude提示noticeQ然后l执行下面的语句Qrequire提示致命错误q且退出?/P>
据我试Qwin32q_下它们都是先包含后执行,所以被包含文g里最好不要再有include或require语句Q这样会造成目录混ؕ。或?nux下情况不同,暂时q没试?/P>
如果一个文件不惌包含多次可以使用include_once或require_once## dQ写入文档数据?/P>
function r($file_name) {
$filenum=@fopen($file_name,"r");
@flock($filenum,LOCK_SH);
$file_data=@fread($filenum,filesize($file_name));
@fclose($filenum);
return $file_data;
}
function w($file_name,$data,$method="w"){
$filenum=@fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}
?2】isset()和empty()的区?/P>
两者都是测试变量用的,但是isset()是测试变量是否被赋|而empty()是测试一个已l被赋值的变量是否为空?/P>
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示Q如果一个变量被赋空|$foo=""或?foo=0或?$foo=false,那么empty($foo)q回真,isset($foo)也返回真Q就是说赋空g会注销一个变量?BR>
要注销一个变量,可以?unset($foo)或?foo=NULL
?3】mysql查询语句包含有关键字
php查询mysql的时候,有时候mysql表名或者列名会有关键字Q这时候查询会有错误。例如表名是order,查询时候会出错Q简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别,例如select * from `order`
?4】通过HTTP协议一ơ上传多个文件的Ҏ
有两个思\Q是同一个方法的两种实现。具体程序还需自己去设计?/P>
1、在form中设|多个文件输入框Q用数组命名他们的名字,如下Q?/P>
Qform action="" method=postQ?BR>Qinput type=file name=usefile[]Q?BR>Qinput type=file name=usefile[]Q?BR>Qinput type=file name=usefile[]Q?BR>Q?formQ?BR> q样Q在服务器端做以下测试:
echo "QpreQ?;
print_r($_FILES);
echo "Q?preQ?;
2、在form中设|多个文件输入框Q但名字不同Q如下:
Qform action="" method=postQ?BR>Qinput type=file name=usefile_aQ?BR>Qinput type=file name=usefile_bQ?BR>Qinput type=file name=usefile_cQ?BR>Q?formQ?BR> 在服务器端做同样试Q?/P>
echo "QpreQ?;
print_r($_FILES);
echo "Q?preQ?;
q回的数据Ş式如?/P>
Array
(
[汽R] => Array
(
[三菱] => 20
[本田] => 500
)
[蛋] => Array
(
[鸡蛋] => 20
[鸭蛋] => 20
)
}
######################################################################################*/
class ShopCar{
var $carName;
var $debug;
/**
@desc 新徏一辆购物R.指定购物车名,如果?返回原来的购物?BR> @param String $carName
@param Boolean $get
@return void
*/
function ShopCar($carName){
$this->carName=$carName;
if (!isset($_SESSION[$carName])){
$_SESSION[$carName]=array();
}
}
/**
@desc 向购物R内增加一件商?cd,商品?数量,插入成功q回?否则q回?BR> @param String $type
@param String $name
@param String $val
@return bool
*/
function addCar($type,$name,$val){
if(array_key_exists($type,$_SESSION[$this->carName])){//ȝ别是否存?.如 汽R ?BR> if (array_key_exists($name,$_SESSION[$this->carName][$type])){//分类别是否存在 如 三菱 ?BR> if ($this->debug)echo "<br/>已有{$name}商品,不必增加<br/>";
return false;
}else {
$_SESSION[$this->carName][$type][$name]=$val;
}
}else {
$_SESSION[$this->carName][$type]=array($name=>$val);
}
return true;
}
/**
@desc ~辑商品
@param string $type
@param string $name
@param string $var
@return bool
*/
function editCar($type,$name,$var){
if (!array_key_exists($name,$_SESSION[$this->carName][$type])){
if ($this->debug)echo "<BR>没有{$name}商品,修改p|<br/>";
return false;
}
$_SESSION[$this->carName][$type][$name]=$var;
return true;
}
/**
@desc 删除cd
@param string $type
@return bool
*/
function delCarType($type){
if (!array_key_exists($type,$_SESSION[$this->carName])){
if ($this->debug)echo "<br/>没有{$type}cd,删除p|<br/>";
return false;
}
unset($_SESSION[$this->carName][$type]);
return true;
}
/**
@desc 删除商品
@param string $type
@param string $name
@return bool
*/
function delCarPro($type,$name){
if (!array_key_exists($name,$_SESSION[$this->carName][$type])){
if ($this->debug)echo "<br/>没有{$name}商品,删除p|<br/>";
return false;
}
unset($_SESSION[$this->carName][$type][$name]);
return true;
}
/**
@desc 删除此购物R
@return bool
*/
function delCar(){
session_unregister($this->carName);
}
/**
@desc 获得购物车数?BR> @return array[array[]]
*/
function getCarData(){
return $_SESSION[$this->carName];
}
}
?>
以下的步骤是可选的Q徏议在W一ơ安装时候不要做以下操作Q等对Eclipse有些熟悉了之后再q行下面的操作,wampp的目的是安装已经配置好的Apache,MySQL,PHPQ安装dbg插g的目的是调试PHPE序Q这些插件在以后需要的时候安装也是可以的?BR> W五步、安装wampp
[url=http://prdownloads.sourceforge.net/xampp/wampp-2.2.zip?download ]wampp2.2[/url]
解压到d:\wampp2目录Q安装详见d:\wampp2\wamp-2.2.txt文g
按以下修改Apache的配|文Ӟd:\wampp2\apache\conf\httpd.conf
...
Alias /eclipse "/wampp2/eclipse/workspace/"
<Directory "/wampp2/eclipse/workspace/">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
...
把d:\eclipse目录Ud到d:\wampp2\eclipse目录Q在d:\wampp2下创Z个批处理文g starteclips.barQ输入下面命令:
eclipse\eclipse.exe -clean
用这U方式启动eclipse会自动重新装载插件。至此,安装可以l束了?/P>
二、开发PHP目
启动eclipse后,用菜?"new"->"PHP Project"Q可以成功的创徏一个PHP目?BR> ?new"->"file"Q就可以创徏PHP源程序文件了Q可以输入以下代?BR> [code]
<?
class Foo {
var Qname = "";
function bar() {
echo "Foo::bar()";
}
}
Foo::bar();
?>
[/code]
PHP的类如Foo和函数bar()pȝ都可以识别,q在outlineH口中以树Ş昄出来Q这在开发大型项目时十分有用?BR> 如果安装了wamppQ就可以单击"Start Apache"菜单或快捷图标启动ApacheQ就可以昄行的l果了?BR> 如果你手工安装了PHPQ可以在Run/External tools中配|PHP.exe来运行程序,q把l果昄在ConsoleH口中?/P>
三、PHPUnit
PHPEclipse中包含一个PHPUnitH口Q但我查看了很多关于PHPEclipse的文档,没有扑ևPHPUnitH口的用法,希望有知道的写文章告诉大家或发给我一份,不胜感谢?BR> l常用PHP开发的人可能知道,在PEAR中有一个PHPUnit2目Q我查到了PHPUnit2的作者Sebastian?004q?2?6日所说的一D话Q?BR>> I am the author of PHPUnit2 [1] and recently started using PHPEclipse.
>
> What would be needed in order to get PHPUnit2 support in PHPEclipse?
> AFAICS currently only the outdated PHPUnit that is hosted at SourceForge
> is supported.
A.C.Kramer的回复是Q?BR>Sorry for answering so late.
Don"t know exactly why, but your mail slipped through my filters.
Ali Echihabi [1] has started a first PHPUnit plugin in the CVS module:
net.sourceforge.phpeclipse.phpunit [2]
I don"t know exactly the current development status,
but I didn"t hear from Ali the last 2 months.
If you are interested in improving the module, I can give you developer
access.
Please let us know if you need further help with the existing CVS module.
仅供有兴的读者参考,在这里我׃译了?/P>
四、ȝ
PHPEclipse利用Eclipse工具Q提供了一个方便的PHP开发环境,不仅像Sebastianq样的高手在用,大型的项目也可以获得几乎不逊色于作为Java开发工L支持能力?BR> 另外Q我也希望PHP Refactor BrowserQPHP Unit {优U的工兯在PHPEclipse下配合的更好QؓPHP的开发者提供一个近乎完的解决Ҏ?/P>
Jack,PHPMVC2开发者,开发的软g目有EasyWebOAQ网站:http://www.easyweboa.com blog: http://www.blogcn.com/user39/chenwumail/index.html
注:php有zip压羃的和install的两U版本,强烈使用install的版本,否则有时配置完全正确的情况下Qapacheq是找不到php?/EM>
2.安装
1Q先安装mysqlQ然后安装apacheQ最后安装phpQ因为php安装时有个选择服务器的讄?BR>mysql安装之后Q执行安装目录下bin目录中的winmysqladmin.exeQ会提示输入用户名和密码Q填写即可,然后在右下角托盘右键菜单中选择Install sreviceQ然后start service卛_?/P>
2Qapache的安装配|过E中要填写域名之cȝ地方都可以随便添Q因Z后在httpd.conf中都可以改,我都填的是localhost。安装快l束的时候,它会自动配置脚本Q但是如果你的机子上装了IISQ都用的80端口Q会提示p|Q不q没关系Q后面配|的时候改端口p了?/P>
3Qphp安装的时候选择apache作服务器Q另外安装的路径写简单些Q如D:\phpQ要是放在program filesq样的目录中Q有可能在用的时候会崩溃?/P>
3.配置
1Qmysql没有什么好说得Q启动服务就能用了?BR>2Q打开apache安装路径下的CONF目录Q找httpd.conf文gQ用文本~辑器打开Q修改如下:
?BR>#Listen 12.34.56.78:80
Listen 80
Ҏ
#Listen 12.34.56.78:8080
Listen 8080
?BR>#ScriptAlias /cgi-bin/ "D:/Program Files/Apache Group/Apache2/cgi-bin/" 注释?/FONT>
Ҏ
ScriptAlias /php/ "D:/php/"
AddType application/x-httpd-php .php Q如果要支持更多的扩展名Q可以添加多行,如AddType application/x-httpd-php .php3Q?
Action application/x-httpd-php "/php/php.exe
注意Q反斜杠
?BR>ServerName localhost:80
Ҏ
ServerName localhost:8080
如果你是用的英文版,惌支持中文
在配|文件中扑含“AddLanguage”或“AddCharset”的行,在这些行最前面增加一?最好“AddCharset”行?Q?BR>AddDefaultCharset GB2312
注:中文版的已经有AddCharset ISO-2022-CN .iso2022-cn .cisq行了,所以不用加?/EM>
apache安装完后默认的虚拟\径是安装目录下的htdocs目录Q如果要其它目录设拟\径,参考最后的附录?/P>
3Q将php安装目录中的php4ts.dll拯到system32目录下,如XP中拷贝到c:\windows\system32Q?BR>然后BACKUP目录下的PHP.INI拯到windows目录中,用文本编辑器打开它,
查找 [MySQL] 字段内的内容.修改如下.
mysql.default_port = 3306
// q里是MYSQL的端?
mysql.default_host = localhost
// q里是本C?
mysql.default_user = root
// q里是超U用?/FONT>
mysql.default_password = 123456
// q里是超U用户密?/FONT>
修改到这里就可以?Php ?MYSQL 兌?
最后启?PHP ?MYSQL 模块支持.
查找 ;extension=php_mysql.dll 字串.删除掉前面的 ; ?变成
extension=php_mysql.dll
然后扑ֈdoc_root字段Q填入apache的虚拟\?BR>doc_root =D:\Program Files\Apache Group\Apache2\htdocs
4.q行
重启apacheQ在htdocs目录中放一个PHP文gQ如a.php
然后在IE中输?A href="http://localhost:8080/a.php">http://localhost:8080/a.php可以看见内容了?/P>
5.附录Q如何改变默认的虚拟路径?/STRONG>
首先我們要?B> c:\web\ 下新增目录,例如www
然后在httpd.conf 中作如下改动卛_Q?/P>
Q-Q-Q-Q-Q改动前Q-Q-Q-Q-Q-Q-Q?/P>
DocumentRoot "C:/web/Apache/htdocs" 原始路徑
#
# Each directory to which Apache has access, can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# permissions.
#
< Directory />
Options FollowSymLinks
AllowOverride None
< /Directory >
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# This should be changed to whatever you set DocumentRoot to.
#
< Directory "C:/web/Apache/htdocs">
#
# This may also be "None", "All", or any combination of "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
Options Indexes FollowSymLinks MultiViews
#
# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
< / Directory>
Q-Q-Q-Q-Q-改动后-Q-Q-Q-Q-Q-Q-
DocumentRoot "C:/web/www"
#
# Each directory to which Apache has access, can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# permissions.
#
< Directory />
Options All
AllowOverride None
< /Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# This should be changed to whatever you set DocumentRoot to.
#
< Directory "C:/web/www">
#
# This may also be "None", "All", or any combination of "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
Options All
#
# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
#
AllowOverride All
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
< / Directory>
#
# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is received.
#
# Under Win32, we do not currently try to determine the home directory of
# a Windows login, so a format such as that below needs to be used. See
# the UserDir documentation for details.
#
< IfModule mod_userdir.c>
UserDir "C:/web/www/"
< /IfModule>
6.附录Q如何设|默认启动页
同样在HTTPD.CONF?/P>
扑ֈ下面字段q加上你要的文g名,注意Q?/FONT>每个文g名之间要加一个空?/P>
< IfModule mod_dir.c>
DirectoryIndex index.html index.htm index.php index.php3
< /IfModule>
PS:在安装Apache时最好将IIS停止,否则服务可能安装不上
]]>