這裏是我的代碼:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
它總是好像裏面進入。
這裏是我的代碼:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
它總是好像裏面進入。
is_int
檢查該數據類型是$_GET
的整數,但一切將是一個字符串。因此,它總是會返回false
。
在緊要關頭,你可以轉換爲整數,然後檢查!= 0
$id = isset($_GET['id']) ? (int) $_GET['id'] : null;
if (!$id) { // === 0 || === null
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
但是,一個更加強大的解決方案將涉及某些類型的輸入字符串的驗證/過濾,如PHP的內置filter_input_array()
。
(編輯年10月交/ 13,因爲它仍接收upvotes並且它有點混亂的措辭。)在$ _GET陣列
當天沒有上傳,但這個答案實際上說明了爲什麼要使用is_numeric。POST或GET發送的任何HTTP請求參數將始終是一個字符串。 – 2010-06-28 18:33:09
+1 - 儘管要提及,但「is_numeric」並不具有與例如相同的效果。除了其他值之外,還可以讓十六進制值通過(請參閱php.net) – Helmut 2012-08-05 17:50:18
@Helmut,是的,'is_numeric()'不適用於檢查整型ID。實際上,所有的用戶輸入都應該通過'filter_var()'或其他類似的明確的例程。 – Matthew 2012-08-05 18:04:42
用戶輸入(以及其它超全局)所有取字符串的形式。
is_int
檢查類型(即string
)的值,而不是它是否包含類似於整數的值。爲了驗證輸入是一個整數字符串,我會建議或者像ctype_digit
或整數filter(FILTER_VALIDATE_INT
-這實際上將值更改爲類型整數的好處)。當然,你也可以用(int)
來形容它。
從is_int PHP文檔:
注意:爲了測試的變量是 數字或數字串(如 形式的輸入,這始終是一個字符串), 必須使用is_numeric()。
任何用戶輸入都以字符串形式出現,因爲PHP無法告訴您所期望的數據是什麼數據類型。
將其轉換爲整數或使用正則表達式,如果你想確保它是一個整數。
<?php
$id = $_GET["id"];
if ((int) $id == 0) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
嘗試使用的is_numeric
代替is_int
。 is_numeric
檢查是否給出可以是數字的東西($_GET
返回字符串,我認爲)。 is_int
檢查是否變量是類型int
使用is_numeric()評價內容和is_int()來計算的類型。
或者,您可以使用正則表達式匹配來檢查字符串是否是整數。
if(preg_match('/^\d+$/',$_GET['id'])) {
// is an integer
}
而'$ _GET'實際上包含...什麼? – 2010-06-28 18:27:44
數字從1到無窮大。 – ilhan 2010-06-28 18:47:15