如何处理多个$ _GET的长URL?

时间:2010-12-10 06:45:25

标签: php

我有一个多个$ _GET值的长网址,它看起来像这样: ?index.php文件类别=音乐和ID = 3211&放大器;删除= YES 在php文件中,我有一个像这样的if条件:

if(isseet($_GET['Category']) && isset($_GET['Id']) && !isset($_GET['Delete'])){
echo 'Valid page';
}elseif(if(isseet($_GET['Category']) && isset($_GET['Id']) && isset($_GET['Delete'])){
echo 'delete !';
}

如你所见,这是一个非常复杂的条件,当我有大约20个类似的条件。我想知道我们是否有一些简单的方法来做到这一点,例如SWITCH 谢谢

2 个答案:

答案 0 :(得分:1)

// if switch is true, check if all are set; if it's
// false check for none to be set. Defaults to true
function array_all_set($keys, $vector, $switch=true)
{
    foreach($keys as $key)
        if($switch == !isset($vector[$key]))
            return false;
    return true;
}

现在就这样使用它:

if(array_all_set(array("Category", "Id"), $_GET)
   && array_all_set(array("Delete"), $_GET, false)) {/* stuff */}

我知道只有3个值并没有太大的改进,但对于你所说的20个值,它只是为该数组添加值。

答案 1 :(得分:0)

首先,使用这样的代码:

if(isseet($_GET['Category']) )
//do something...

那是错的!你需要消毒你的输入。但是,我假设你已经知道了。回到你的问题,你应该使用一个相当复杂的结构来处理你的请求变量,例如字典,然后用它来验证你的请求。一个想法是这样的:

class RequestDictionary
{
  private $dictionary; 

  public function RequestDictionary()
  {
    foreach ( $_GET as $key => $value )
    {
      $this->dictionary[$key] => clean_var($value);
    }
  }

  public function hasKeys($keys = array())
  {
    foreach ( $keys as $key )
      if ( !isset( $this->dictionary[$key] ) )
        return false;

    return true;
  }
}

然后,在您的PHP页面中,您应该在页面中创建一个方法来验证请求的Url,如下所示:

function Validate()
{
  $requestDict = new RequestDictionary();
  return $requestDict->hasKeys(array('category', 'id', 'whatever'));
}

您的代码应该非常简化。请记住,无论何时编码多次相同的片段,都不会抽象出某些内容。对于超长的答案感到抱歉,但我不得不放置大部分课程,以便你可以很好地看到它,

希望我能帮忙! 大卫