2009年4月29日星期三

伪静态URL重写技术实现方法

伪静态用到知识很简单一旦学会,快乐无穷,只需要正则和服务器设置。
先说iis如何设置吧,往下看
下载(IIS Rewrite模块): http://www.isapirewrite.com/,先把产品下载下来,安装在服务器上,记住目录,会有类似Rewrite.dll的文件生成,MMC→IIS信息服务管理器→网站→您的站点→属性,在“ISAPI筛选器”项点击 “添加”, 筛选器名称填入Rewrite,可执行文件为Rewrite.dl这个文件.

然后修改httpd.ini配置文件,如果不太熟悉,就在http://www.isapirewrite.cn/docs看看手册,研究去,如此:

[ISAPI_Rewrite]
CacheClockRate 3600
RewriteRule ^(.*)/([a-z0-9A-Z\-]+\.html)$ $1/default.asp\?id=$2

这个配置好了就能在default.asp获取参数了,没问题把,顺便一说,正则用法里面最重要的符号^匹配开头,$匹配结尾,\w匹配任何字符,\s匹配空白,+匹配至少一,*匹配至少0,[x,]匹配至少x,()是分组技术,汗,这东西不说了,太弱了.



下面说apache(Unix平台最流行的WEB服务器平台)的重写技术,基本类似,只不过,apaceh支持更灵活的.htaccess,你创建一个文件,文件名就是.htaccess:内容:


RewriteEngine On
RewriteRule ^([a-z0-9A-Z\-]+\.html)$ default.php\?id=$1



就这样,搞定之.注意,必须要空间支持 Rewrite 以及对站点目录中 .htaccess 的文件解析,才有效.

如何让空间支持Rewrite 和 .htaccess 的文件解析呢 往下看

第一步:我们要找到apache(Unix平台最流行的WEB服务器平台)安装目录下的httpd.cof文件,在里面找到


Options FollowSymLinks
AllowOverride none

把none改all,

第二步:找到一下内容

#LoadModule rewrite_module modules/mod_rewrite.so

改为

LoadModule rewrite_module modules/mod_rewrite.so

第三步就是最困难的,保存重启apache(Unix平台最流行的WEB服务器平台)了。 需要自己用心研究了。

剩下的就是测试了。。以上设置我都测试通过了。

2009年4月26日星期日

php smarty简单的例子

在招聘网站上经常看到招PHP程序员的公司很多都要求会SMARTY,虽然我对SMARTY没有太多好感(主要还是太过繁琐,没有直接写PHP代码来得直接),但似乎它已经成了一个事实上的标准,且在团队合作中也有必要用到,没法,学习学习吧,先从简单的开始:

实例1:

先来看一个简单的例子。
=====================================================
index.tpl
=====================================================
{* 显示是smarty变量识符里的用*包含的文字为注释内容 *}
{include file="header.tpl"}{*页面头*}
大家好,我叫{$name}, 欢迎大家阅读我的smarty学习材料。
{include file="foot.tpl"}{*页面尾*}
上边的这个例子是一个tpl模板,其中:

