2009-05-22 88 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'等

相关问题