5 月 232006
 

实例学习PHP之表单处理篇

学习前的准备: 要想学习PHP,当然少不了要安装PHP啦,所以如果你是初次学习,请先阅读星空浪子兄及地藏的:

PHP4.03在linux下的安装
PHP4.04在win98下的安装
PHP4.04在英文win2000下的安装

如果你找不到安装程序请到下面下载:

PHP4.04Beta WIN32 安装程序
PHP4.03源程序
PHP3.0.16 WIN32 安装程序
PHP3.0.16源程序

如果你从来没有接触过PHP,那么还是先看看这个吧,当然即使你是已经对PHP有所了解,但一本PHP4的的使用手册也还是需要的,:)。此外一本HTML语法手册当然也是不可缺少的啦。。。。。。。。。。

OK!现在应该已经没有什么可以阻止我们学习了,Let's go!

在学习开始以前,我们先交待一下关于表单的基础知识,如果你对HTML非常熟悉,那么可以跳过该部分,直接学习。

故名思议表单是利用网页收集数据的工具,比如你想在网上搞个群众调查啊什么的,肯定是少不了要用他的。下面我简单介绍一下表单的基础知识,关于他的详细内容请自行查阅HTML手册。

表单的使用其实非常简单,大家先看一下下面的例子:

<FORM action="<?php echo $PHP_SELF; ?>"METHOD=post>

名字: <INPUT TYPE=TEXT NAME="name"><BR>

单项选择:

<INPUT TYPE=RADIO NAME="first" VALUE="我很笨">我很笨

<INPUT TYPE=RADIO NAME="first" VALUE="我非常笨">我非常笨

<INPUT TYPE=RADIO NAME="first" VALUE="我简直就是个傻冒"> 我简直就是个傻冒 <br>

多项选择:

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢打蓝球">我喜欢打蓝球

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢游泳">我喜欢游泳

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢跳舞">我喜欢跳舞

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢爬山">我喜欢爬山

<INPUT TYPE=HIDDEN NAME="stage" VALUE= "results"><p>

<INPUT TYPE=SUBMIT VALUE= "谢谢"></p>

</FORM>

名字:
单项选择: 我很笨 我非常笨 我简直就是个傻冒
多项选择: 我喜欢打蓝球 我喜欢游泳 我喜欢跳舞 我喜欢爬山

怎么样?看明白了吗?上部分是表单的html源代码,下部分则是这个表单在浏览器的表现形式。 标志<FORM action="<?php echo $PHP_SELF; ?>"METHOD=post> 表示开始一个表单,到标志</Form>时表单结束。处理这个表单的程序,用Form标志里的action属性指出。在这里为<? echo $PHP_SELF; ?>, 其中$PHP_SELF是PHP中的一个global 变量,用于保存目前执行 PHP 程式页面的档名,<? echo $PHP_SELF; ?>的意思就是用当前的PHP程序来处理这个表单。那么下面的METHOD=post表示什么意思呢?其实表单从浏览器发给服务器有两种方法. GET 和 POST. GET方法将数据打包放置在环境变量QUERY_STRING中作为URL整体的一部分传递给服务器。 POST做很多类似GET同样的事情, 不同的地方就是它是分离地传递数据给脚本. 你的脚本通过标准输入获取这些数据. QUERY_STRING环境变量将不再设置.因此POST有更好的安全性,尤其如果你的表单中有很多数据的话. 当你用GET, 这个服务器就分配变量QUERY_STRING给所有的表单数据, 但是这个变量可存储量是有限的. 换句话说,如果你有很多数据但是你又用GET,你会丢失很多数据。 如果你用POST, 你可以尽可能多地使用数据, 因为这些数据从来也不分配到一个变量里。此外用post传递数据还有一个好处,它不会象get那样把你传送的数据暴露在浏览器的地址栏中,比如象下面这种:form.php?name=genius&pwd=123456 ,明白了吧?所以还是用post让人安心一点啦。

下面继续我们的学习吧,在建立表单的过程中,你一般只会用到两个标志,一个是前面说的<Form>标志,还有就是 <Input>标志,不要小看它哟,表单里的各种小控件都是由它来建立的。借助于Input标志的Type属性可以定义输入方法类型,有效值为TEXT,PASSWORD,RADIO,CHECKBOX,SUBMIT,RESET,IMAGE,FILE,HIDDEN和BUTTON。 下面是对这几个输入类型的简要说明:

