我正在使用GET变量,人们通过以下网址访问它:
page?siteID=1
我检查以确保siteID是一个整数,但PHP说它是一个字符串。
如何将其转换为整数?我注意到intval()
会将0x1A转换为26,我不想发生这种情况。
答案 0 :(得分:9)
如果您不想转换变量,只需检查它是否代表数字,您也可以使用is_numeric
函数。或者,或者您可以使用其他答案中描述的转换方法,以最适合您的特定需求为准。
编辑:根据James Socol的评论,也可能值得查看ctype_digit
函数。对于您的特定应用程序(看起来您想检查一些页面ID号),这可能比is_numeric
函数更适合。
答案 1 :(得分:9)
正如旁注,以便你知道为什么这种情况正在发生,这就是正在发生的事情。
当网络浏览器发送GET
请求时,它就是全文。 URL“http://example.com/page?siteID=1”实际上是作为单个字符串发送的;在HTTP请求中,它将是这一行:
GET /page?siteID=1 HTTP/1.0
(网络浏览器使用“http://example.com
”部分来确定要与之通信的服务器以及要使用的网络协议。)
PHP掌握了这一点,并为您解析它做了大量的工作。它根据这些空格(方法“GET
”,URI“/page?siteID=1
”和协议“HTTP/1.1
”将其分为三部分,并进一步将URI解析为路径(“{ {1}}“)和查询参数(”siteID = 1“),它进一步解析为名称/值对。甚至上面引用的整个/page
行也只是作为请求传递给HTTP服务器的全文流的一部分。
所以你看到了很多工作的结果,将很长的一系列字符转换成很多不同的部分。
如果您真的很好奇,可以使用Wireshark或Firefox Live HTTP Headers plugin等工具查看文本字符串实际通过网络传递的详细信息。如果您是网络开发人员,那值得学习。
答案 2 :(得分:5)
要么转换为int
$id = (int)$_GET['siteID'];
了解string-to-integer conversions上的规则。或者使用
if (ctype_digit($_GET['siteID'])) { //...
如果您想确定它只包含数字(字符0-9)。如果您希望它是一个数字字符串,包括“-1.35e + 105”,您可以使用is_numeric()
。
答案 3 :(得分:3)
您需要将其强制转换为int
e.g。
$ siteid =(int)$ _GET ['siteID'];
那就行了。
答案 4 :(得分:2)
答案 5 :(得分:1)
你能做什么; ctype_digit($ _ GET [ '的siteID'])
答案 6 :(得分:0)
所有参数值都是字符串。您必须显式从字符串转换为整数。您可以按照其他答案中的建议进行投射,也可以使用setType(var, type)类型为“整数”
<?php
$id = $_GET['siteID'];
settype($id, "integer");
?>
答案 7 :(得分:0)
PHP会将所有GET / POST / COOKIE变量视为字符串,直到您对它们执行某些操作。
这是一个很好的PHP.net参考供您查看: http://ca.php.net/language.types.type-juggling
答案 8 :(得分:0)
Php是弱类型的。对他而言,整数和字符串可以以相同的方式进行威胁,它将根据上下文尝试猜测。
无论如何,当你使用GET传递变量时,它总是一个字符串,因为HTTP protocole是关于文本的。
所以有两件事:
你,大多数时候,不需要检查它是否是整数。使用duck typing:如果它是一个看起来像整数的字符串,请直接使用它。
如果您确实要查看,请使用is_numeric()。
如果需要条件语句,使用==检查字符串对整数是否有效。如果要使用类型强制进行检查,请使用===。
管理变量的愚蠢方式是PHP,PHP,PHP的一部分。喜欢它,或者讨厌它,但不要像在JAVA或C#中那样在PHP中尝试代码。
答案 9 :(得分: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;
答案 10 :(得分:0)
我建议使用mod_rewrite(如果可用)和正则表达式来混淆和保护您的GET变量,而不是在代码中强制转换它们。
答案 11 :(得分:0)
URI路径page?siteID=1
是一个字符串; $_GET['siteID']
的值最初将是一个字符串。
假设:siteID
值用于在siteID
字段中查找dB表,因此有效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'等。