1. {**}是模板页的注释,它在smarty对模板进行解析时不进行任何输出,仅供模板设计师对模板进行注释。
2. {include file="xxx.tpl"}使用此句将一个模板文件包含到当前页面中,例子中将在网站中公用事的head.tpl与foot.tpl进行了包含,你可以这样想,使用这一句将xxx.tpl中的内容全部复制在当前语句处。当然,你不使用这一句也可以,将XXX.tpl中的内容复制到当前语句处也是完全可以了。
3.{$name}: 模板变量,smarty中的核心组成,采用smarty定义的左边界符{与右边界符}包含着、以PHP变量形式给出,在smarty程序中将使用$smarty->assign("name", "疯癫";将模板中的$name替换成“疯癫”三个字。

整个实例源程序如下:
=============================
header.tpl
=============================
<html>
<head>
<title>smarty教程</title>
</head>
<body>

===============================
foot.tpl
===============================
<hr>
<center> CopyRight(C) by 2007年12月</center>
<hr>
</body>
</html>

=====================================================
index.tpl
=====================================================
{* 显示是smarty变量识符里的用*包含的文字为注释内容 *}
{include file="header.tpl"}{*页面头*}
大家好,我叫{$name}, 欢迎大家阅读我的smarty学习材料。
{include file="foot.tpl"}{*页面尾*}

================================================
index.php
================================================
<?php
include_once("./comm/Smarty.class.php"); //包含smarty类文件
$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates("./templates"); //设置模板目录
$smarty->templates_c("./templates_c"); //设置编译目录
//----------------------------------------------------
//左右边界符,默认为{},但实际应用当中容易与JavaScript
//相冲突,所以建议设成<{}>或其它。
//----------------------------------------------------
$smarty->left_delimiter = "{";
$smarty->right_delimiter = "}";
$smarty->assign("name", "疯癫"); //进行模板变量替换
//编译并显示位于./templates下的index.tpl模板
$smarty->display("index.tpl");
?>;

最终执行这个程序时将显示为:
================================
执行index.php
================================
<html>
<head>
<title>smarty教程</title>
</head>
<body>

大家好,我叫疯癫, 欢迎大家阅读我的smarty学习材料。
<hr>
<center> CopyRight(C) by 2007年12月</center>
<hr>
</body>
</html>

the second part

这个例子是综合使用smarty模板参数的一个例子,这些参数用来控制模板的输出,我只选其中几个,其它的参数你去看参考吧。

================================================
exmple2.tpl
================================================
<html>
<head><title>smarty示例2</title></head>
<body>

1. 第一句首字母要大写:{$str1|capitalize}<br>
2. 第二句模板变量 + 疯癫:{$str2|cat:"疯癫"}<br>
3. 第三句输出当前日期:{$str3|date_format:"%Y年%m月%d日"}
4. 第四句.php程序中不处理,它显示默认值:{$str4|default:"没有值!"}
5. 第五句要让它缩进8个空白字母位,并使用"*"取替这8个空白字符:<br>
{$str5|indent:8:"*"}}<br>
6. 第六句把hd_lj@163.com全部变为小写:{$str6|lower}<br>
7. 第七句把变量中的Crazy Hand替换成:疯癫:{$str7|replace:"Crazy Hand":"疯癫"}<br>
8. 第八句为组合使用变量修改器:{$str8|capitalize|cat:"这里是新加的时间:"|date_format:"%Y年%m月%d日"|lower}

</body>
</html>

===============================================
example2 .php
===============================================
<?php
include_once("./Smarty.class.php"); //包含smarty类文件
$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates("./templates"); //设置模板目录
$smarty->templates_c("./templates_c"); //设置编译目录

//----------------------------------------------------
//左右边界符,默认为{},但实际应用当中容易与JavaScript
//相冲突,所以建议设成<{}>或其它。
//----------------------------------------------------

$smarty->left_delimiter = "{";
$smarty->right_delimiter = "}";
$smarty->assign("str1", "my name is Crazy Hand."); //将str1替换成My Name Is Crazy Hand.
$smarty->assign("str2", "我的名字叫:"); //输出: 我的名字叫:疯癫

$smarty->assign("str3", "公元"); //输出公元2008年X月X日(我的当前时间)

//$smarty->assign("str4", ""); //第四句不处理时会显示默认值,如果使用前面这一句则替换为""
$smarty->assign("str5", "前边8个*"); //第五句输出:********前边8个*
$smarty->assign("str6", "hd_lj@163.com"); //这里将输出hd_lj@163.com
$smarty->assign("str7", "this is Crazy Hand"); //在模板中显示为:this is 疯癫
$smarty->assign("str8", "HERE IS COMBINING:");

//编译并显示位于./templates下的index.tpl模板
$smarty->display("example2.tpl");
?>

最终输出效果:
======================================================
example2.php输出效果:
======================================================
<html>
<head><title>smarty示例2</title></head>
<body>

1. 第一句首字母要大写:My Name Is Crazy Hand.<br>
2. 第二句模板变量 + 疯癫:我的名字叫:疯癫<br>
3. 第三句输出当前日期:公元2008年X月X日<br>
4. 第四句.php程序中不处理,它显示默认值:没有值!<br>
5. 第五句要让它缩进8个空白字母位,并使用"*"取替这8个空白字符:<br>
********前边8个*<br>
6. 第六句把hd_lj@163.com全部变为小写:hd_lj@163.com<br>
7. 第七句把变量中的Crazy Hand替换成:疯癫:this is 疯癫<br>
8. 第八句为组合使用变量修改器:Here is Combining:这里是新加的时间:2008年X月X日
</body>
</html>



