我有一个 php 脚本,可以从管理员那里获取一个数字并更改关联的用户。 这很好,直到我意识到is_numeric
和intval
函数有一个有趣的行为。 这是我使用的代码:
if( ((empty($_GET["uid"])) || (!isset($_GET["uid"])))){
$id=0;
}else{
if(is_numeric($_GET["uid"])){
$id=intval($_GET["uid"]);
if($id<0){
$id=0;
}
}else{
$id=0;
}
}
但是如果我12er3
作为输入发送到脚本,$id
将被12
.显然这不是我想要的。我发现了几种检查输入以确保它由数字(并且仅数字)组成的方法:1:
$id=(filter_var($_GET['uid'],FILTER_VALIDATE_INT)?(intval($_GET['uid'])<0?0:intval($_GET['uid'])):0);
阿拉伯数字:这个
3:
preg_match("/^'d+$/",$_GET["uid"])
我的问题是哪一种使用方式更好?
******
注意:$id应为非负数和整数。
我没有回答它,因为没有人回答我的问题:我正在寻找最好的方法而不是方法!
使用函数ctype_digit
进行检查。
PHP 的 is_numeric() 行为应该是可预测的,我认为在这里应该可以正常工作。 我不明白你为什么需要intval()
.
[ghoti@pc ~]$ php -r 'if (is_numeric("12er3")) print "yes'n";'
[ghoti@pc ~]$ php -r 'if (is_numeric("123")) print "yes'n";'
yes
[ghoti@pc ~]$
确认变量 is_numeric() 后,您可以按原样使用该变量。 PHP 是无类型的。
[ghoti@pc ~]$ cat doit.php
#!/usr/local/bin/php
<?php
$_GET["uid"]=$argv[1];
if (isset($_GET["uid"]) && is_numeric($_GET["uid"])) {
$a=preg_split('/[^'d]+/', $_GET["uid"]+0); # Use only the
$id=$a[0]; # integer part
if ($id<0) {
$id=0;
}
} else {
$id=0;
}
print $id . "'n";
[ghoti@pc ~]$ ./doit.php 123
123
[ghoti@pc ~]$ ./doit.php 12er3
0
[ghoti@pc ~]$ ./doit.php ""
0
[ghoti@pc ~]$ ./doit.php
0
[ghoti@pc ~]$
你可以做这样的事情:
$id = (isset($_GET["uid"]) ? $_GET["uid"] : 0);
if ($id !== strval(intval($id))) {
$id = 0;
}
$id = max(0, $id);
哇。我真的很喜欢数字 2 中的这个答案,并且倾向于相信它确实是过滤掉整数的最有效方法之一。
IE,例如重新发布参考,感谢Martin Geisler与我们分享这一点:
if (strcspn($_REQUEST['q'], '0123456789') != strlen($_REQUEST['q']))
echo "true";
else
echo "false";
我很想对此做基准测试,即使只是出于好奇。有很多方法可以做到这一点,希望其他人可能有想法。
您的第一种方法看起来不错,但我认为在某些奇怪情况下可能会失败。也许不是,我没有测试过你的代码,但我在想$_GET['uid']
的值是否为 .+1234.56
或其他一些类似的奇怪情况,你可能会得到意想不到的结果。
你可以轻松地用你拥有的代码来打几个测试和一个脚本,每个方法都有自己的函数,并通过调用每个函数 1000 次来对其进行基准测试,您将立即了解"性能方面"的最佳解决方案。结果可能会让您大吃一惊。我可以肯定,最漂亮的代码并不总是最好的!为了自己的表现,我不得不推出一些丑陋的黑客。
只要你的测试是严格的,并根据需要(非常重要)进行更新以反映它正在测试的代码的任何要求,你就可以使用任何你喜欢的通过我一直在谈论的测试的实现。
在这种情况下,要求非常小,很容易测试。
编码愉快,干杯!
它有帮助吗?
if (strval(intval($_GET["uid"])) == $_GET["uid"]) {
// the value is an integer
}