1.
当我通过表单/URL 传值时需要用什么编码/解码方法?
在几个环节上编码方式很重要。假定你有 string
$data,其中包含了你想通过非编码方式传递的字符串,那这是相关步骤:
例子 51-1. 隐藏的 HTML 表单单元
<?php echo "<input type='hidden' value='" . htmlspecialchars($data) . "'>\n"; ?>
|
|
注:
用 urlencode() 来处理 $data 是错误的,因为是浏览器的责任来
urlencode() 数据。所有流行的浏览器都能正确处理。注意不论何种方法(例如 GET 或
POST)都会这样。不过你只会在用 GET 请求时注意到这一点,因为 POST 请求通常是隐藏的。
例子 51-2. 等待用户编辑的数据
<?php echo "<textarea name='mydata'>\n"; echo htmlspecialchars($data)."\n"; echo "</textarea>"; ?>
|
|
注:
数据会按照预期的显示在浏览器中,因为浏览器会解释 HTML 转义符号。
当提交时,不论是 GET 或者 POST 方法,数据都会被浏览器进行 urlencode
来传输,并直接被 PHP urldecode。所以最终你不需要自己处理任何
urlencoding/urldecoding,全都是自动处理的。
例子 51-3. URL 中的例子
<?php echo "<a href='" . htmlspecialchars("/nextpage.php?stage=23&data=" . urlencode($data)) . "'>\n"; ?>
|
|
2.
我在试用 <input type="image"> 标记,但是没有 $foo.x 和
$foo.y 变量,它们哪去了?
当提交表单时,可以用图片代替标准的提交按钮,用类似这样的标记:
<input type="image" src="image.gif" name="foo"> |
当用户点击了图片的任何部分,该表单会被发送到服务器并加上两个额外的变量:
foo.x
和
foo.y。
因为 foo.x 和 foo.y 在 PHP
中会成为非法的变量名,它们被自动转换成了 foo_x 和
foo_y。也就是用下划线代替了点。因此,你可以按照在取得 PHP
之外的变量这一节中说明的那样访问这些变量。例如,$_GET['foo_x']。
3. 怎样在 HTML 的 <form> 中建立数组?
要使你的 <form> 结果被当成 array
发送到 PHP 脚本,你要对 <input>,<select> 或者 <textarea> 单元这样命名:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyArray[]"> |
注意变量名后的方括号,这使其成为一个数组。你可以通过给不同的单元分配相同的名字来把单元分组到不同的数组里:
<input name="MyArray[]">
<input name="MyArray[]">
<input name="MyOtherArray[]">
<input name="MyOtherArray[]"> |
这将产生两个数组,MyArray 和 MyOtherArray,并发送给 PHP 脚本。还可以给数组分配指定的键名:
<input name="AnotherArray[]">
<input name="AnotherArray[]">
<input name="AnotherArray[email]">
<input name="AnotherArray[phone]"> |
AnotherArray 数组将包含键名 0,1,email 和 phone。
注:
指定数组的键名是 HTML 的可选项。如果你不指定键名,则数组被按照单元在表单中出现的顺序填充。第一个例子将包含键名 0,1,2 和 3。
参见数组函数库和PHP 的外部变量。
4.
怎样从可多选的 HTML 的 select multiple 标记中得到所有结果?
可多选的 select multiple 标记是 HTML 的一个构造,允许用户从一个列表中选择多个项目。这些项目接着被传递给该表单 action 中指定的处理程序。问题是它们都会被用同样的名字传递。例如:
<select name="var" multiple="yes"> |
每个被选项将这样被传递到表单处理程序:
var=option1
var=option2
var=option3 |
每个选项将覆盖前面一个
$var 变量的内容。解决方案是用 PHP
的“表单单元数组”特性。使用方法如下:
<select name="var[]" multiple="yes"> |
这将告诉 PHP 将
$var 当成数组对待,每个对 var[]
的赋值都会给数组增加一项。第一项将成为
$var[0],下一个是
$var[1],等等。可以用
count()
函数来测定选择了多少个项目,必要时可以用
sort()
函数来对选项的数组进行排序。
注意如果你在 JavaScript 中通过名字来引用单元,单元名字中的 []
可能会造成问题。用表单单元中的数字序号来替代,或者将变量名用单引号括起来并用其作为单元数组的索引,例如:
variable = documents.forms[0].elements['var[]']; |
5.
怎样从 Javascript 传递一个变量到 PHP?
由于 Javascript (通常情况下)是客户端技术,而
PHP (通常情况下)是服务器端技术,而且
HTTP 是一种“无状态”协议,因此两种语言之间不能直接共享变量。
但是,有可能在二者之间传递变量。一种实现的方法是用
PHP 生成 Javascript 代码,并让浏览器自动刷新,将特定的变量传递回
PHP 脚本。以下例子显示了如何这样做 -- 让
PHP 代码取得显示屏幕的高度和宽度,通常只能在客户端这么做。
<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// output the geometry variables
echo "Screen width is: ". $_GET['width'] ."<br />\n";
echo "Screen height is: ". $_GET['height'] ."<br />\n";
} else {
// pass the geometry variables
// (preserve the original query string
// -- post variables will need to handled differently)
echo "<script language='javascript'>\n";
echo " location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit();
}
?> |