我使用的是GET變量,並通過人以下網址找到它:PHP 1是一個字符串不是整數
page?siteID=1
,我檢查,以確保的siteID是一個整數,但PHP是說它是一個字符串。
如何將它轉換爲整數?我注意到intval()
會將0x1A轉換爲26,我不希望發生這種情況。
我使用的是GET變量,並通過人以下網址找到它:PHP 1是一個字符串不是整數
page?siteID=1
,我檢查,以確保的siteID是一個整數,但PHP是說它是一個字符串。
如何將它轉換爲整數?我注意到intval()
會將0x1A轉換爲26,我不希望發生這種情況。
如果您不想轉換變量,但只需檢查它是否代表數字,則還可以使用is_numeric
函數。要麼是這樣,要麼您可以使用其他答案中所述的轉換方法,以適合您最需要的方式爲準。
編輯:基於詹姆斯Socol的評論,它也可能是值得看ctype_digit
功能。對於您的特定應用程序(看起來您想檢查某個頁面的ID號),這可能比is_numeric
函數更適合。
你可以做什麼; ctype_digit($ _ GET [ '的siteID'])
所有參數值都是字符串。您必須明確地將字符串轉換爲整數。你可以投在其他的答案建議或使用setType(var, type)其中類型是「整數」
<?php
$id = $_GET['siteID'];
settype($id, "integer");
?>
PHP將所有GET/POST/COOKIE變量爲字符串,直到你做他們的東西。
這裏是一個很好的參考PHP.net爲你在看: http://ca.php.net/language.types.type-juggling
正如一個側面說明,讓你知道爲什麼這正在發生的事情,這裏發生了什麼事情。
當Web瀏覽器發送GET
請求時,它是全部文本。 URL'http://example.com/page?siteID=1'實際上是作爲單個字符串發送的;在HTTP請求中這將是此行:(該「http://example.com
」部分用於通過web瀏覽器找出交談哪個服務器,以及什麼樣的網絡協議使用)
GET /page?siteID=1 HTTP/1.0
PHP掌握了這一點,併爲你解析它做了一大堆工作。它會根據這些空格將它分成三部分(方法「GET
」,URI「/page?siteID=1
」和協議「HTTP/1.1
」),並進一步將URI解析爲路徑(「/page
」)和查詢參數(「siteID = 1」) ,它進一步解析成名稱/值對。而且,即使上面引用的整個GET
行只是作爲請求發送到HTTP服務器的全文流的一部分。
因此,您將看到將大量字符轉換爲許多不同部分的大量工作的結果。
如果您真的好奇,可以使用Wireshark或Firefox Live HTTP Headers plugin等工具查看文本字符串實際上在網絡上傳遞的詳細信息。如果你是一個Web開發人員,這是值得學習的。
要麼強制轉換爲int
$id = (int)$_GET['siteID'];
知道上string-to-integer conversions的規則。或使用
if (ctype_digit($_GET['siteID'])) { //...
如果你想確保它只包含數字(字符0-9)。如果你想要它是一個數字字符串,包括「-1.35e + 105」,你可以使用is_numeric()
。
Php是弱類型的。對他來說,整數和字符串可以以相同的方式進行威脅,它將根據上下文猜測如何進行猜測。
無論如何,當你使用GET傳遞一個變量時,它始終是一個字符串,因爲HTTP protocole是關於文本的。
所以兩兩件事:
你,大部分的時間,也不需要檢查它是否是一個整數。使用鴨子打字:如果它是一個看起來像一個足夠整數的字符串,直接使用它。
如果您確實想檢查,請使用is_numeric()。
如果你需要一個條件語句,使用==來檢查一個字符串對整數將工作。如果您想檢查類型強制執行,請使用===。
管理變量的fudgy方式是什麼使得PHP,以及PHP的一部分。喜歡它,或者討厭它,但不要嘗試PHP中的代碼,比如在JAVA或C#中。
更多的想法:
$isInt = ($_GET['id'] == (int)$_GET['id']); // not strict comparing!
$isInt2 = preg_match('/\-?[0-9]+/', $_GET['id']);
最後一個安全的方式來獲得$ ID:
$id = (isset($_GET['id']) && ($_GET['id'] == (int)$_GET['id']))
? (int)$_GET['id']
: 0;
我建議你使用mod_rewrite(如果可用)和正則表達式來混淆和保護您的GET變量,而不是將它們轉換爲代碼。
URI路徑page?siteID=1
是一個字符串; $_GET['siteID']
的值原本是一個字符串。
假設:siteID
值用於由siteID
字段以分貝表來查找這樣一個有效siteID
值必須看起來大於零的整數。
is_numeric()
在這種情況下是不夠的,因爲is_numeric('7e2')
返回true。
您希望驗證siteID
的字符串值爲整數,而不從$ _GET中轉換任何值,將$ _GET保留爲原始值,因爲以後可能需要它們。
function is_valid_id($id) {
return strval($id) === strval(intval($id)) && $id > 0;
}
if (is_valid_id($_GET['siteID']))
$siteID = intval($_GET['siteID']);
# Value is ready to be processed as integer
else
# Refresh page with invalid id error message
它呈現無效 '0', '0.0', '-0', '07', '-09', '0Y', '7E2', '-w',「-b.9 '','G98','-h7','98R','98.7','98,8','0x1A','\ x1A','5 + 5','5 * 5'等
舊的PHP技巧$ id = 0 + $ _GET ['siteID'];有些討厭它,有些人喜歡它。 – gradbot 2009-05-22 17:25:37