2009年4月24日星期五

[转]header 函式的使用

标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串,在标头
与 HTML 文件之间尚需空一行分隔。有关 HTTP 的详细说明,可以参 RFC 2068 官方文件
(http://www.w3.org/Protocols/rfc2068/rfc2068)。在 PHP 中送回 HTML 资料前,需先
传完所有的标头。

注意: 传统的标头一定包含下面三种标头之一,并只能出现一次。

Content-Type: xxxx/yyyy
Location: xxxx:yyyy/zzzz
Status: nnn xxxxxx

在新的多型标头规格 (Multipart MIME) 方可以出现二次以上。

使用范例

范例一: 本例使浏览器重定向到 PHP 的官方网站。
Header("Location: http://www.php.net");
exit;


范例二: 要使用者每次都能得到最新的资料,而不是 Proxy 或 cache 中的资料,可以使用下列的标头
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");


范例三: 让使用者的浏览器出现找不到档案的信息。
header("Status: 404 Not Found");


范例四:让使用者下载档案。

header("Content-type: application/x-gzip");
header("Content-Disposition: attachment; filename=文件名");
header("Content-Description: PHP3 Generated Data");

2009年4月21日星期二

不可不知的生活中18个有用潜规则

人情世故是我们日常生活中积累的约定俗成的行为规则,属于社会知识的范畴。这些知识大半来源于与不同人群的社会交际,也来源于社会冲突与社会发展。在有专业知识与技能的情况下,人情世故能够帮助我们个人缓和与其他人之间的紧张度,也比较容易让其他人感到与我们交往的愉悦感与适度感。这里例举出对于我们每个人也许都能用到的日常生活中的18个人情世故,而这些人情世故也经常被很多年轻人忽略。

1、即使不是大人物,我们也经常能用请教的态度与口吻与他们说话,因为人不可貌相,很多实用的良师益友往往来自不起眼的生活与工作中。

2、在吃饭的场合做主动做点菜者,不适合请主人与主宾点菜,因为那不是尊贵者通常做的事情,但是请注意询问他们的喜好,而不是只管点自己爱吃的东西。但是这需要平时研究菜单,积累点菜的经验。

3、经常找到朋友、伙伴与同事(甚至小孩子)值得肯定的方面,注意哦,即使老板也需要被你肯定,但是尽量在私下场合,而对于一般朋友与同时则应公开赞扬。

4、在受到别人对自己的相貌、事情、人品赞扬时,不要表现出理所当然的样子,也不要假意否认,合适的方式是表示感谢,尤其感谢朋友的肯定与支持。

5、学会使用便条,包括借条、领条、请假条、申请信,如果你很主动地使用这些便条会让其他人感到你很规范,而且如果你懂得请其他人这样做,你和未来更好与他们有凭有据地与他们打交道。会写便条会让别人刮目相看。

6、即使你不是服务人员,在朋友或者同事有客人开的时候主动倒水,会让朋友与同事很有面子,也会让客人觉得你的朋友与同事很有威望。这会让你的朋友与同事特别感谢你的姿态。

7、虽然你觉得你是新手或者地位比较低的人,但是你要勇于不耻下问,也要做到主动询问别人的需要,而不要等领导或者资深的同事对你表现出亲和,因为他们这样表现往往需要特别的努力。

8、记得在别人不在座位的时候很热情地帮助接听与记录电话、接受信件、传递信息,对团队的同事与同学,提醒他们一些你知道的重要日程。

9、在征询了别人意见之后才进入别人的房间,看别人的书架或者室内物品,在经别人同意的情况下才用别人的电脑,坐在别人的私人座位上,但通常不去翻动别人的笔记本。

10、出席别人需要有邀请,如果不能出席应提前通知,迟到的话要在适当的时间点上通知主人,到了以后要解释,带未经邀请的朋友要事前通知主人。

11、不适合向别人索要礼物,收到别人的礼品不管是不是喜欢要表示感谢,因为送礼者会很在乎你的反应,不适合把一处的礼物转送给另一处,尤其还保留原来送礼者的符号与痕迹就显得很没有礼貌了。

12、在有多个出席者的场合,主动介绍自己的朋友给其他人,或者主动在你认识的朋友之间穿针引线。

13、有不同地位的朋友在的场合,都要保持微笑,体贴地招呼下那些内向的、不为人注意的、可能有点自卑感的朋友,在社交中对弱势者的帮助会得到别人特别的感激。在其他社会场合,对于社会地位较低者,尤其在有你不能适应的生活条件与生活习惯时,要克制自己所想表现出的不适感与负面表情。尽量主动向社会地位较低者打招呼。

14、有好东西吃的时候不要吃独食,主动地告诉他们你知道的好消息,在有好事情的时候能想到别人。

15、有人做错了事情或者你发现其他做错了事情,不要用情绪性的方式批评别人,尤其要注意就事来评价,避免评价了别人的人格、个性与家庭教养。批评时能提出解决方案,批评就更有建设性。也不要只有批评,批评不忘肯定别人的长处。如果批评时能比较幽默,往往负面效果就更少。被批评或者遇到尴尬的时候能幽默自嘲,也能提高交流的建设性。

16、好汉不吃眼前亏。但是在另外很多时候,如果问题争执不下,也不要继续火上浇油,冷静下来,多收集一些数据材料与想更明白点再说。

17、在你不能有充分把握的时候,用“争取”与“尽量”这样的口吻回答别人的邀约,承诺了就要最大限度去履行。

18、虽然在商言商,但是我们要尽量不谈回报地先为别人做点什么,这样就赢得了在心理上比别人优越的债权感。一个人的社会地位是别人对他负有的社会债务感的总和。

2009年4月17日星期五

[转]PHP:Snoopy抓取页面以及模拟提交表单

snoopy是一个很好的远程抓取类库,在淘宝的开放API中也有用到,不过自己也还不是很熟悉,所以先摘录下来,以备日后验证使用。

PHP代码


<?php
$url = "http://www.taoav.com";
include("snoopy.php");
$snoopy = new Snoopy;
$snoopy->fetch($url); //获取所有内容
echo $snoopy->results; //显示结果
//可选以下
$snoopy->fetchtext //获取文本内容(去掉html代码)
$snoopy->fetchlinks //获取链接
$snoopy->fetchform //获取表单
?>

表单提交


<?php
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";

$action = "http://www.taoav.com";//表单提交地址
$snoopy->submit($action,$formvars);//$formvars为提交的数组
echo $snoopy->results; //获取表单提交后的 返回的结果
//可选以下
$snoopy->submittext; //提交后只返回 去除html的 文本
$snoopy->submitlinks;//提交后只返回 链接
?>

既然已经提交的表单 那就可以做很多事情 接下来我们来伪装ip,伪装浏览器

伪装


<?php
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";
$action = "http://www.taoav.com";
include "snoopy.php";
$snoopy = new Snoopy;
$snoopy->cookies["PHPSESSID"] = 'fc106b1918bd522cc863f36890e6fff7'; //伪装sessionid
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; //伪装浏览器
$snoopy->referer = http://www.php100.com; //伪装来源页地址 http_referer
$snoopy->rawheaders["Pragma"] = "no-cache"; //cache 的http头信息
$snoopy->rawheaders["X_FORWARDED_FOR"] = "127.0.0.101"; //伪装ip
$snoopy->submit($action,$formvars);
echo $snoopy->results;
?>

原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。例如 带验证码,验证ip 投票, 可以不停的投。ps:这里伪装ip ,其实是伪装http头, 所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。

关于如何验证码 ,简单说下:

首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,同时记下sessionid和验证码值,接下来就用snoopy去伪造 。

原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。

有时我们可能需要伪造更多的东西,snoopy完全为我们想到了


<?php
$snoopy->proxy_host = "www.php100.com";
$snoopy->proxy_port = "8080"; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.taoav.com/images/taoav.gif
$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
$snoopy->error //返回报错信息
?>

ASP编程常用的代码

1. ASP与Access数据库连接:


<%
dim conn,mdbfile
mdbfile=server.mappath("数据库名称.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile
%>

2. ASP与SQL数据库连接:


<%
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
%>

建立记录集对象:


set rs=server.createobject("adodb.recordset")
rs.open SQL语句,conn,3,2

3. SQL常用命令使用方法:

1) 数据记录筛选:


sql="select * from 数据表 where 字段名=字段值 order by 字段名 "
sql="select * from 数据表 where 字段名 like ‘%字段值%‘ order by 字段名 "
sql="select top 10 * from 数据表 where 字段名 order by 字段名 "
sql="select * from 数据表 where 字段名 in (‘值1‘,‘值2‘,‘值3‘)"
sql="select * from 数据表 where 字段名 between 值1 and 值2"

(2) 更新数据记录:


sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

(3) 删除数据记录:


sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)

