PHP Conference Japan 2024

filter_input

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_input获取指定外部变量并可选地对其进行过滤

描述

filter_input(
    int $type,
    string $var_name,
    int $filter = FILTER_DEFAULT,
    array|int $options = 0
): mixed

参数

type
INPUT_* 常量之一。
警告

正在过滤的超全局变量的内容是 SAPI 提供的原始“原始”内容,在对超全局变量进行任何用户修改之前。要过滤修改后的超全局变量,请改用 filter_var()

var_name
要在相应的 type 超全局变量内过滤的变量的名称。
filter
要应用的过滤器。可以使用 FILTER_VALIDATE_* 常量之一作为验证过滤器,使用 FILTER_SANITIZE_*FILTER_UNSAFE_RAW 常量之一作为清理过滤器,或使用 FILTER_CALLBACK 常量作为自定义过滤器。

注意: 默认值为 FILTER_DEFAULT,它是 FILTER_UNSAFE_RAW 的别名。这将导致默认情况下不进行任何过滤。

options
选项的关联 array 或过滤器标志常量 FILTER_FLAG_* 的位掩码。 如果 filter 接受选项,则可以通过使用数组的 "flags" 字段来提供标志。

返回值

成功时返回已过滤的变量。如果未设置变量,则返回 false。失败时返回 false,除非使用了 FILTER_NULL_ON_FAILURE 标志,在这种情况下返回 null

示例

示例 #1 filter_input() 示例

<?php
$search_html
= filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo
"您搜索的是 $search_html。\n";
echo
"<a href='?search=$search_url'>再次搜索</a>";
?>

上面的示例将输出类似以下内容

You have searched for Me &#38; son.
<a href='?search=Me%20%26%20son'>Search again.</a>

参见

添加注释

用户贡献的注释 9 条注释

CertaiN
10 年前
此函数为我们提供了类型过滤的极其简单的解决方案。

如果没有此函数...
<?php
if (!isset($_GET['a'])) {
$a = null;
} elseif (!
is_string($_GET['a'])) {
$a = false;
} else {
$a = $_GET['a'];
}
$b = isset($_GET['b']) && is_string($_GET['b']) ? $_GET['b'] : '';
?>

使用此函数...
<?php
$a
= filter_input(INPUT_GET, 'a');
$b = (string)filter_input(INPUT_GET, 'b');
?>

是的,FILTER_REQUIRE_SCALAR 似乎被设置为默认选项。
它对于消除 E_NOTICE、E_WARNING 和 E_ERROR 非常有用。
此事实应在文档中说明。
anthony dot parsons at manx dot net
17 年前
FastCGI 似乎会导致使用 INPUT_SERVER 和 INPUT_ENV 时出现意外的空值等奇怪的副作用。您可以使用此代码查看它是否会影响您的服务器
<?php
var_dump
($_SERVER);
foreach (
array_keys($_SERVER) as $b ) {
var_dump($b, filter_input(INPUT_SERVER, $b));
}
echo
'<hr>';
var_dump($_ENV);
foreach (
array_keys($_ENV) as $b ) {
var_dump($b, filter_input(INPUT_ENV, $b));
}
?>
如果您想确保安全,使用超全局变量 $_SERVER 和 $_ENV 始终有效。您仍然可以使用 filter_* 函数处理 Get/Post/Cookie 而不出现问题,这是重要的部分!
rimelek at rimelek dot hu
10 年前
如果您的 $_POST 包含数组值
<?php
$_POST
= array(
'var' => array('more', 'than', 'one', 'values')
);
?>
您应该使用 FILTER_REQUIRE_ARRAY 选项
<?php
var_dump
(filter_input(INPUT_POST, 'var', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY));
?>
否则它将返回 false。
ss23 at ss23 dot geek dot nz
14 年前
请注意,此函数实际上并没有(或者至少看起来没有)根据 $_GET 等的当前值进行过滤。相反,它似乎根据原始值进行过滤。
<?php
$_GET
['search'] = 'foo'; // 这对 filter_input 没有影响

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo
"您搜索的是 $search_html。\n";
echo
"<a href='?search=$search_url'>再次搜索。</a>";
?>

如果您需要设置默认输入值并对其进行过滤,请改用所需输入变量上的 filter_var
Stefan Weinzierl
10 年前
这是一个关于如何使用 options 参数的示例。请注意“options”参数中的“options”!

<?php
$options
=array('options'=>array('default'=>5, 'min_range'=>0, 'max_range'=>9));

$priority=filter_input(INPUT_GET, 'priority', FILTER_VALIDATE_INT, $options);
?>

$priority 如果 priority 参数未设置或超出给定范围,则为 5。
chris at chlab dot ch
12 年前
要将类方法用于回调函数,像往常一样,提供一个包含类实例和方法名称的数组。
示例

<?php
class myValidator
{
public function
username($value)
{
// 返回用户名或布尔值 false
}
}

$myValidator = new myValidator;
$options = array('options' => array($myValidator, 'username'));
$username = filter_input(INPUT_GET, 'username', FILTER_CALLBACK, $options);
var_dump($username);
?>
akshay dot leadindia at gmail dot com
11 年前
使用它而不是直接使用 filter_var( $_GET['search'] ) 的好处是,您不需要检查 if( isset( $_GET['search'] ) ),因为如果您将其传递给 filter_var 并且密钥未设置,则会导致警告。此函数简化了此操作,如果用户输入中未设置密钥,则会为您返回相关结果(根据您设置的选项)。

如果您正在使用的过滤器类型也支持“default”参数,则此函数还会将缺少的输入密钥填充该值,从而再次节省您的工作量。
travismowens at gmail dot com
14 年前
我不建议人们使用此函数将数据存储到数据库中。最好在存储数据时不要对其进行编码,最好以原始格式存储并在需要时进行转换。

这样做的一个主要原因是,如果您有一个短 CHAR(16) 字段并且文本包含编码字符(引号、&),则您可以轻松地获取一个显然适合的 12 字符条目,但由于编码,它不再适合。

此外,虽然不常见,但如果您需要在其他地方使用此数据(例如非网页(可能在桌面应用程序中,或发送到手机短信或寻呼机)),则 HTML 编码的数据将以原始格式显示,现在您必须解码数据。

总之,构建系统最佳方法是将数据存储为原始数据,并且仅在需要时对其进行编码。因此,这意味着在您的 PHP 中执行 SQL 查询时,您不仅需要执行 echo $row['title'],还需要在您的 echo 上运行 htmlentities(),或者更好的是,使用抽象函数。
HonzaZ
2 年前
在 fastcgi sapi 实现中,filter_input(INPUT_SERVER) 可能会返回空结果。

在我的情况下(8.1.9 64 位 php-cgi),这是由启用的 auto_globals_jit 引起的。当禁用(在 php.ini 中的 php 启动时),filter_input(INPUT_SERVER) 可以正常工作。

php-fpm sapi 不受影响。
To Top