我使用的是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