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_GETINPUT_POSTINPUT_COOKIEINPUT_SERVERINPUT_ENV 之一。

var_name

要获取的变量的名称。

filter

要应用的过滤器的 ID。 过滤器类型 手册页列出了可用的过滤器。

如果省略,将使用 FILTER_DEFAULT,它等效于 FILTER_UNSAFE_RAW。 默认情况下,这将不会进行任何过滤。

options

选项的关联数组或标志的按位或运算。 如果过滤器接受选项,则可以在数组的“flags”字段中提供标志。

返回值

成功时请求变量的值,如果过滤器失败则为 false,如果 var_name 变量未设置则为 null。 如果使用标志 FILTER_NULL_ON_FAILURE,如果变量未设置则返回 false,如果过滤器失败则返回 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>

参见

添加笔记

用户贡献的笔记 15 笔记

98
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 非常有用。
此事实应记录在案。
47
anthony dot parsons at manx dot net
16 年前
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,这才是最重要的!
44
rimelek at rimelek dot hu
9 年前
如果您的 $_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。
30
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而不是你需要的输入变量。
21
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。
11
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);
?>
3
akshay dot leadindia at gmail dot com
10 年前
使用它而不是直接使用 filter_var( $_GET['search'] ) 的好处是,你不需要检查 if( isset( $_GET['search'] ) ),因为如果你将它传递给 filter_var 并且键没有设置,那么它将导致警告。这个函数简化了这一点,并且如果键没有在用户输入中设置,它将返回相关的结果(根据你设置的选项)。

如果你正在使用的过滤器类型也支持 'default' 参数,那么这个函数也会用该值填充你丢失的输入键,再次节省你的精力。
5
travismowens at gmail dot com
14 年前
我不建议人们使用这个函数将他们的数据存储在数据库中。最好不要在存储数据时对数据进行编码,最好存储原始数据,并在需要时进行转换。

这样做的主要原因之一是,如果你有一个短的 CHAR(16) 字段并且文本包含编码字符(引号、和号),你很容易获得一个明显适合的 12 个字符的条目,但由于编码,它不再适合。

另外,虽然不太常见,但如果你需要在其他地方使用此数据,比如非网页(可能是在桌面应用程序中,或者发送到手机短信或传呼机),则 HTML 编码数据将以原始形式显示,现在你需要解码数据。

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

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

php-fpm sapi 不受影响。
-8
descartavel1+php at gmail dot com
10 年前
与这里关于如何使用过滤器选项的注释中所述相反,没有范围选项或默认选项......实际上,几乎没有选项。手册中没有任何地方提到这一点,并且在该注释中提供的代码对 php-5.4.4 没有任何作用。

<?php
get
(GET, 'p', FILTER_VALIDATE_INT, array('options'=>array('default'=>5, 'min_range'=>0, 'max_range'=>9)) );
// ?p=30 => 30
// ?p="123" => 123
// ?p=-23 => -23
// ?p=asdf => null
?>
-10
west {:a7} jsausa {:d0t}~ com
11 年前
值得注意的是,过滤器输入中变量的名称遵循与 PHP 中变量命名的相同规则(必须以下划线或字母开头)。我们允许用户构建自定义表单,但对名称进行哈希以防止他们在 dom 中放置任意内容。事实证明,哈希函数偶尔会为字段名称生成完全为数字的值......这在 filter_input 中不起作用,但如果你直接从 $_GET、$_POST 或 $_REQUEST 中读取则可以正常工作。一个解决方法是在字段名称前面始终加上一个下划线。
-7
Maksym Karazeev
15 年前
只是一些提示。

请注意如何为 filter_var_array 设置默认过滤器。

当我尝试使用 filter_var_array 并且没有在定义中提及所有数组索引时,它会用一些过滤器对其进行过滤并破坏值,因此使用这个提示纠正了所有内容。

<?php
$def
= array_map(create_function('', 'return array("filter"=>FILTER_UNSAFE_RAW);'), $input);
?>
-15
DoubleT
5 年前
在直接修改超级全局变量时发现了有趣的行为。
$_GET['p'] = 1;
filter_input(INPUT_GET,'p'); // 值为 NULL

这是预期的吗?
-22
viaujoc at videotron dot ca
9 年前
filter_input() 似乎不支持单个变量名称的多个值。

以下是比较裸 $_GET 超级全局变量与 filter_input(INPUT_GET,...) 行为的代码。
<?php
print("裸 \$_GET:\n");
var_dump($_GET);
print(
"filter_input():\n");
var_dump(filter_input(INPUT_GET,"var"));
?>

调用时:/..../script.php?var=123(变量 'var' 只有一个值)
输出是
裸 $_GET
array(1) {
["var"]=>
string(3) "123"
}
filter_input()
string(3) "123"

调用时:/..../script.php?var[]=123&var[]=999(变量 'var' 有两个值)
输出是
裸 $_GET
array(1) {
["var"]=>
array(2) {
[0]=>
string(3) "123"
[1]=>
string(3) "999"
}
}
filter_input()
bool(false)

正如预期的那样,$_GET['var'] 成为一个数组。但是 filter_input() 似乎无法处理多个值,并返回 false。
-32
John Smith
9 年前
1. options 参数的描述具有误导性。为了传递 options(例如 default、min_range 和 max_range),你必须传递一个关联数组,它有一个名为 "options" 的键,它本身是一个关联数组,包含选项名称 => 选项值对。

2. 返回值部分没有提到,如果你指定 "default" 选项,则该函数将返回指定的默认值,而不是返回 FALSE 或 NULL(当过滤器失败或变量不存在时)。
To Top