PHP 和 HTML 有很多相互作用:PHP 能生成 HTML,HTML 可以向 PHP 传递信息。在阅读这些常见问题之前,先学会怎样从 PHP 之外取得变量很重要。此主题的手册页也包括很多例子。还要仔细留意 register_globals 对你意味着什么。
在几个环节上编码方式很重要。假定你有 string $data,其中包含了你想通过非编码方式传递的字符串,那这是相关步骤:
HTML 解析。要指定一个任意的字符串,你必须将其放在双引号中,并用 htmlspecialchars() 处理整个值。
URL:URL 由几部分组成。如果你希望自己的数据被当作其中一项来解释,你必须用 urlencode() 对其编码。
注: 用 urlencode() 来处理 $data 是错误的,因为是浏览器的责任来 urlencode() 数据。所有流行的浏览器都能正确处理。注意不论何种方法(例如 GET 或 POST)都会这样。不过你只会在用 GET 请求时注意到这一点,因为 POST 请求通常是隐藏的。
注: 数据会按照预期的显示在浏览器中,因为浏览器会解释 HTML 转义符号。
当提交时,不论是 GET 或者 POST 方法,数据都会被浏览器进行 urlencode 来传输,并直接被 PHP urldecode。所以最终你不需要自己处理任何 urlencoding/urldecoding,全都是自动处理的。
注: 事实上你在捏造一个 HTML 的 GET 请求,因此需要手工对数据进行 urlencode()。
注: 你需要对整个 URL 进行 htmlspecialchars(),因为 URL 是作为 HTML 属性的一个值出现的。在本例中,浏览器会首先对值进行 un-htmlspecialchars(),然后再传递此 URL。PHP 将能正确理解 URL,因为你对数据进行了 urlencoded()。
你会注意到 URL 中的 & 被替换成了 &。如果你忘了这一步,尽管大多数浏览器都能恢复,但也不总是这样。因此即使 URL 不是动态的,你也需要对 URL 进行 htmlspecialchars()。
当提交表单时,可以用图片代替标准的提交按钮,用类似这样的标记:
<input type="image" src="image.gif" name="foo"> |
因为 foo.x 和 foo.y 在 PHP 中会成为非法的变量名,它们被自动转换成了 foo_x 和 foo_y。也就是用下划线代替了点。因此,你可以按照在取得 PHP 之外的变量这一节中说明的那样访问这些变量。例如,$_GET['foo_x']。
要使你的 <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[]"> |
<input name="AnotherArray[]"> <input name="AnotherArray[]"> <input name="AnotherArray[email]"> <input name="AnotherArray[phone]"> |
注: 指定数组的键名是 HTML 的可选项。如果你不指定键名,则数组被按照单元在表单中出现的顺序填充。第一个例子将包含键名 0,1,2 和 3。
可多选的 select multiple 标记是 HTML 的一个构造,允许用户从一个列表中选择多个项目。这些项目接着被传递给该表单 action 中指定的处理程序。问题是它们都会被用同样的名字传递。例如:
<select name="var" multiple="yes"> |
var=option1 var=option2 var=option3 |
<select name="var[]" multiple="yes"> |
注意如果你在 JavaScript 中通过名字来引用单元,单元名字中的 [] 可能会造成问题。用表单单元中的数字序号来替代,或者将变量名用单引号括起来并用其作为单元数组的索引,例如:
variable = documents.forms[0].elements['var[]']; |
由于 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(); } ?> |