如何"正确"处理PHP中的$ _GET变量?

Ric*_*ral 8 php variables validation get

目前,我有以下代码:

if(isset($_GET['mid']) && !empty($_GET['mid'])) {
    $mid = $_GET['mid'];

    if(is_numeric($mid) && $mid > 0) {
        if(isset($_GET['op']) && !empty($_GET['op'])) {
            $op = $_GET['op'];

            if($op == 'info') {
            }

            if($op == 'cast') {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我认为if语句中的if语句太"复杂"了......

你能用不同的方式处理吗?你会如何让它变得更简单?

[编辑]一般承认的答案:

好吧,我已经学到了一些我不知道的小细节和新的PHP函数.我不认为有正确的方法来做我所要求的.我显然是以错误的方式使用一些PHP函数,我会修复它.

在我看来,像这样的输入应该使用PHP过滤器函数进行验证/清理,因此我将Arkh的答案标记为已接受.

但是,对于特定的大学项目(PHP代码完全不相关),我将使用他的答案与Tatu的帮助函数构思混合使用.但是对于一个不同的项目,我会将他的答案与Ignacio的课堂理念混合使用,因为它看起来更好,更有条理.

Ark*_*rkh 12

我会将filter_input与FILTER_SANITIZE_NUMBER_FLOAT过滤器一起用于mid.像这样的东西:

$mid = filter_input(INPUT_GET, 'mid', FILTER_SANITIZE_NUMBER_FLOAT);
$op = filter_input(INPUT_GET, 'op');
if($mid > 0){
  switch($op){
    case 'info':
      // Some code
      break;
    case 'cast':
      // Some more code
      break;
    default:
      break;
  }
}
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 6

我将编写一个函数,它将获取索引的名称,并返回值$_GET或抛出异常.

那,或将其封装在类似于以下的类中:

#$_GET = array('name' => 'Ignacio', 'foo' => '42');

class Get
{
  public static function string($name)
  {
    if (isset($_GET[$name]))
    {
      return $_GET[$name];
    }
    else
    {
      throw new Exception(sprintf('Unknown GET parameter "%s"', $name));
    }
  }

  public static function int($name)
  {
    $val = Get::string($name);
    $ret = filter_var($val, FILTER_VALIDATE_INT);
    if ($ret != $val)
    {
      throw new Exception(sprintf('Invalid int GET parameter "%s"', $name));
    }
    return $ret;
  }
}

echo Get::string('name') . "\n";
echo Get::int('foo') . "\n";
#echo Get::int('name') . "\n";
#echo Get::int('age') . "\n";
Run Code Online (Sandbox Code Playgroud)