编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
HTML是Web页面设计的标准,其中的表单为浏览者提供了一个与网站进行互动的平台,它可以将数据传递到PHP,PHP也可获取表单的数据并输出。
表单在页面中主要负责数据采集功能,一个表单有3个基本组成部分:表单标记、表单域和表单按钮。表单标记包含处理表单数据所用程序的URL以及数据提交到服务器的方法;表单域包含让用户选择和输入的区域,像文本框、密码框和复选框等;表单按钮一般用于将数据提交到服务器进行处理,包括提交按钮、复位按钮和一般按钮。
1.表单和HTML:
表单在HTML中由<form>标记定义,是HTML的一个重要组成部分,主要用于搜集不同类型的用户输入和数据传递。在HTML表单中包含了很多表单元素,通过它们允许用户点击、选择和输入信息。语法格式为:
<form name="form_name" method="method" action="url" enctype="value" target="target" id="id" lang="" dir="" classs="" onreset="" onsubmit="" onclick="" ondbclick="">
<!-- 此处放表单元素-->
</form>
上述代码中,表单各个属性的说明如表:
属性名称 |
说明 |
name |
表单的名称 |
method |
设置表单的提交方式,有GET和POST两种 |
action |
指向处理该表单页面的URL,可以是相对位置或者绝对位置 |
enctype |
设置表单内容的编码方式 |
target |
设置返回信息的显示方式,可选值有_blank、_parent、_self和_top |
id |
表单的ID号 |
从语法格式中可以看出,在form中出现的内容称为表单元素,主要有input、label、select、option、fieldset、legend等元素。
2)input元素:
很多表单控件需要使用input元素,该元素可以表现的控件包括单行显示文本框、隐藏文本框、多行显示文本框、复选框、单选按钮、图像域、文件域、按钮等。基本语法结构为:
<input name="name" type="text" value="value" src="url" checked="checked" size="n" maxlength="n" id="id" onclick="function" onselect="function" />
其中,属性type的值决定了表单控件的类型,不同的值对应不同的表单控件,见下表:
Type值 |
控件类型 |
text |
表示单行显示文本框 |
textarea |
表示多行显示文本框 |
password |
表示单行显示文本框,但输入的数据用星号表示 |
checkbox |
表示复选框 |
radio |
表示单选按钮 |
submit |
表示提交按钮,将把数据发送到服务器 |
reset |
表示重置按钮,将重置表单数据,以便重新输入 |
file |
表示插入一个文件,由一个单行文本框和一个“浏览”按钮组成 |
hidden |
表示隐藏文本框 |
image |
表示插入一个图像,作为图形按钮 |
button |
表示普通按钮 |
color |
调色板控件,目前都实现为单行文本框 |
date |
日期控件 |
datetime |
日期和时间控件 |
datetime-local |
本地日期和时间控件 |
一个单行文本框,呈现E-mail地址 |
|
month |
月份控件 |
number |
表现为一个单行文本框,或带步进按钮 |
range |
滑动刻度控件 |
search |
搜索文本框 |
tel |
一个单行文本框,呈现电话号码 |
time |
时间控件 |
url |
一个单行文本框,呈现URL地址 |
week |
星期控件 |
属性name为控件定义一个名称标识,该名称与控件的当前值形成“名称/值”对一同随表单提交;属性value用于设定初始值,可选,如果用户不输入就采用此默认值,单选按钮或复选框不需要定义属性value;属性checked针对复选框和单选按钮,是一个逻辑值,指定选中的状态,其他控件忽略;属性size表示控件的初始宽度,像素为单位,text和password控件表示的是字符的数目;属性maxlength仅适用于text和password控件,指定可以输入的字符最大量,可以超过size值,这时会提供一个滚动条,默认值对数量没有限制;属性src针对image,用来设定图像文件的地址,指定用来装饰提交按钮的图片位置。
3)Label元素:
Label元素用来为其他表单控件定义标签显示。示例:
<label>
<input type="radio" name="adioGroup1" value="item1" />单选按钮Item1
</label><br />
<label>
<input type="radio" name="RadioGroup1" value="item2" />单选按钮Item2
</label><br />
<label>
<input type="radio" name="RadioGroup1" value="item3" />单选按钮Item3
</label><br />
上述代码推荐按XML标准的格式重写为:
<input type="radio" name="RadioGroup1" value="item1" id="radio1"/>
<label for="radio1">单选按钮Item1</label><br />
<input type="radio" name="RadioGroup1" value="item2" id="radio2" />
<label for="radio2">单选按钮Item2</label><br />
<input type="radio" name="RadioGroup1" value="item3" id="radio3" />
<label for="radio3">单选按钮Item3</label><br />
Label元素可以通过for属性建立与某个表单控件的关联,for属性的值必须与表单控件的id属性的值相同。
4)Select元素和option元素:
两个元素配合使用完成一个表单控件功能,select元素用来指定一个表单类型,option元素为该表单提供数值项。语法格式为:
<select name="select" size="size" multiple="multiple">
<option selected="selected">Item1</option>
<option selected="selected">Item2</option>
<option selected="selected">Item3</option>
<option selected="selected">Item4</option>
</select>
当select元素不包含属性size和multiple时,表单类型显示为菜单(组合框);如果使用了属性size和multiple中的任意一个,则表单类型显示为列表框。
Option元素的使用类似于label元素,但它可以有一个selected属性,当该属性的值被设置为selected时表示该项被选中。
注意,组合框中仅能同时设置一个option元素的selected属性值为selected;对于列表框,当属性multiple没有设置时,也仅能设置一个option元素的selected属性值为selected。
5)Textarea元素:
这是一个建立多行文本框的专用元素。语法格式为:
<textarea name="name" cols="n" rows="n" wrap="off|hard|soft">
多行文本
</textarea>
属性cols和rows分别用来限定文本框的宽度和高度(行数);属性wrap用来进行换行控制,off表示不自动换行,hard表示自动硬回车换行(换行元素被一同传送到服务器中),soft表示自动软回车换行(换行元素不会传送到服务器中)。
6)Fieldset元素和legend元素:
这两个元素一般配合使用,fieldset元素可以包含其他的表单控件,在这些表单控件周围显示一个方框;而legend元素可以显示一个标签,说明被包含的表单控件,即将表单分组。基本语法格式为:
<fieldset>
<legend>表单集说明标签</legend>
...其他表单控件元素...
</fieldset>
并且,一个表单内可以使用多个fieldset元素(包含legend元素)来定义表单集。也可以单独使用fieldset元素,这将仅在表单控件周围画一个方框,而不显示标志标签。
7)表单与PHP:
对于大多数基于数据库的网站,网站开发人员需要处理很多事物,包括从数据库读取数据动态生成网站,为了使网站具有交互性还需要做额外的工作。
在网站开发时,JavaScript主要用于前端页面与用户的交互处理,以直接响应用户的行为,例如动态提示、数据验证等。而PHP主要负责在服务器端收到请求的数据,处理后发送给客户端浏览器响应。示例:
<?php
$name="歌唱比赛"; //为变量$name赋值
?>
标题:<input name="name" type="text" id="name" value="<?php echo $name; ?>">
上述代码为表单文本框进行赋值,只需要将所赋的值添加到value属性后面即可。而如果对表单的隐藏域进行赋值也类似:
<?php
$id="HNZZ04410474"; //为变量$id赋值
?>
隐藏域HID值:<input type="hidden" name="HID" value="<?php echo $id; ?>">
在程序开发过程中经常用隐藏域来存储一些不必要显示的信息或需要传送的参数。隐藏域的值在程序运行过程中并不可见,为了看到效果,可以通过echo语句将隐藏域的name属性值进行输出,如“echo $_POST[“HID”];”。示例:
如下代码创建变量并赋值:
<?php
$nameTip="在这里留下你的名字";
$emailTip="留下你的邮箱便于联系";
$textTip="有什么要说的写到这里";
?>
在表单中对输入姓名的input元素进行修改:
<label for="posName">姓名<span>(必须)</span></label><br />
<input name="posName" type="text" class="text" id="posName" value="<?php echo $nameTip; ?>" size="25">
然后对输入邮箱的input元素进行修改:
<label for="posEmail">邮箱<span>(必须)</span></label><br />
<input name="posEmail" type="text" class="text" id="posEmail" value="<?php echo $emailTip; ?>" size="25">
最后对输入留言内容的textarea元素进行修改:
<label for="posText">内容<span>(必须)</span></label><br />
<textarea cols="50" rows="3" name="posText" id="posText"><?php echo $textTip; ?></textarea>
2.获取表单数据:
表单是Web应用中最常用的功能之一,由文本输入框、下拉菜单、复选框和按钮等元素组成。表单用于用户输入和提交信息,常见的有注册用户、发表留言、添加商品等交互功能,表单填写完毕后提交给服务器端的PHP处理。
1)设置表单提交方式:
HTML表单有两种提交方式:GET和POST,采用哪种方式提交表单数据由form元素的method属性值决定。这两种方式在数据传输过程中分别对应HTTP协议的GET和POST方法。
①GET方法:
GET是表单的默认提交方法,使用浏览器地址栏来传递数据。例如,在搜索引擎中搜索hello关键字转到的URL地址为:
http://www.baidu.com/s?wd=hello&rsv_bp=0&rsv_spt=3&rsv_n=2&inputT=944
http://www.google.com.hk/search?source=ig&hl=zh-CN&rlz=1G1GGLQ&q=hello&btnG=Google+%E6%90%9C%E7%B4%A2
可以看到地址中间问号之后的字符串,使用的是“参数名=参数值”的形式,多个参数之间使用“&”分隔。在问号之前的是接收参数的URL地址。整行的作用是将问号后面的各个值传递到前面的URL地址进行处理,该地址由表单的action属性指定。
下面代码创建一个使用GET方式向server.php提交的表单:
<form action="server.php" method="get" id="userform"></form>
提交后将会看到类似如下的URL地址:
Server.php?k=hello&n=bbs&type=diary&charset=utf-8&type=diary
对于GET方式提交的数据可以由PHP中的$_GET数组进行接收。
GET方式的优点是方便直观、通过表单输入或者网页超链接就可以实现;缺点是不安全,传输过程中数据被放到请求的URL中,会有一些隐私信息被第三方看到,而且受URL长度的限制GET方式能传输的数据也比较小。
另外,当GET方式中传递的字符串中含有汉字或者其他非ASCII字符时,需要额外的编码转换。
②POST方式:
使用POST方式提交时,数据将随着页面请求的HTTP数据包一起发送,因为不会在URL地址栏上体现,因此用户只会看到提交后的地址,而不会看到其他数据。
下面代码创建一个使用POST方式向server.php提交的表单:
<form action="server.php" method="post" id="userform"></form>
对于POST方式提交的数据可以由PHP中的$_POST数组进行接收。
当用POST方法提交数据时,整个过程是不透明的,这是因为数据会附加到HTTP协议的header信息中,用户也不能随意修改,安全性要比GET强,也可以发送大体积数据。
因为POST是随HTTP的header信息一起发送,因此一旦POST表单提交,如果用户使用浏览器的“后退”按钮,浏览器不会重新提交POST数据。如果此时单击“刷新”按钮,将会有“数据以及过期,是否重新提交表单”的提示,这一点没有GET方便。在GET提交时,无论用户使用后退还是刷新功能,浏览器的URL地址仍然存在。
POST 与GET的另一个不同点是,当对GET方式提交后的页面使用收藏夹,下次再访问的时候会直接进入这个页面。而如果是收藏POST方式提交后的页面,再次访问是可能没有任何数据,因为缺少提交值,这也是搜索引擎网站使用GET方式处理关键字的原因。
2)获取GET提交的数据:
对于GET方式提交的表单,在PHP页面使用$_GET变量,$_GET变量其实是一个数组,用于获取来自method="get"的表单中的值,也可以获取在URL地址中问号后面的参数值。示例:
<?php
$start=$_GET["start"]; //获取URL地址栏中参数名称为start的值
$end=$_GET["end"]; //获取URL地址栏中参数称为end的值
echo "查询条件:从<b>".$start."</b>".$end."</b>的数据";
?>
上述代码保存为admin.php文件并在浏览器运行后,URL使用如下形式指定参数值:
admin.php?start=值1&end=值2
例如,这里使用的是“admin.php?start=100&end=1000”。
在PHP中$_GET是一个关联数组,它会自动包含在URL问号后面查询字符串中的所有值,因此在查询字符串中传递变量名称可以访问。
PHP的使用非常简单,只用一行代码就可以获取URL中的参数。但这时会有安全隐患,因为参数数值可能是HTML代码,这很容易使恶意的用户使用复杂的代码可能会窃取用户信息,或者造成其他安全问题。在PHP中,调用htmlspecialchars()函数即可转义其中的恶意标记。示例:
$start=htmlspecialchars($_GET["start"]);
$end=htmlspecialchars($_GET["end"]);
示例:
PHP页面文件index_get.php中的表单代码为:
<form action="index_get.php" method="get" id="msgForm">
<label for="msgName">姓名<span>(必须)</span></label><br />
<input name="msgName" type="text" class="text" id="msgName" value="" size="25" /><br />
<label for="msgEmail">邮箱<span>(必须)</span></label><br />
<input name="msgEmail" size="25" type="text" class="text" id="msgEmail" value="" /><br />
<label for="msgText">内容<span>(必须)</span></label><br />
<textarea cols="50" rows="3" name="msgText" id="msgText" /></textarea><br />
<p><input class="button" name="sendmsg" id="sendmsg" value="发送" type="submit" /></p>
</form>
form标记的action属性指定表单提交地址为本页面,method属性指定表单使用get方法提交。然后使用PHP代码实现使用$_GET获取表单中的数据并输出。
<?php
if (isset($_GET["sendmsg"])) { //是否单击了“发送”按钮
$name=$_GET['msgName']; //保存姓名
$email=$_GET['msgEmail']; //保存邮箱
$text=$_GET['msgText']; //保存内容
echo ("<b>$name</b>[$email]留言说:<br />");
echo ("内容:$text"); //输出留言内容
}
?>
由于“发送”按钮的name属性是sendmsg,所以上述代码通过判断$_GET数组中是否有sendmsg键来检测用户是否单击了“发送”按钮。浏览器中打开index_get.php文件,输入信息后单击“提交”按钮,在浏览器地址栏会看到传递的参数信息:
http://localhost/index_get.php?msgName =zht&msgEmail =somday@126.com&msgText =%E5%86%85%E5%AE%B9%E5%BE%88%E5%96%9C%E6%AC%A2%E3&80%82&sendmsg=%E5%8F%91%E9%80%81
可见,使用GET方式提交表单中的数据时,URL和表单元素之间用“?”隔开,而多个表单元素之间用“&”隔开,每个表单元素的格式都是“name=value”,固定不变。
3)获取POST提交的数据:
POST方式提交后的URL地址非常简洁,这是因为POST数据是随HTTP请求一起发送的,因此不会在URL地址栏中看到。
对于POST方式提交的表单,在PHP中可以通过$_POST变量来获取,也是一个数组,其中的每一个键值对应表单中的一个元素。例如,表单中包含一个name为“username”的文本输入框,在使用POST方式提交数据后,PHP可以使用$_POST["username"]获取用户输入的值。示例:
将index_get.php文件另存为index_post.php文件,但修改以下代码:
<form action="index_post.php" method="post" id="msgForm">
其中,修改提交数据的方式为POST,然后修改获取数据的代码为使用$_POST:
<?php
if (isset($_POST["sendmsg"])) { //是否单击了“发送”按钮
$name=$_POST['msgName']; //保存姓名
$email=$_POST['msgEmail']; //保存邮箱
$text=$_POST['msgText']; //保存内容
echo ("<b>$name</b>[$email]留言说:<br />");
echo ("内容:$text"); //输出留言内容
}
?>
其中,$_POST也是数组,用于收集来自method="post"的表单中的值,由HTTP POST方式发送的变量名和值组成。在浏览器中运行index_post.php页面,输入内容之后单击“发送”按钮同样可在下方看到留言,但是浏览器的URL不会发生变化。
3.表单的常见操作:
1)遍历表单:
无论表单使用POST还是GET方式进行提交,在PHP中都是通过数组获取的,因此可以使用foreach语句遍历数组中的所有元素,从而输出表单中元素的键和值。
要遍历表单要首先确定是以POST还是GET提交的。示例:
<form action="forEachForm.php" method="post">
<!--此处省略表单元素的代码-->
<input name="submit" type="submit" id="button" value="提交" />
</form>
如果要遍历上面的表单应该使用$_POST数组,代码为:
<?php
if (isset($_POST["submit"])) { //判断是否单击了“提交”按钮
?>
<table cellpadding="5" cellspacing="1">
<tr height="20">
<th colspan="2">表单中变量的值</th>
</tr>
<?php foreach($_POST as $name=>$value) { //遍历$_POST数组
<tr>
<td width="174" class="first"><?php echo "键名:".$name; ?></td>
<td width="437" align="left"><?php
if (is_array($value)) { //输出元素的值
echo "数组值为:";print_r($value);
}else{
echo "值为:".$value;
}?></td>
</tr>
<?php } ?>
</table>
<?php } ?>
在第一次运行时由于未提交,$_POST数组为空,所以不会有任何输出。当在表单中单击“提交”按钮之后,$_POST数组中会有一个名为submit的键,此时会执行if中的语句。
2)获取表单中的多值:
表单中包含的元素类型有很多,有的键对应的是单值,有的键值则是一个数组,有一些输入项需要具有一个名称(像单选按钮),而也有一些具有多个名称(像复选按钮),而其他的元素则具有唯一名称。示例:
创建趣味测试表单的页面case.php:
<h2>趣味测试</h2>
<form id="form1" name="form1" method="post" action="case.php">
<p>1、如果笔相对于写字,那么书相对于()。<br />
<input type="radio" name="test1" id="radio2" value="A" />
<label for="radio2">A 娱乐</label>
<input type="radio" name="test1" id="radio3" value="B" />
<label for="radio3">B 阅读</label>
<input type="radio" name="test1" id="radio4" value="C" />
<label for="radio4">C 学文化</label>
<input type="radio" name="test1" id="radio1" value="D" />
<label for="radio1">D 解除疲劳</label>
</p>
<p>2、选择你最喜欢的神话故事()。<br />
<input type="checkbox" name="story[]" id="story" value="十二星座神话故事" />
<label for="story">十二星座神话故事</label>
<input type="checkbox" name="story[]" id="checkbox" value="西王母和蟠桃仙子" />
<label for="checkbox">西王母和蟠桃仙子</label>
<input type="checkbox" name="story[]" id="checkbox2" value="普罗米修斯" />
<label for="checkbox2">普罗米修斯</label><br />
<input type="checkbox" name="story[]" id="checkbox3" value="樱桃花树" />
<label for="checkbox3">樱桃花树</label><br />
<input type="checkbox" name="story[]" id="checkbox4" value="森林公主" />
<label for="checkbox4">森林公主</label><br />
<input type="checkbox" name="story[]" id="checkbox6" value="五路神传说" />
<label for="checkbox6">五路神传说</label><br />
</p>
<p>姓名:<!--姓名输入域-->
<input type="text" name="username" id="textfield" value="你的姓名" size="20">
<!--班级选择按钮-->
<input type="radio" name="grade" id="radio" value="大班" />大班 
<input type="radio" name="grade" id="radio" value="小班" />小班</p>
<p><input type="submit" name="submit" id="button" value="提交" /></p>
</form>
该表单的action为case.php,即提交到本页面进行处理。表单中第一题的多个答案(单选按钮)都具有相同的名称text1,选择班级的“大班”和“小班”也具有一个名称grade。针对这些表单元素可以使用name属性从提交数组中获取,结果是一个值。而第二题的故事名称也是多个答案(复选按钮)具有相同的名称story[]。对于这种多选情况,使用name属性获取之后得到的是一个数组,其中包含选择的每个值。
在表单的下方编写代码,获取用户单击“提交”后的值并输出结果:
<?php
if (isset($_POST["submit"])) { //判断是否单击了“提交”按钮
$username=$_POST['usrname']; //保存用户名
$grade=$_POST['msgEmail']; //保存班级
$message=”来自$grade的<strong>$username</strong>小朋友”;
?>
感谢你参与测试。<br /><?php echo($message.”的信息如下:”); ?><br />
第1题的选择是:<?php echo $_POST['test1']; ?><br />
最喜欢的神话故事有:<br />
<?php
foreach($_POST['story'] as $s) { //遍历数组
echo ($s."、");
}
} ?>
在测试表单中,创建了一个复选框按钮,为了让PHP识别赋给一个表单变量的多个值,需要把表单中具有多个值的name属性命名为带有“[]”的名称。这样PHP将像处理数组一样对待所提交的变量。
3)动态生成表单:
在一些网站中需要使用PHP根据不同的请求从数据库读取数据来动态生成表单,例如随机出题。
①生成一组单选按钮:
单选按钮使用户在多个选项中选择一项,类似于单项选择题。一个单选按钮的HTML代码为:
<input type="radio" name="name" id="id" value="value" />
Input标记的type属性设置为radio表示一个单项按钮。相同name的单选按钮表示一个单选按钮组,其中只能有一个被选中。id属性用于唯一标识一个单选按钮,value属性用于指定选中该按钮之后的取值。
示例:下面代码创建4个单选按钮,它们使用相同的组名season
<input type="radio" name="season" id="spring" value="春" />春
<input type="radio" name="season" id="summer" value="夏" />夏
<input type="radio" name="season" id="autumn" value="秋" />秋
<input type="radio" name="season" id="winter" value="冬" />冬
对于单选按钮来说,最重要的是name属性和value属性。为了可以动态生成它们,定义了一个函数generateRadioButtons(),代码为:
function generateRadioButtons($name, $data=array(), $default="") {
$name=htmlentities($name); //转换名称
$html="";
foreach ($data as $value=>$label) { //开始遍历
$value=htmlentities($value); //开始转换
$html.="<input type=\"radio\" "; //生成单选按钮的开始
If ($value==$defaule) $html.=" checked "; //判断是否选中
$html.="name=\"$name\" value=\"$value\">”; //生成名称和值
$html.=$lable."<br \>"; //显示文本
}
return $html;
}
生成函数有3个参数:$name参数用于指定生成单选按钮的名称;$data参数接收一个关联数组(默认为空数组),$default参数用来指定哪个单选按钮被选中(默认为空)。在函数体内,首先把传递的$name进行HTML实体转换,然后使用foreach语句对$data数组进行遍历,在遍历时根据元素的名称和值生成单选按钮的HTML代码,如果某个值与$default参数相同,则增加一个cheched输出表示默认选中。
下面的代码就是调用generateRadioButtons()函数生成一个包括4个单选按钮的HTML:
<p>1、找出不同类的一项()。<br />
<?php
$question=array("A"=>"碟子", "B"=>"米饭", "C"=>"小勺", "D"=>"铁锅");
echo generateRadioButtons("ques",$question, "A"); //显示单选按钮
?> </p>
上述代码指定单选按钮的组名为ques,使用的数据来自$question数组,第三个参数表示默认选项A。生成的HTML代码如下:
<input type="radio" checked name="ques" value="A" />碟子<br />
<input type="radio" name="ques" value="B" />米饭<br />
<input type="radio" name="ques" value="C" />小勺<br />
<input type="radio" name="ques" value="D" />铁锅<br />
②生成一组复选按钮:
复选按钮在表单中适用于可以选择多项的情况。一个复选按钮的HTML代码为:
<input type="checkbox" name="checkbox" id="checkbox">
Input标记的type属性设置为checkbox表示一个复选按钮。相同name的复选按钮表示一组,其中至少能有一个被选中。id属性和value属性与其他标记相同。
示例:下面代码创建4个复选按钮,它们使用相同的组名ball
<input type="checkbox" name="ball" value="A" />乒乓球
<input type="checkbox" name="ball" value="B" />网球
<input type="checkbox" name="ball" value="C" />羽毛球
<input type="checkbox" name="ball" value="D" />高尔夫球
定义一个函数generateCheckButtons()动态生成一组复选按钮,代码为:
function generateCheckButtons($name, $data, $default=null) {
$html="";
if (!is_array($default)) $default=array();
foreach ($data as $value=>$label) { //开始遍历
$value=htmlentities($value); //开始转换
$html.="<input type=\"checkbox\" "; //生成单选按钮的开始
if (is_array($value, $defaule)) $html.=" checked "; //判断是否选中
$html.=”name=\"$name\" value=\"$value\">"; //生成名称和值
$html.=$lable."<br \>"; //显示文本
}
return $html;
}
生成函数有3个参数:复选框名称$name参数;数据来源数组$data参数(默认为空数组),默认选项数组$default参数(可省略)。在函数体内,首先判断$default参数是不是数组,如果不是则赋给一个空数组表示没有默认选择项;接下来对$data数组进行遍历,每遍历一次都会生成复选数组按钮的HTML代码,同时判断如果当前值在$default参数中,则增加checked输出表示选中。
下面的代码调用generateCheckButtons()函数生成一个包括8个复选按钮的HTML:
<p>2、中国古代四大名著分别是()。<br />
<?php
$books=array("ym"=>"一帘幽梦", "xyj"=>"西游记", "tlbb"=>"天龙八部", "hlm"=>"红楼梦", "yttl"=>"倚天屠龙记", "xhz"=>"水浒传", "xqj"=>"寻秦记", "sgyy"=>"三国演义");
$selected=array("xyj", "sgyy");
echo generateCheckButtons("books",$books, $selected);
?> </p>
③生成一组下拉列表:
下拉列表也称下拉菜单,使用select标记进行定义,在标记中嵌套option标记来表示一个列表(菜单)项,其中value属性表示选中的值。使用selected标识可以指定默认选中的项。一个下拉列表的HTML代码为:
<select name="select" id="select">
<option value="0371">郑州</option>
<option value="010" selected>北京</option>
<option value="0731">长沙</option>
</select>
Select标记还有一个multiple属性,表示可以在列表中多选。
定义一个函数generateSelecteMenus()动态生成下拉列表,代码为:
function generateSelecteMenus($name, $data, $default=null) {
if (!is_array($default)) $default=array();
$html=”<select name\"$name\" id='".$name."[]' mult=\"multiple\">";
foreach ($data as $value=>$label) { //开始遍历
$value=htmlentities($value); //开始转换
$html.="<option value=\"$value\" "; //输出菜单项
if (is_array($value, $defaule)) $html.=" selected "; //判断是否选中
$html.=" name=\"$name\" value=\"$value\">"; //生成名称和值
$html.=$lable."</option><br \>"; //显示文本
}
return $html."</select>";
}
该函数同样需要3个参数,调用代码为:
$selected=array("xyj", "tlbb"); //定义默认选中项
echo generateSelecteMenus("select", $books, $selected); //输出
4.表单处理技巧:
出于安全考虑,经常需要对表单进行一些特殊的处理。
1)检测表单提交路径:
通过对表单来源的处理,可以允许从某个域名(URL地址)或脚本自身进行提交,从而有效防止伪造相同的表单向程序进行提交造成的安全问题。
在PHP中提供了一个名为$_SERVER的全局数组,其中的HTTP_REFERER键保存的是上一页的来源,例如表单的提交地址或者是转向前的URL地址。如果用户从其他的计算机上提交表单或者从浏览器中直接输入表单提交地址,该键会是表单的来源或者空值,这样就可以通过该值进行处理。下面列出了$_SERVER数组中常用的键:
·$_SERVER[‘HTTP_REFERER’]:值是一个完整的URL地址,用于标识前一个页面的来源。
·$_SERVER[‘SERVER_NAME’]:值是当前的域名(服务器名称)。
·$_SERVER[‘PHP_SELF’]:值是当前URL中除去域名的完整路径,包括文件名。
·$_SERVER[‘REQUEST_METHOD’]:访问页面时的请求方法,如GET、HEAD、POST或者PUT。
例如,对于“http://localhost/cha9/index.php”地址使用$_SERVER[‘SERVER_NAME’]返回localhost,使用$_SERVER[‘PHP_SELF’]返回/cha9/index.php。
例如在case.php文件中有如下的表单代码:
<form id="form1" name="form1" method="post" action="case.php'>
<input type="submit" name="submit" id="button" value="提交" />
</form>
上述代码指定表单以POST方式提交到本页面,即由case.php进行处理。为了判断用户是否正常提交,可以使用如下代码:
<?php
$pathname=$_SERVER['PHP_SELF']; //保存当前页面名称
if ($_SERVER['REQUEST_METHOD']=='POST') { //是否POST提交
$ref=$_SERVER['HTTP_REFERER']; //获取表单提交前的URL
$url="http://{$_SERVER[‘SERVER_NAME’]}$pathname"; //获取当前的URL
echo "当前页面来源为".$ref."<br />服务器地址为:".$url;
if (strcmp($url, $ref)==0) {
echo " <br />正常提交";
}else{
echo " <br />不允许外站提交的数据";
}
}else{
echo " <br />请先提交表单再操作。";
}
?>
上述代码通过比较http://{$_SERVER[‘SERVER_NAME’]}$pathname是否与$_SERVER [‘HTTP_REFERER’]相同来判断是否为合法的表单提交动作。
2)避免表单重复提交:
在用户提交表单时,由于网速的原因,或者网页被恶意刷新,可能会导致同一个表单重复提交,造成数据重复。对程序开发人员来说,可以从客户端和服务器端两个方面来避免。
①使用客户端脚本:
客户端脚本通常用于对表单的数据进行有效性验证,同样也可以使用来处理表单的重复提交问题。示例:
<form id="form1" name="search" method="post" action="search.php">
关键字:<input name="key" type="text" id="key" size="20" />
<input type="submit" name="submit" id="button" value="搜索"
onclick="document.search.submit.value='正在提交'; document.search.submit.disabled
=true; document.search.submit();" />
</form>
上述代码为“搜索”按钮添加了onclick事件检测用户的单击状态,一旦用户单击“搜索”按钮之后该按钮会变得不可用,并显示“正在提交”提示,用户不能再次单击该按钮也就避免了表单的重复提交。
第二种实现方式是利用表单的onSubmit事件实现,代码为:
<script language="javascript" type="text/javascript">
var isFirst=0;
function checkSubmit(form) {
if (isFirst==0) { //如果是第1次
isFirst++; //修改标识的值
return true; //返回true,可以提交
}else{
alert ("表单已经提交,请不要重复提交。");
return false; //返回false,表单不会提交
}
}
</script>
<form id="form1" name="search" method="post" action="search.php"
onsubmit="return checkSubmit(this)">
关键字:<input name="key" type="text" id="key" size="20" />
<input type="submit" name="submit" id="button" value="搜索" />
</form>
上述代码中,如果用户第一次单击“搜索”按钮,onsubmit事件指定的脚本会自动调用,并在脚本中修改isFirst变量的值,然后提交表单。当再次单击“搜索”按钮时,由于isFirst变量的值已经不是0,会提示已经提交,并取消提交动作。
②使用Cookie处理:
这种方式是指表单提交之后使用Cookie记录提交,代码为:
<?php
if (!isset($_POST['submit'])) { //如果单击了“提交”按钮
setcookie("tempcookie", "", time()+30); //记录提交状态
header("Location:".$_SERVER['PHP_SELF']); //转向提交页面
echo "当前页面来源为".$ref."<br />服务器地址为:".$url;
exit();
}else{
setcookie("tempcookie", "", 0);
echo "表单已经提交,请不要重复操作";
}
?>
这种方式有一个明显的缺陷就是如果客户端禁用了Cookie,代码将不起任何作用。
③使用Session处理:
这是PHP服务器端的解决方案。Session保存在服务器端,可以在PHP运行过程中修改Session的值,待下次访问这个变量时,得到的是新赋的值。所以,可以用Session变量保存表单提交的值,如果不匹配则认为在重复提交。代码为:
<?php
session_start(); //开始一个会话
$code=mt_rand(0, 100); //产生一个随机数
$_SEEION['code']=$code; //保存这个随机数
?>
上面代码会在表单页面产生一个随机数,将它作为隐藏域放在表单内。代码为:
<input name="checkbox" type="hidden" value="<?php echo $code; ?>" />
然后在表单提交后的处理页面中获取这个随机数,如果相同则是正常提交,否则提示不能提交。代码为:
<?php
session_start(); //开始一个会话
if (!$_POST['checkbox']==$_SESSION['code']) { //判断提交表单的随机数是否相同
unset($_SESSION['code']); //清空会话
header("Location:".$_SERVER['PHP_SELF']); //转向提交页面
echo "表单提交正常";
}else{
echo "表单已经提交,请不要重复操作";
}
?>
④使用header函数:
还有一个更简单的方法,就是当用户提交表单服务器端处理之后立即转向其他页面。代码为:
<?php
if (!isset($_POST['action'])&&$_POST['action']='submit') {
header("Location:submit_success.php");
}?>
这样即使用户刷新页面,也不会导致重复提交,因为已经转向新的页面,而这个脚本也已经不会提交数据了。
3)表单过期处理:
在开发过程中,经常会出现因表单出错而重新返回页面的情况,此时前面填写的信息全部会丢失。为了使数据支持页面的后退,可以通过两种方式实现。
①使用header头设置缓存控制头Cache-Control。
header('Cache-Control:private, must-revalidate'); //支持页面后退
②使用session_cache_limiter方法:
session_cache_limiter('private, must-revalidate'); //此方法写在session_start()方法之前
下面的代码可以防止用户填写表单后,单击“提交”按钮返回时刚刚在表单上填写的内容被清除:
session_cache_limiter('nocache');
session_cache_limiter('private');
session_cache_limiter('public');
session_start();
将上述代码放在所有脚本之前,这样用户在返回该表单时已经填写的内容就不会被清空。
消息头Cache-Control的作用用于指定请求和响应遵循的缓存机制,而且在请求或者响应信息中设置Cache-Control并不会修改另一个消息处理过程中的缓存过程。下表列出了该消息常用的指令及其作用:
指令名称 |
说明 |
Public |
指定响应可被任何缓存区缓存 |
private |
指定对于单个用户的整个或者部分响应信息,不能被共享缓存处理。这允许服务器仅描述当前用户的部分响应信息,此响应信息对其他用户的请求无效 |
no-cache |
指定请求或者响应信息不能缓存 |
no-store |
用于防止重要的信息被无意地发布。在请求信息中发送将使得请求和响应信息都不使用缓存 |
max-age |
指定客户端可以接收生存期不大于指定的响应 |
min-fresh |
指定客户端可以接收响应时间小于当前时间加上指定时间的响应 |
max-stale |
指定客户端可以接收超出超时间期的响应信息。如果指定max-stale消息的信息的值,那么客户端可以接收超出超时期指定值的响应信息 |
5.转换URL中的汉字:
使用GET方式提交表单时,数据的值必须为ASCII字符。因此,当GET方式传递的字符串含有汉字或者其他非ASCII字符时,则需要使用额外的转换操作。这包括传递时对汉字进行编码,获取时对汉字进行解码。
1)编码操作:
编码主要是指对地址栏传递参数进行的一种编码规则。例如,在参数中带有空格传递时就会发生错误,而用URL编码过以后,空格转换成了”%20”,这样错误就不会发生。对中文进行编码也是同样的情况。
PHP中对URL进行编码使用的是urlencode()函数。语法格式为:
string urlencode (string $str)
该函数可以实现将字符串$str进行URL编码并编码后的字符串,它与POST方式提交数据采用的编码方式是一样的。
示例:单击搜索链接将通过URL传递中文关键字到指定页面
<h2>站内搜索</h2>
当前正在搜索“儿童读物”内容,可通过如下链接转到结果列表:<br />
<a href="http://www.itzcn.com/link.php?name=<?php echo urlencode("儿童读物"); ?>">搜索儿童读取</a><br /> http://www.itzcn.com/link.php?name=<?php echo urlencode("儿童读物"); ?>
上述代码中,使用urlencode()函数对关键字“儿童读物”进行编码。对于服务器而言,编码前后的字符串并没有什么区别,服务器能够自动识别。
2)解码操作:
使用$_GET可以获取URL中传递的参数,但是对于进行编码后的URL查询字符串,则需要通过urldecode()函数对获取后的字符串进行解码。语法格式为:
string urldecode (string $str)
该函数可以实现将URL编码$str查询字符串进行解码。
示例:用urlencode()函数对获取的变量name进行解码并输出到浏览器
<h2>站内搜索</h2>
<?php
if (!isset($_GET['name'])) {
$name=urldecode($_GET['name']);
}?>
你输入的关键字是"<?php echo $name; ?>"。<br />可以通过如下链接搜索<?php echo $name; ?>:<br />
<a href="http://www.itzcn.com/link.php?name=<?php echo urlencode("儿童读物"); ?>"> http://www.itzcn.com/link.php?name=<?php echo urlencode("儿童读物"); ?> </a>