TEXT 产生简单的单行文本输入字段,为了取得多行文本,用<TEXTAREA>标志
PASSWORD 和TEXT一样产生简单的单行文本输入字段,但不会在屏幕上显示输入内容
RADIO 产生可开闭的小单选按钮,多项选择可用CHECKBOX型或者<SELECT>标志
SUBMIT 产生用于将所有名称数值对提交给表单处理程序的按钮
RESET 用于将所有输入方法复位为空值或缺省值
IMAGE 将提交按钮变成图形,这个数值与提交按钮一致,只是选择图形时鼠标位置x、y坐标也发送给表单处理程序
BUTTON 产生不与脚本进行特定交互功能的按钮

现在我们已经知道如何生成输入小控件了,那么在这些控件里入的数据怎么传递给我们的程序来处理呢?在d 在INPUT标志中有一个NAME属性专门用于给输入的数值取名,例如: NAME="first"。在定义以后,如果想程序访问这个数据,用global申明一下就可以使用喽。如果想定义数据默认值的话,可以用Value属性定义,例如上面程序的 VALUE="我很笨" 就是定义了一个默认值,下面我们来看一个单项选择的实例:

<INPUT TYPE=RADIO NAME="first" VALUE="我很笨">我很笨

<INPUT TYPE=RADIO NAME="first" VALUE="我非常笨">我非常笨

<INPUT TYPE=RADIO NAME="first" VALUE="我简直就是个傻冒"> 我简直就是个傻冒

从上面大家可以看出NAME,VALUE的基本用法了吗?什么?还不明白。。。。。。。。。(地藏晕倒在地。。。。)

OK,我们的表单使用就简单的讲到这里吧,如果有批评意见,或者好的想法请一定mail to 地藏,下面开始我们进入正题 —– PHP处理表单(我靠,前面全是废话呀,给我扁。。。。。)

用PHP来处理表单数据实在是一件非常简单的事情,打个比方就好象你吃饭时用筷子一样,使用非常的自然,没有什么需要特别注意的地方。老样子,大家开始学习以前先看看下面的代码吧。 <html>
<head>

<title>调查表</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body bgcolor="#FFFFFF">

<?php

function display_form() {

global $PHP_SELF;

?>

<FORM action="<?php echo $PHP_SELF; ?>"METHOD=post>

名字: <INPUT TYPE=TEXT NAME="name"><BR>

单项选择:

<INPUT TYPE=RADIO NAME="first" VALUE="我很笨">我很笨

<INPUT TYPE=RADIO NAME="first" VALUE="我非常笨">我非常笨

<INPUT TYPE=RADIO NAME="first" VALUE="我简直就是个傻冒"> 我简直就是个傻冒 <br>

多项选择:

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢打蓝球">我喜欢打蓝球

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢游泳">我喜欢游泳

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢跳舞">我喜欢跳舞

<INPUT TYPE=CHECKBOX NAME="second[]" VALUE="我喜欢爬山">我喜欢爬山

<INPUT TYPE=HIDDEN NAME="stage" VALUE= "results"><p>

<INPUT TYPE=SUBMIT VALUE= "谢谢"></p>

</FORM>

<?php

}

?>

//程序开始

<?php

function process_form()

{

global $name ;

global $first;

global $second;

if ($first == '我很笨') { $first_message = '你不笨。'; }

elseif ($first == '我非常笨') { $first_message = '你很聪明。'; }

else { $first_message = '你简直就象是一个聪明的人了。'; }

$favorite_second = count($second);

if ($favorite_second <= 1)

{$second_message = '但你很快就会在动物园里死去,忏悔吧!';}

elseif ($favorite_second > 1 && $favorite_second < 4)

{$second_message = '你是只爱运动的的猩猩。';}

else {$second_message = '你运动的太多了,对猩猩来讲已经过量,你准备棺材吧,:(';}

echo "这是一项针对猩猩的测试:<br><br>";

echo "你好! 你的名字叫:$name. <br><br>";

echo "你的测验结果是。。。。。$first_message $second_message";

}

?>

<?php

if (empty($stage)) { display_form(); }

else { process_form(); }

?>

</body>

</html>

上面是一个非常类似调查表的PHP例子,由于程序比较简单,所以没有做什么注解。程序的原型来自PHP实验室。大家在仔细看程序之前可以把这段代码拷下来在自己机器运行一下先看看实际效果,这样有一个直观的印象。

在看完代码之后,大家没有什么问题吧?OK,我们下课。(星空浪子:靠,如果就这样你写了什么呀。)地藏道:"我。。。。。。。。。。。"

咳,各位兄弟,地藏的东西写得不好,请大家多多指点!给地藏写信哟。。。。。

5 月 232006
 

PHP最基础教程 — 参数传递

参数传递可以用很多方法,比如SESSION,cookie,表单传递,URL传递
在这重点介绍一下表单传递和URL传递吧,SESSION和COOKIE到最后再说

