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

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番からのこの答えが本当に好きで、整数を除外する最も効率的な方法の1つであると信じる傾向があります。

IEは、たとえば参照の例として再投稿され、これを私たちと共有してくれたMartinGeislerに称賛を送ります。

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

次のようなことができます:

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