PHP 简明教程

PHP $_REQUEST

1. PHP $_REQUEST

$_REQUEST 超全局变量用于收集来自 HTML 表单提交的数据、URL 查询字符串以及 HTTP Cookies 的数据。

换句话说,$_REQUEST 是一个包含了来自 $_GET$_POST$_COOKIE 超全局变量中所有数据的综合数组。

PHP 的超全局变量是内置变量,它们始终可以在所有的作用域中被直接访问

您可以通过 $_REQUEST 关键字,紧接着使用表单字段的名称、查询参数名称或 Cookie 的名称来访问对应的数据。

注意: 由于 $_REQUEST 会合并来自不同来源(GET、POST 和 COOKIE)的数据,如果不小心处理,可能会引入安全漏洞。因此,虽然使用 $_REQUEST 很方便,但在大多数情况下,更推荐使用更具体、更明确的超全局变量 $_GET、$_POST 和 $_COOKIE

2. 在 POST 请求中使用 $_REQUEST

在这里,我们将使用 $_REQUEST 超全局变量来访问通过 HTTP POST 请求提交的数据。POST 请求通常是用户通过 HTML 表单提交的数据。

HTML 表单必须将 method 属性设置为 "post",并包含带有 name 属性的输入字段。这个 name 属性将作为 PHP 脚本中获取数据的“键名(key)”。

下面是一个 HTML 表单的示例:

HTML 文件:

<html>
<body>

<form method="post" action="demo_request.php">
  Name: <input type="text" name="fname">
  <input type="submit">
</form>

</body>
</html>

当用户点击提交按钮时,表单数据会被发送到 <form> 标签的 action 属性中指定的 PHP 文件。

在 PHP 文件中,我们可以使用 $_REQUEST 变量来收集输入字段的值。

PHP 文件 (demo_request.php):

$name = htmlspecialchars($_REQUEST['fname']);
echo $name;

安全提示: 在使用来自超全局变量(如 $_REQUEST)收集的任何数据之前,务必对其进行验证和转义(清理),以防止像 XSS 这样的跨站脚本攻击漏洞。上面使用的 htmlspecialchars() 函数就是一种基本的转义方法。您可以使用 PHP 内置的过滤器(filter functions)来实现更稳健的过滤。

在下面的示例中,为了方便演示,我们将 HTML 表单和 PHP 代码放在了同一个 PHP 文件中:

示例

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  Name: <input type="text" name="fname">
  <input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  // 收集输入字段的值并进行 XSS 防御处理
  $name = htmlspecialchars($_REQUEST['fname']);
  if (empty($name)) {
    echo "Name is empty";
  } else {
    echo $name;
  }
}
?>

</body>
</html>

3. 在 GET 请求中使用 $_REQUEST

除了上文演示的方法(<form> 元素的 method 属性设为 "get")以外,GET 请求最常见的来源是URL 查询字符串(即在 URL 地址末尾附加的信息)。

下面是一个带有 URL 查询字符串的 HTML 链接示例:

HTML 链接带有 URL 查询参数:

<html>
<body>

<a href="demo_phpfile.php?subject=PHP&web=begindev.com">Test $GET</a>

</body>
</html>

当用户点击上面的链接时,查询字符串中的数据(subjectweb)会被发送到 demo_phpfile.php 脚本。

在目标 PHP 文件中,我们不仅可以使用 $_GET,同样可以使用 $_REQUEST 变量来收集查询字符串的值。

示例

demo_phpfile.php 文件的 PHP 逻辑:

<html>
<body>

<?php
// 使用 $_REQUEST 获取 URL 参数的值
$subject = htmlspecialchars($_REQUEST['subject']);
$web = htmlspecialchars($_REQUEST['web']);
echo "Study $subject at $web.";
?>

</body>
</html>