1,URL传递:
这个很容易,直接看地址栏http://www.phzzy.org/index.php?aaa=111
其中index.php是文件名,?后面的aaa是参数名,111是参数aaa的值
这样就能把aaa的值传给index.php这个页
如果想传多个参数呢?方法是参数只间加&
比如:
http://www.phzzy.org/index.php?aaa=111&bbb=222&ccc=333
这样就传了三个参数
其中aaa=111,bbb=222,ccc=333
很容易的哈:)
如果想在index.php上获取此参数的值,则用$_GET['aaa'],则能得到aaa的值
比如:
echo $_GET['aaa'];
则输出111

2,表单传递:
表单传递是通过<form><input><textarea>等传递的
比如:
<form action="index.php" method="post">
<input type="text" name="aaa">
<input type="text" name="bbb">
<textarea name="ccc"></textarea>
<input type="submit">
</form>
熟悉HTML的朋友容易知道这样会建立一个表单,其中包括两个input输入框,一个textarea输入框和一个提交按钮,如果我们在输入框中输入东西然后点提交的话,就会把表单的内容提交给index.php,方法是post,然后如果我们要在index.php这个文件中取得提交过来的输入值,则用$_POST['xx']
比如我们在表单aaa中输入了111,bbb中输入了222,ccc中输入了333

echo $_POST['aaa'];//输出111
echo $_POST['bbb'];//输出222
echo $_POST['ccc'];//输出333

还有更加简单的方法,使用于URL传递和表单传递,就是改php.ini里面的配置
找到php.ini中的这行
register_globals
把后面的值设置成ON  (默认为OFF),这样的话就能直接使用传过来的变量了
比如index.php?aaa=111
则在index.php中会自动建立一个变量$aaa,值为111,不过不推荐这样做
🙂

最后一个东西就是如果要把参数连续传递呢?呵呵,先传到第一页,然后获取然后再用上面的办法传给下一页:)

5 月 232006
 

PHP关于网站中进行搜索的设计

HTML页面中可以这样设计,只要把form的method设置为GET就好了,这样,它就会自动的把搜索字符串加的URL的后面。

<form name="formSearch" action="search.php" method="GET">
<input type="text" value="" name="search">
<input type="submit" value="搜索">
</form>

下面是在search.php页面中进行搜索前要进行的处理
为了防止SQL攻击,对其进行过滤,并且,因为URL中带的是特殊格式的,所以要用urldecode函数来对它进行解码

if (isset($_GET['search']) && strlen($_GET['search']) > 0 )
{
$search = trim(urldecode($_GET['search']));
$search = str_replace("update", "", strtolower($search));
$search = str_replace("insert", "", strtolower($search));
$search = str_replace("create", "", strtolower($search));
$search = str_replace("drop", "", strtolower($search));
$search = str_replace("delete", "", strtolower($search));

if (strlen($search) < 1)
{
die("Hacking attempt");
}
// 在这里可以进行其它处理工作了
}

5 月 212006
 

什么是小偷程序?:

       看到这个标题你可千万别误会,这里所说的“小偷”指的是利用ASP 或PHP等强大功能,把远程网站上的数据(图片,网页及其他文件)抓取到本地,经过各种处理后显示到自己的页面上或者存储进数据库的一类程序。
       你可以通过这种小偷程序,完成过去一些似乎完全不可能实现的任务,比如说把某个站的页面偷梁换柱后变成自己的页面,或者把某个站的一些数据(文章,图片)保存到本地数据库中加以利用。“小偷”的优点有:如果你的站被百度等搜收入那么在短期内你的网站访问是会有很大提高且无须维护网站。减少运行成本,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省大量的服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。

5 月 212006
 

百度搜索小偷PHP版

<HTML><HEAD>

<?php
//标题栏结束

//http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=site%3Awww%2Evsay%2Ecom+%CE%AC%C8%FC%CD%F8&pn=10&cl=2

//须识别模块
$wd = $HTTP_GET_VARS['wd'] ? $HTTP_GET_VARS['wd'] : $HTTP_POST_VARS['wd'];
$pn = $HTTP_GET_VARS['pn'] ? $HTTP_GET_VARS['pn'] : $HTTP_POST_VARS['pn'];

//默认
$lm=0;
$si="";
$rn=10;
$ie=gb2312;
$ct=0;
$cl=2;

//需填写
//$wd=key;
//$pn=page;

//地址
$url= "http://www.baidu.com/s?lm=".$lm."&si=".$si."&rn=".$rn."&ie=".$ie."&ct=".$ct."&wd=".$wd."&pn=".$pn."&cl=".$cl;

$str = file("$url");
//函数 file 将档案全部读入数组变量中
$count = count($str);
//函数 count 这个函式用来计算阵列的元素个数
for ($i=0;$i<$count;$i++){
$file .= $str[$i];
//用 for循环,把所有数组中的数据加起来
}
//此处的 $file 就是baidu的输出网页源代码

