PHP 将转换为下划线 (_) 的字段名称字符完整列表如下(不仅仅是点):
chr(32) ( ) (空格)
chr(46) (.) (点)
chr(91) ([) (左方括号)
chr(128) - chr(159) (各种字符)
PHP 会不可逆地修改包含这些字符的字段名称,以尝试保持与已弃用的 register_globals 功能的兼容性。
当表单提交到 PHP 脚本时,表单中的信息会自动提供给脚本。有几种方法可以访问此信息,例如
示例 #1 一个简单的 HTML 表单
<form action="foo.php" method="post"> Name: <input type="text" name="username" /><br /> Email: <input type="text" name="email" /><br /> <input type="submit" name="submit" value="Submit me!" /> </form>
只有两种方法可以访问 HTML 表单中的数据。当前可用的方法列在下面
示例 #2 访问简单的 POST HTML 表单中的数据
<?php
echo $_POST['username'];
echo $_REQUEST['username'];
?>
使用 GET 表单类似,只是可以使用相应的 GET 预定义变量。GET 也适用于 QUERY_STRING
(URL 中 '?' 之后的信息)。例如,http://www.example.com/test.php?id=3
包含 GET 数据,可以使用 $_GET['id'] 访问。另请参见 $_REQUEST。
注意:
变量名中的点和空格将转换为下划线。例如
<input name="a.b" />
将变为$_REQUEST["a_b"]
。
PHP 还理解表单变量上下文中的数组(参见相关常见问题解答)。例如,相关变量可以组合在一起,或者此特性可用于从多选输入中检索值。例如,让我们将表单发布给自己,并在提交后显示数据
示例 #3 更复杂的表单变量
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
姓名:<input type="text" name="personal[name]" /><br />
邮箱:<input type="text" name="personal[email]" /><br />
啤酒:<br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="submit me!" />
</form>
注意:如果外部变量名以有效的数组语法开头,则尾随字符将被静默忽略。例如,
<input name="foo[bar]baz">
将变为$_REQUEST['foo']['bar']
。
提交表单时,可以使用图像代替标准提交按钮,使用类似这样的标签:
<input type="image" src="image.gif" name="sub" />
当用户点击图像上的某个位置时,相应的表单将连同两个附加变量 sub_x 和 sub_y 一起传输到服务器。这些变量包含用户在图像中点击的坐标。经验丰富的用户可能会注意到浏览器发送的实际变量名包含句点而不是下划线,但 PHP 会自动将句点转换为下划线。
PHP 透明地支持由» RFC 6265 定义的 HTTP Cookie。Cookie 是一种在远程浏览器中存储数据并因此跟踪或识别回访用户的机制。可以使用 setcookie() 函数设置 Cookie。Cookie 是 HTTP 头的一部分,因此必须在任何输出发送到浏览器之前调用 SetCookie 函数。这与 header() 函数的限制相同。然后可以在相应的 Cookie 数据数组(例如 $_COOKIE 以及 $_REQUEST)中使用 Cookie 数据。有关更多详细信息和示例,请参见 setcookie() 手册页。
注意:从 PHP 7.2.34、7.3.23 和 7.4.11 开始,出于安全原因,不再对传入 Cookie 的名称进行 URL 解码。
如果应将多个值分配给单个 Cookie 变量,则可以将其作为数组分配。例如
<?php
setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>
这将创建两个单独的 Cookie,尽管 MyCookie 现在将是脚本中的单个数组。如果只想设置一个包含多个值的 Cookie,请考虑首先对值使用 serialize() 或 explode()。
请注意,除非路径或域不同,否则 Cookie 将替换浏览器中具有相同名称的先前 Cookie。因此,对于购物车应用程序,可以保留一个计数器并将其传递。即
示例 #4 一个 setcookie() 示例
<?php
if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>
通常,PHP 在变量传递到脚本中时不会更改变量的名称。但是,需要注意的是,点(句点)在 PHP 变量名中不是有效的字符。原因如下所示:
<?php
$varname.ext; /* 无效的变量名 */
?>
因此,重要的是要注意 PHP 将自动将传入变量名中的任何点替换为下划线。
由于PHP会自动确定变量类型并(通常)按需进行转换,因此并不总是能立即清楚地知道任何给定时刻某个变量的类型。PHP包含多个用于查找变量类型的函数,例如:gettype(),is_array(),is_float(),is_int(),is_object()和is_string()。另请参见关于类型的章节。
HTTP是一个文本协议,因此大多数(如果不是全部)来自超全局数组(如$_POST和$_GET)的内容将保持为字符串。PHP不会尝试将值转换为特定类型。在下面的示例中,$_GET["var1"]将包含字符串“null”,而$_GET["var2"]将包含字符串“123”。
/index.php?var1=null&var2=123
版本 | 描述 |
---|---|
7.2.34, 7.3.23, 7.4.11 | 出于安全原因,传入cookie的名称不再进行URL解码。 |
PHP 将转换为下划线 (_) 的字段名称字符完整列表如下(不仅仅是点):
chr(32) ( ) (空格)
chr(46) (.) (点)
chr(91) ([) (左方括号)
chr(128) - chr(159) (各种字符)
PHP 会不可逆地修改包含这些字符的字段名称,以尝试保持与已弃用的 register_globals 功能的兼容性。
此帖子与处理具有多个提交按钮的表单有关。
假设我们有一个 HTML 表单,其中提交按钮指定如下
<input type="submit" value="Delete" name="action_button">
通常,创建提交按钮的 HTML 'input' 标签的 'value' 属性(在本例中为“Delete”)可以在提交后像这样在 PHP 中访问
<?php
$_POST['action_button'];
?>
我们当然使用按钮的“name”作为 $_POST 数组的索引。
这很好用,除非我们想通过点击此特定按钮来传递更多信息。
想象一下,您在某个管理界面中处理用户管理的情况。您会看到从数据库查询的用户名称列表,并希望在列表中每个名称旁边添加“删除”和“修改”按钮。当然,我们想要显示在按钮面板上的按钮的 HTML 表单中的 'value' 将是“删除”和“修改”。
这两个按钮(修改和删除)都将命名为“action_button”,因为这就是我们想要用它来索引 $_POST 数组的方式。换句话说,如果我们想在提交后系统地处理这些按钮,那么按钮的“name”本身无法携带任何唯一标识信息。由于这些按钮将存在于列表中的每个用户中,因此我们需要其他方法来区分它们,以便知道哪个用户的按钮被按下。
使用数组是可行的办法。假设我们知道每个用户的唯一数字标识符,例如他们来自数据库的主键,并且我们不希望保护该数字不被公开,我们可以将 'action_button' 制成一个数组,并使用用户的唯一数字标识符作为此数组的键。
显示按钮的 HTML 代码将变为
<input type="submit" value="Delete" name="action_button[0000000002]">
<input type="submit" value="Modify" name="action_button[0000000002]">
0000000002 当然是指此特定用户的唯一数字标识符。
然后,当我们在 PHP 中处理此表单时,我们需要执行以下操作来提取按钮的 'value'(“删除”或“修改”)和我们希望影响的用户(在本例中为 0000000002)的唯一数字标识符。以下将打印“修改”或“删除”,以及用户的唯一编号
<?php
$submitted_array = array_keys($_POST['action_button']);
echo ($_POST['action_button'][$submitted_array[0]] . " " . $submitted_array[0]);
?>
$submitted_array[0] 包含 0000000002。
当我们将其作为索引放入 $_POST['action_button'] 中时,就像我们上面所做的那样,我们将提取在创建此按钮的 HTML 代码 'input' 标签中用作 'value' 的字符串。
如果我们希望保护唯一的数字标识符,我们必须使用用户的其他唯一标识属性。为了更高的安全性,该属性可能应该在输出到表单时进行加密。
享受!