(4) 添加数据记录:


sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

(5) 数据记录统计函数:


AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加

引用以上函数的方法:


sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)

用 rs("别名") 获取统的计值,其它函数运用同上。

(5) 数据表的建立和删除:

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

例:CREATE TABLE tab01(name varchar(50),datetime default now())

DROP TABLE 数据表名称 (永久性删除一个数据表)

(6) 记录集对象的方法:


rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录

判断所填数据是数字型


if not isNumeric(request("字段名称")) then
response.write "不是数字"
else
response.write "数字"
end if

2009年4月13日星期一

如何自定义ucenter、discuz用户列表?

UCENTER修改:

1、格式化日期 我不喜欢UCENTER的那个日期格式,想替换掉,方法如下:找到control\admin\user.php这个文件,搜索function _format_userlist(&$userlist)这个函数,把$userlist[$key]['regdate'] = $this->date($user['regdate']);替换成$userlist[$key]['regdate'] = date("Y-m-d H:i",$user['regdate']); OK,问题解决。 

2、按日期排序 其实方法也很简单,同样是user.php这个文件,找到$sqladd = $sqladd ? " WHERE 1 $sqladd" : '';这段语句,在下边增加: $sqladd = $sqladd . "order by regdate desc"; OK,问题解决。

想增加其它列表,只要参考上面的方式加以扩展就行了。