//替换代码
$file = str_replace("http://www.baidu.com/s","search.php",$file);
$file = str_replace("http://cache.baidu.com/c","cache.php",$file);
$file = str_replace("s?","search.php?",$file);
$file = str_replace("百度","热门",$file);

//开始读取页面中想要的部分
$title = explode("<TITLE>",$file);
$title = explode("</TITLE>",$title[1]);
$title = $title[0];
//$title 标题

//开始读取页面中想要的部分
$count = explode("<td align=right bgcolor=#eeeeee><nobr>",$file);
$count = explode("</nobr>",$count[1]);
$count = $count[0];
//$count 搜索到的篇数

//开始读取页面中想要的部分
$list = explode("<DIV id=DivNews></DIV>",$file);
$list = explode("<TABLE width="100%" bgColor=#f5f5f5 border=0>",$list[1]);
$list = explode("<table border=0 width=100% bgcolor=#f5f5f5><tr><td width=11% align=center class=f10><b>相关搜索</b></td>",$list[0]);
$list = $list[0];
//$list 搜索列表

//内容栏显示
?>

<title><?php echo $title;//标题 ?></title></HEAD>
<BODY>
<FORM name=f action=search.php>
<INPUT class=ff maxLength=100 size=35 name=wd>
<INPUT type=hidden value=3 name=cl>
<INPUT type=submit value=搜索></FORM>

<TABLE>
<TBODY>
<TR vAlign=center align=middle height=18>
<TD align=right bgColor=#eeeeee><NOBR><?php echo $count;//搜索篇数 ?></NOBR> </TD></TR>
<TR>
<TD bgColor=#999999 colSpan=7 height=2></TD></TR></TBODY></TABLE>

<TABLE cellPadding=0 width="27%" align=right ellspacing="0">
<TBODY>
<TR>
<TD>  
<BR>广告位
</TD>
</TR>
</TBODY></TABLE>
<?php echo $list;//搜索列表 ?>

</BODY></HTML>

5 月 212006
 

Baidu搜索小偷ASP版

<%
Function bytes2BSTR(vIn)
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = ubb(strReturn)
End Function

Function dq(key)
dim XmlHttp
set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET","http://www.baidu.com/s?wd="&key&"&pn="&request("pn"), false
XmlHttp.setRequestHeader "Content-Type","text/XML"
XmlHttp.Send
dq = bytes2BSTR(XmlHttp.responseBody)
End Function

Function BR(Str)
Str = Replace(Str,"{br}","<br>")
Str = Replace(Str,vbcrlf,"<br>")
Str = Replace(Str,"<br> <br>","<br>")
Str = Replace(Str,"<br><br>","<br>")
Str = Replace(Str,"<br><br>","<br>")
BR = Str
End Function

function ubb(str)

if instr(str,"找到相关网页") = 0 then
ubb = "没有搜索到任何内容"
exit function
end if

str = Replace(str,vbcrlf,"{br}")
str = Replace(str,"<br>","{br}")
str = Replace(str,"</td>","</td>"&vbcrlf)
str = Replace(str,"<td",vbcrlf&"<td")

dim re,Match,Matches
set re = New RegExp
re.Global = True
re.IgnoreCase = True

re.Pattern=".*<td class=f>(.*)</td>"

Set Matches = re.Execute(str)

For Each Match in Matches
ubb=ubb&BR(Match.value)
next
re.Pattern="(- <a .[^<]*>百度快照</a>)"
ubb = re.replace(ubb,"")
re.Pattern="(<a class=""m"".[^<]*>.[^<]*</a>)"
ubb = re.replace(ubb,"")
re.Pattern="(<font color=#008000>.[^<]*</font>)"
ubb = re.replace(ubb,"<hr>") '每一条信息的间隔
ubb = Replace(ubb,"<td class=f>","")
ubb = Replace(ubb,"</td>","")
ubb = BR(UBB)

re.Pattern="(找到相关网页.*秒)"
Set Matches = re.Execute(str)
set Match = Matches(0)
ubb = ubb & Match & "<br>"

str = Replace(str,"</div>","</div>"&vbcrlf)

re.Pattern="<div class=""p"">(.*)</div>"
Set Matches = re.Execute(str)
set Match = Matches(0)
Dim TheLink
TheLink = Match
re.Pattern="href=s?(.[^>]*)"
TheLink = re.replace(TheLink,"href=""$1""")

ubb = ubb & TheLink
end function

if len(request("wd")) > 0 then
response.write dq(request("wd"))
end if
%>
<form method=post action="?">
<input type="text" name="wd"> <input type="submit">
</form>