检查变量是否为数字的最佳方法


best way to check variable to be a number

我有一个 php 脚本,可以从管理员那里获取一个数字并更改关联的用户。 这很好,直到我意识到is_numericintval函数有一个有趣的行为。 这是我使用的代码:

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
}