给DISCUZ后台的用户列表增加日期并以日期排序:

涉及文件:admin/members.inc.php 
操作方法:
1、找到46行,把:
$query = $db->query("SELECT uid, username, adminid, groupid, credits, regdate, extcredits1, extcredits2,
   extcredits3, extcredits4, extcredits5, extcredits6, extcredits7, extcredits8, posts FROM {$tablepre}members WHERE $conditions LIMIT $start_limit, $memberperpage");
改成
$query = $db->query("SELECT uid, username, adminid, groupid, credits, regdate, extcredits1, extcredits2,
   extcredits3, extcredits4, extcredits5, extcredits6, extcredits7, extcredits8, posts FROM {$tablepre}members WHERE $conditions order by regdate desc LIMIT $start_limit, $memberperpage");
2、找到73行,把:
showsubtitle(array('', 'username', 'credits', 'posts', 'admingroup', 'usergroup', ''));
改成
showsubtitle(array('', 'username','regdate', 'credits', 'posts', 'admingroup', 'usergroup', ''));
3、不要忘记给模板文件中的admincp.lang.php中增加一个regdate=>'注册时间';的字段哦。

2009年4月8日星期三

在discuz7.0正式版的注册页面上加入QQ必选字段

经客户要求,要在discuz7.0正式版的注册页面上加上QQ必选字段,到discuz的论坛里找了半天也没找到一个合适的,然后就自己研究起来,discuz的代码真够错综复杂的,不过,还是出了结果,具体修改方法如下:

涉及到的四个文件:templates/你的模板文件夹/register.htm;templates/你的模板文件夹/messages.lang.php;ajax.php;register.php

register.htm

找到如下代码:


<label><em>{lang email}:</em><input type="text" name="email" autocomplete="off" size="25" id="email" onBlur="checkemail()" tabindex="1" class="txt" /> *</label>

在它下面添加:


<!-- 增加QQ注册 -->
<label><em>QQ:</em><input type="text" id="qq" name="qq" onBlur="checkqq()" autocomplete="off" size="25" maxlength="15" value="" tabindex="1" class="txt" /> *</label>

并在文件低部加一个js的QQ验证函数:


//验证QQ
function checkqq() {
var qq = trim($('qq').value);
if(qq == '' || qq == lasteqq) {
return;
} else {
lastqq = qq;
}
ajaxget('ajax.php?infloat=register&handlekey=register&action=checkqq&qq=' + qq, 'returnmessage4');
}

register.php

找到如下代码:


$db->query("REPLACE INTO {$tablepre}memberfields (uid, authstr $fieldadd1) VALUES ('$uid', '$authstr' $fieldadd2)");

改成:


$db->query("REPLACE INTO {$tablepre}memberfields (uid, qq, authstr $fieldadd1) VALUES ('$uid', '$qq', '$authstr' $fieldadd2)");

ajax.php

找到:


elseif($action == 'checkemail') {

$email = trim($email);

require_once DISCUZ_ROOT.'./uc_client/client.php';

$ucresult = uc_user_checkemail($email);
if($ucresult == -4) {
showmessage('profile_email_illegal', '', 1);
} elseif($ucresult == -5) {
showmessage('profile_email_domain_illegal', '', 1);
} elseif($ucresult == -6) {
showmessage('profile_email_duplicate', '', 1);
}
}

在它下面添加一个QQ验证方法:


///验证QQ
elseif($action == 'checkqq') {
$qq = trim($qq);
$len = strlen($qq);
if(!preg_match( "/^[0-9]+$/",$qq) or $len<5 ){
showmessage('profile_qq_duplicate', '', 1);
}
}

messages.lang.php

添加一行:


'profile_qq_duplicate' => 'QQ号必须为数字,且不小于 5 位数',

2009年4月1日星期三

8个最常用的PHP服务器变量

PHP的超级全局变量名 $_SERVER 是一个数组,这个数组里的很多变量对于你的PHP项目是非常有用的,在这里,我打算介绍一些你在进行PHP项目开发时最常用的几个变量。


8个最常用的PHP服务器变量

1) $_SERVER['REQUEST_URI'] - 它返回一个URL中的文件名和参数,如果你的URL是“http://www.example.com/product.php?id=5”,那么,$_SERVER['REQUEST_URI']将返回“/product.php?id=5″.

2) $_SERVER['DOCUMENT_ROOT'] - 返回服务器提供服务的根目录。在Linux里,这个变量通常返回类似于“/usr/yoursite/www”这样的路径名,在Windows里则返回“D:/xamps/xampp/htdocs” 这样的路径名。

