PHP Conference Japan 2024

filter_input

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

filter_input透過名稱取得指定的外部變數,並可選擇性地進行過濾

說明

filter_input(
    整數 $type,
    字串 $var_name,
    整數 $filter = FILTER_DEFAULT,
    陣列|整數 $options = 0
): 混合

參數

類型
其中一個 INPUT_* 常數。
警告

被過濾的超全域變數的內容是由 SAPI 提供的原始「未經處理」內容,在使用者對超全域變數進行任何修改之前。要過濾已修改的超全域變數,請改用 filter_var()

var_name
要過濾的變數名稱,位於對應的 type 超全域變數內。
filter
要套用的過濾器。可以使用 FILTER_VALIDATE_* 常數的驗證過濾器,使用 FILTER_SANITIZE_*FILTER_UNSAFE_RAW 的淨化過濾器,或使用 FILTER_CALLBACK 的自訂過濾器。

注意 預設值為 FILTER_DEFAULT,它是 FILTER_UNSAFE_RAW 的別名。這將導致預設情況下不進行任何過濾。

options
選項的關聯式 陣列,或過濾器旗標常數 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 年前
當這個函式搭配 INPUT_SERVER 和 INPUT_ENV 使用時,FastCGI 似乎會導致出現帶有非預期空值的奇怪副作用。您可以使用以下程式碼來查看它是否會影響您的伺服器:
<?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'] 上執行 htmlentities(),或者更好的是,使用一個抽象函式。
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 不受影響。
To Top