1

我有一个 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);

2: 这个
3:

preg_match("/^\d+$/",$_GET["uid"])

我的问题是哪一种更好用?

******
注意:$id 应该是一个非负整数。

我没有回答它,因为没有人回答我的问题:我正在寻找最好的方法而不是方法!

4

5 回答 5

2

使用函数ctype_digit来检查它。

于 2012-04-12T05:54:57.920 回答
1

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 ~]$
于 2012-04-12T05:47:40.033 回答
0

哇。我真的很喜欢数字 2 的这个答案,并且倾向于相信它似乎确实是过滤掉整数的最有效方法之一。

IE,例如引用的转发,感谢 Martin Geisler 与我们分享这个:

if (strcspn($_REQUEST['q'], '0123456789') != strlen($_REQUEST['q']))
  echo "true";
else
  echo "false";

我很想在这方面做基准测试,即使只是出于好奇。有很多方法可以做到这一点,希望其他人可能有想法。

您的第一种方法看起来不错,但我认为在某些奇怪的情况下它可能会失败。也许不是,我没有测试过你的代码,但我在想如果$_GET['uid']有一个价值.+1234.56或其他一些类似的奇怪情况,你可能会得到意想不到的结果。

您可以使用您拥有的代码轻松地进行几个测试和一个脚本,每个方法在它们自己的函数中,并通过调用每个函数 1000 次对此进行基准测试,您将立即了解最佳解决方案“性能-明智的'。结果可能会让你大吃一惊。我可以保证最漂亮的代码并不总是最好的!为了自己的表现,我不得不推出一些丑陋的技巧。

只要您的测试是严格的,并根据需要进行更新(非常重要)以反映它正在测试的代码的任何要求,您就可以使用您喜欢的任何实现,它通过了我一直在谈论的测试

在这种情况下,要求非常低,很容易测试

快乐的编码,干杯!

于 2012-04-12T06:19:16.463 回答
0

它有帮助吗?

if (strval(intval($_GET["uid"])) == $_GET["uid"]) {
    // the value is an integer
}
于 2012-04-12T05:57:37.720 回答
0

您可以执行以下操作:

$id = (isset($_GET["uid"]) ? $_GET["uid"] : 0);
if ($id !== strval(intval($id))) {
    $id = 0;
}
$id = max(0, $id);
于 2012-04-12T06:04:10.633 回答