3) $_SERVER['HTTP_HOST'] - 返回http头部的服务器名称。当你通过地址栏访问类似于“http://example.com”或“http://www.example.com”时这个变量通常分别返回“example.com”或者“www.example.com”。这个变量对于你起用PHP的Session时,可以有效判断对方是进入到“http://example.com”还是“http://www.example.com”.

4) $_SERVER['HTTP_USER_AGENT'] - 返回客户端用户浏览器信息。我们可以通过strpos($_SERVER["HTTP_USER_AGENT"],”MSIE”)来验证是否是IE或者通过strpos($_SERVER["HTTP_USER_AGENT"],”Firefox”)来验证是否是Firefox。

5) $_SERVER['PHP_SELF'] - 返回当前你的文件名及目录。当你访问的URL地址是“http://www.example.com/product.php?id=5”,那么$_SERVER['PHP_SELF']返回“/product.php”,而如果你访问的是“http://www.example.com/abc/product.php?id=5”,则返回“/abc/product.php”。

6) $_SERVER['QUERY_STRING'] - 返回当前URL的查询参数。URL查询参数是指“?”号之后的字符串。如果你当前的URL是“http://www.example.com/index.php?id=5&page=product”,那么它将返回“id=5&page=product”。

7) $_SERVER['REMOTE_ADDR'] - 返回当前你访问的页面的远程服务器地址。但你不能通过$_SERVER['REMOTE_ADDR']变量来取得当前客户端的IP地址。

8 ) $_SERVER['SCRIPT_FILENAME'] - 返回当前你访问页面在服务器端的绝对路径。它返回的路径在Linux主机里类似“var/example.com/www/product.php”,在Windows里类似“D:/xampp/xampp/htdocs/test/example.php”。

能掌握好以上基于$_SERVER的八个变量,相信对你的PHP项目来说,又简化了好多!