2009-05-22 29 views
2

我使用的是GET變量,並通過人以下網址找到它:PHP 1是一個字符串不是整數

page?siteID=1 

,我檢查,以確保的siteID是一個整數,但PHP是說它是一個字符串。

如何將它轉換爲整數?我注意到intval()會將0x1A轉換爲26,我不希望發生這種情況。

+0

舊的PHP技巧$ id = 0 + $ _GET ['siteID'];有些討厭它,有些人喜歡它。 – gradbot 2009-05-22 17:25:37

回答

9

如果您不想轉換變量,但只需檢查它是否代表數字,則還可以使用is_numeric函數。要麼是這樣,要麼您可以使用其他答案中所述的轉換方法,以適合您最需要的方式爲準。

編輯:基於詹姆斯Socol的評論,它也可能是值得看ctype_digit功能。對於您的特定應用程序(看起來您想檢查某個頁面的ID號),這可能比is_numeric函數更適合。

3

您需要將其轉換爲int

例如,

$ siteid =(int)$ _GET ['siteID'];

這樣做。

+0

嗯......似乎無法找到該文檔,如果有非數字字符,(int)會做什麼?我的猜測是 – Hintswen 2009-05-22 14:03:49

+2

;與intval相同 – Jake 2009-05-22 14:05:59

1

你可以做什麼; ctype_digit($ _ GET [ '的siteID'])

0

所有參數值都是字符串。您必須明確地將字符串轉換爲整數。你可以投在其他的答案建議或使用setType(var, type)其中類型是「整數」

<?php 
    $id = $_GET['siteID']; 
    settype($id, "integer"); 
?> 
9

正如一個側面說明,讓你知道爲什麼正在發生的事情,這裏發生了什麼事情。

當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開發人員,這是值得學習的。

5

要麼強制轉換爲int

$id = (int)$_GET['siteID']; 

知道上string-to-integer conversions的規則。或使用

if (ctype_digit($_GET['siteID'])) { //... 

如果你想確保它只包含數字(字符0-9)。如果你想要它是一個數字字符串,包括「-1.35e + 105」,你可以使用is_numeric()

0

Php是弱類型的。對他來說,整數和字符串可以以相同的方式進行威脅,它將根據上下文猜測如何進行猜測。

無論如何,當你使用GET傳遞一個變量時,它始終是一個字符串,因爲HTTP protocole是關於文本的。

所以兩兩件事:

  • 你,大部分的時間,也不需要檢查它是否是一個整數。使用鴨子打字:如果它是一個看起來像一個足夠整數的字符串,直接使用它。

  • 如果您確實想檢查,請使用is_numeric()。

  • 如果你需要一個條件語句,使用==來檢查一個字符串對整數將工作。如果您想檢查類型強制執行,請使用===。

管理變量的fudgy方式是什麼使得PHP,以及PHP的一部分。喜歡它,或者討厭它,但不要嘗試PHP中的代碼,比如在JAVA或C#中。

0

更多的想法:

$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; 
0

我建議你使用mod_rewrite(如果可用)和正則表達式來混淆和保護您的GET變量,而不是將它們轉換爲代碼。

0

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'等

相關問題