【问题标题】:Shortcut to isset() and assigning valuesisset() 的快捷方式和赋值
【发布时间】:2013-09-26 09:02:28
【问题描述】:

是否有将$_GET['values'] 分配给变量的快捷方法?

我现在和其他人一样:

if(isset($_GET['type'],$_GET['case'])
   $type = $_GET['type'];
   $case = $_GET['case'];

有没有一种更简洁的方法可以做到这一点,而不是像下面那样单独做。

 $type = $_GET['type'];
 $case = $_GET['case'];

【问题讨论】:

  • 您可以在 foreach 循环中执行此操作吗? <?php foreach($_GET as $key=>$val) { $key = $val; } ?>

标签: php


【解决方案1】:

http://docs.php.net/extract

我认为您正在寻找 extract 函数。

extract($_GET); //now, all of the functions are in current symbol table

【讨论】:

  • @HamZa 绝对。这就是为什么我会避免做这样的事情,无论如何。但问题是关于将变量从 _GET 移动到 vairables 的干净方式,而 extract 就是这样做的。没有什么比一个函数调用更干净的了。安全方面,我建议改用 docs.php.net/filter 中的函数
【解决方案2】:

嗯,使用数组映射,您不仅可以一次获得case,还可以一次获得全部,您还可以同时检查isset()empty()

假设,你有这个 URL:read.php?id=1&name=foo&job=student&country=Brazil

您的问题是获取$_GET 类型,您可能需要检查它是否是empty/isset 或不对?

好吧,首先你创建一个函数来遍历它。

function checkGet($val){
    return (isset($val) && !empty($val)) ? $val : null;

}

然后,您使用 array_map() 回调该函数

$check = array_map('checkGet', $_GET);

就是这样!

如果你现在做var_dump($check);,你会得到所有的类型和值:

array (size=4)
  'id' => string '1' (length=1)
  'name' => string 'foo' (length=3)
  'job' => string 'student' (length=7)
  'country' => string 'Brazil' (length=6)

意思是,在此之后,不做:

if(isset($_GET['something']) && !empty($_GET['something']))
$var = $_GET['something'];
echo $var; 

只要做:

echo $check['something']

【讨论】:

    【解决方案3】:

    为了确保您仍然进行必要的检查,我能想到的唯一一行代码是

    $type = (isset($_GET['type'])) ? $_GET['type'] : 'a default value or false';
    

    阅读 cmets,我了解您可能想要这样做:

    foreach($_GET as $key=>$value) {
      $$key = $value;
    }
    

    不过,我建议始终只初始化您需要的变量。上述代码将导致获取未知变量,这实际上可能为用户提供了一种操作脚本的方法。
    示例:

    index.php?ExpectedVar=1&UserDefinedVar=2
    

    将在您的代码中生成以下变量:

    $ExpectedVar // 1 <- you wanted this one
    $UserDefinedVar // 2 <- but what about this?
    

    如果您让这个脚本被其他脚本调用怎么办?
    然后,即使您在文件顶部有此代码,您也可能会从用户定义的 $_GET 中覆盖一些变量!

    灾难案例情景:
    script1.php

    <?php 
      $tableToDelete = "old_products";
      include("script2.php");
    ?>
    

    script2.php

    <?php
      foreach($_GET as $key=>$value) {
        $$key = $value;
      }
      // user added &tableToDelete=users
      // DROP TABLE $table
      // will gloriously delete users
    ?>
    

    通过使用我发布的原始代码编写几行代码,您可以在 php 脚本的开头获取所需的变量并清楚地使用它们。

    【讨论】:

    • OP 以$_GET['type'],$_GET['case'] 为例,您的方法仅处理一种GET 类型,即仅$_GET['type']
    【解决方案4】:

    试试看

    foreach($_GET as $key=>$value) {
         $get_arr[$key] = $_GET[$key];
    }
    print_r($get_arr);
    

    【讨论】:

    • 如果你使用foreach,那么循环内的isset()总是true
    • 这有什么帮助?你刚刚做了$get_arr = $_GET; ;)
    • 会得到非空的GET值
    【解决方案5】:

    我会这样做,这样你确保它只会返回 TRUE 或 FALSE

    if (!isset($_GET['type']) || empty($_GET['type'])) {
    
    // Display error
    
    } else {    
    
    $type = $_GET['type'];
    $case = $_GET['case'];  
    
    }
    

    或者你也可以这样做

    $type = (isset($_GET['type'])===false)?'':trim($_GET['type']);
    $case = (isset($_GET['case'])===false)?'':trim($_GET['case']);
    

    【讨论】:

      【解决方案6】:

      $_GET 是表,所以你可以轻松使用 foreach 函数

      例如

      foreach ($_GET as $key => $value) {
      ... = $value;
      }
      

      如果您想使用 $key 名称创建变量,请使用变量变量 PHP Manual Variable Variables

      【讨论】:

        【解决方案7】:

        您可以通过extract()进行操作

        extract($_GET, EXTR_PREFIX_ALL, 'g');

        这样

        $_GET['val'] 变为 $g_val

        注意第三个参数:g 它将 g_ 添加到键中。

        【讨论】:

          【解决方案8】:

          这个(未经测试的)类应该可以帮助你:

          class MyGet {
              public static $myValues = array();
          
              public static function setMyValues($keywords, $where) {
                  MyGet::$myValues = array();
                  for ($index = 0; $index < count($keywords); $index++) {
                      if ((!(isset($where[$keywords[$index]]))) || (empty($where[$keywords[$index]]))) {
                          MyGet::$myValues = array();
                          return false;
                      }
                      MyGet::$myValues[$keywords[$index]] = $where[$keywords[$index]];
                  }
              }
          }
          

          你可以这样使用它:

          if (MyGet::setMyValues(array(0 => "type", 1 => "case"), $_GET)) {
              //the values are initialized
          } else {
              //the values are not initialized
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-15
            • 1970-01-01
            • 1970-01-01
            • 2012-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多