5.6其他处理表单的方法
下面,让我们一起来看两种处理表单的编程方法以及它们的优缺点。
5.6.1使用import_request_variables()函数
使用import_request_variables()函数可以有选择地注册全局变量集合。你可以使用该函数导入 $_GET、$_POST和$_COOKIE的值,还可以为每个导入的变量添加前缀(prefix)。
bool import_request_variables ( string types [,string prefix])
参数中types字符串中允许为g、p、c字符,或者3个字符间任意的组合。其中,“g”表示GET变量,“p”表示POST变量,“c”表示cookies。
注意:3个字符的排列顺序是有区别的,当使用“pg”时,POST变量将使用相同的名字覆盖$_GET变量;反之,当使用“gp”时,$_GET变量数组将优先于$_POST。
prefix参数作为变量名的前缀,置于所有被导入到全局作用域的变量之前。比如我们有个名为“userid”的$_GET超级全局变量数组,同时提供了“pref_”作为前缀,那么我们将获得一个名为$pref_userid的全局变量。如果我们要导入其他全局变量(例如$_SERVER变量),则请考虑使用extract()函数(在函数一章中有介绍)。注意,在使用prefix前缀时,不要与现有数据或变量名产生冲突。
使用import_request_variable()函数实现变量导入的脚本例子如下:
//导入POST提交的变量值,前缀为post_
import_request_variable("p", "post_");
//导入GET和POST提交的变量值,前缀为gp_,GET优先于POST
import_request_variable("gp", "gp_");
//导入Cookie和GET的变量值,Cookie变量值优先于GET
import_request_variable("cg", "cg_");
如果我们在import_request_variables()函数中使用了“pg参数”,请看如下脚本实例:
[php]
<?php
if(isset($_REQUEST['btn_submit'])){
echo "正常取得的表单POST变量值:".$_REQUEST['Username']."<br />";
import_request_variables("pg", "import_");
//显示导入的变量名称
echo "使用import_request_variables函数导入的变量值:".$import_Username;
}
?>
<form id="test_form" name="test_form" method="POST" action="">
请输入您的名字:
<label>
<input type="text" name="Username" id="Username" />
</label>
<label>
<input type="submit" name="btn_submit" id="btn_submit" value="提交" />
</label>
<br />
</form>
[/php]
该表单提示用户输入一个名字,完成并提交后,脚本会把提交的名字显示在浏览器上,如图5-4所示。
图5-4
注意:prefix前缀参数是必选的,如果未指定前缀,或者指定一个空字符串作为变量前缀,PHP会抛出一个E_NOTICE错误。
import_request_variables()函数为我们提供一个中间方法,适用于如下几种情况:
1.当用户不能使用超级变量数组时;
2.在php.ini配置文件的register_globals参数为Off(PHP 5之后的版本默认为Off)时,使用import_request_variables将GET/POST/Cookie这几个超级变量数组导入到全局作用域中。
3.在开发时,只要声明了引入的变量范围,就不必写$_GET或$_REQUEST一堆很长的超级全局数组名称了。
5.6.2使用extract()函数
我们可以使用extract()函数,比如在接收页面脚本的最前面加上extract($_POST);extract($_GET);这样的语句,导出几个用于表单处理的超级变量数组值,如以下代码所示:
@extract(i_addslashes($_POST), EXTR_OVERWRITE);
@extract(i_addslashes($_GET), EXTR_OVERWRITE);
@extract(i_addslashes($_COOKIE), EXTR_OVERWRITE);
@extract(i_addslashes($_SESSION), EXTR_OVERWRITE);
我们看一个使用extract导出为正常变量的脚本例子:
<?php
// 将$_GET和$_POST超级变量数组获取的变量转为正常的变量,这样直接显示变量名称即可
extract($_GET);
extract($_POST);
echo "您好, $username $age";
?>
<form action="" method="post">
姓名:<input type="text" name="username" id="username" />
年龄:<select name="age">
<option value=">16">小于16</option>
<option value="16-30" selected>16-30</option>
<option value="31-50">31-50</option>
<option value="51-80">51-80</option>
</select></td>
<input type="submit" name="btn_submit" value="提交" />
</form>
实现的界面如图5-5所示。
图5-5
5.7多页面间传递数据
当遇到一个非常大的表单时,不可能把所有的表单都放在一个页面里面,需要将一个大表单分解成若干个小表单,并保存于几个页面中,当第一个表单填写完后,需要收集该表单的值并传递给下一个表单页面。
我们可以使用如下方法进行处理。
Ø使用表单的隐含元素(hidden)。
Ø把当前表单的数据保存在SESSION中(详情请参见会话一章)。
Ø把当前表单的数据保存在MySQL数据库中。
你可以从以上三个方案中选择一种易于程序处理和调试的解决方案。表单的传值可以使用POST,这样传递数据的尺寸不成问题,另外,在调试程序时,我们可以通过查看HTML源文件方式,来知道当前的变量是否是预想的值。
对于一个非常大的表单,我们就要想办法把它们分解成两个或更多个表单以方便用户输入,这需要在页面间传值,代码如下:
<INPUT TYPE="HIDDEN" NAME="Name" VALUE="<?php echo $_REQUEST['Name']; ?>">
<INPUT TYPE="HIDDEN" NAME="Password" VALUE="<?php echo $_REQUEST['Password']; ?>">
当多个页面传递数据时,我们可以使用类似上面的语句来处理前一页或通过URL传递的值。 |