来自外部来源的变量

HTML 表单 (GET 和 POST)

当表单提交到 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['id'] 访问的 GET 数据。另见 $_REQUEST.

注意:

变量名称中的点和空格将转换为下划线。例如 <input name="a.b" /> 将变为 $_REQUEST["a_b"]

PHP 还了解表单变量上下文中的数组(参见 相关 FAQ)。例如,您可以将相关变量分组在一起,或使用此功能从多选输入中检索值。例如,让我们将表单发布到自身,并在提交后显示数据

示例 #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">疣猪</option>
<option value="guinness">健力士</option>
<option value="stuttgarter">斯图加特施瓦本啤酒</option>
</select><br />
<input type="submit" value="提交我!" />
</form>

注意 如果外部变量名称以有效的数组语法开头,尾随字符将被静默忽略。例如,<input name="foo[bar]baz"> 将变为 $_REQUEST['foo']['bar']

图像提交变量名称

提交表单时,可以使用图像而不是标准提交按钮,使用类似的标签

<input type="image" src="image.gif" name="sub" />

当用户点击图像上的某个地方时,相应的表单将被发送到服务器,并附带两个额外的变量,sub_xsub_y。它们包含用户点击在图像中的坐标。有经验的人可能会注意到浏览器实际发送的变量名称包含句点而不是下划线,但 PHP 会自动将句点转换为下划线。

HTTP Cookie

PHP 透明地支持 HTTP Cookie,如 » RFC 6265 所定义。Cookie 是一种在远程浏览器中存储数据并因此跟踪或识别返回用户的机制。您可以使用 setcookie() 函数设置 Cookie。Cookie 是 HTTP 标头的一部分,因此 SetCookie 函数必须在任何输出发送到浏览器之前调用。这与 header() 函数的限制相同。Cookie 数据然后在相应的 Cookie 数据数组中可用,例如 $_COOKIE 以及 $_REQUEST。有关更多详细信息和示例,请参见 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; /* 无效的变量名 */
?>
现在,解析器看到的是一个名为 $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 解码。

添加注释

用户贡献的注释 2 条注释

22
匿名
16 年前
PHP 将以下字符(不仅是点)转换为 _(下划线)的完整字段名称列表:
chr(32) ( ) (空格)
chr(46) (.) (点)
chr(91) ([) (左方括号)
chr(128) - chr(159) (各种)

PHP 不可逆地修改包含这些字符的字段名称,以尝试保持与已弃用的 register_globals 功能的兼容性。
4
krydprz at iit dot edu
19 年前
这篇文章讨论了如何处理具有多个提交按钮的表单。

假设我们有一个 HTML 表单,其中包含一个像这样指定的提交按钮:

<input type="submit" value="Delete" name="action_button">

通常,创建提交按钮的 HTML 'input' 标签的 'value' 属性(在本例中为 "Delete")可以在 PHP 中通过 post 访问,如下所示:

<?php
$_POST
['action_button'];
?>

当然,我们使用按钮的 'name' 作为 $_POST 数组的索引。

这很好用,除非我们想在点击这个特定按钮时传递更多信息。

想象一下,你在某个管理界面处理用户管理。你会看到从数据库查询到的一系列用户名,并且希望在列表中的每个用户名旁边添加一个 "Delete" 和 "Modify" 按钮。 自然,我们想在 HTML 表单中显示的按钮的 'value' 将是 "Delete" 和 "Modify",因为这是我们想要在按钮面板上显示的内容。

这两个按钮(Modify 和 Delete)都将被命名为 "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'("Delete" 或 "Modify")和我们想要影响的用户(在本例中为 0000000002)的唯一数字标识符。 以下代码将打印 "Modify" 或 "Delete",以及用户的唯一数字:

<?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' 的字符串。

如果我们想保护唯一的数字标识符,我们必须使用用户的其他唯一识别属性。 可能该属性应该在输出到表单时进行加密,以提高安全性。

享受!
To Top