【问题标题】:I need a more efficient way of checking if multiple $_POST parameters isset我需要一种更有效的方法来检查是否设置了多个 $_POST 参数
【发布时间】:2011-06-06 18:39:51
【问题描述】:

我有这些变量,我需要检查它们是否都是isset()。我觉得必须有一种更有效的方式来检查它们,而不是一次一个。

$jdmMethod = $_POST['jdmMethod'];
$cmdMethod = $_POST['cmdMethod'];
$vbsMethod = $_POST['vbsMethod'];
$blankPage = $_POST['blankPage'];
$facebook = $_POST['facebook'];
$tinychat = $_POST['tinychat'];
$runescape = $_POST['runescape'];
$fileUrl = escapeshellcmd($_POST['fileUrl']);
$redirectUrl = escapeshellcmd($_POST['redirectUrl']);
$fileName = escapeshellcmd($_POST['fileName']);
$appData = $_POST['appData'];
$tempData = $_POST['tempData'];
$userProfile = $_POST['userProfile'];
$userName = $_POST['userName'];

【问题讨论】:

    标签: php


    【解决方案1】:

    试试这个

         $allOk = true;
         $checkVars = array('param', 'param2', …);
         foreach($checkVars as $checkVar) {
              if(!isset($_POST[$checkVar]) OR !$_POST[$checkVar]) {
                   $allOk = false;
                   // break; // if you wish to break the loop
              }
         }
    
         if(!$allOk) {
             // error handling here
         }
    

    【讨论】:

    • 不要对非异常情况使用异常。
    • OR 在德语 (mac) 键盘布局上比 || 更容易输入 ;) 让我猜猜你的下一个问题:»谁使用 mac?« ;)
    【解决方案2】:

    我喜欢使用这样的函数:

    // $k is the key
    // $d is a default value if it's not set
    // $filter is a call back function name for filtering
    function check_post($k, $d = false, $filter = false){
        $v = array_key_exists($_POST[$k]) ? $_POST[$k] : $d;
        return $filter !== false ? call_user_func($filter,$v) : $v;
    }
    
    $keys = array("jdmMethod", array("fileUrl", "escapeshellcmd"));
    $values = array();
    foreach($keys as $k){
        if(is_array($k)){
            $values[$k[0]] = check_post($k[0],false,$k[1]);
        }else{
            $values[$k] = check_post($k[0]);
        }
    }
    

    如果您愿意,您可以扩展键数组以包含每个后值的不同默认值。

    编辑:

    如果您想确保所有这些都具有非默认值,您可以执行以下操作:

    if(sizeof(array_filter($values)) == sizeof($keys)){
        // Not all of the values are set
    }
    

    【讨论】:

      【解决方案3】:

      类似这样的:

      $jdmMethod = isset($_POST['jdmMethod']) ? $_POST['jdmMethod'] : NULL;
      

      我是Ternary Operator

      【讨论】:

      • 更好的是,创建一个函数:function get_or_else($array, $key, $default=null){ return isset($array[$key]) ? $array[$key] : $default; }
      【解决方案4】:

      我认为这应该可行(未测试,凭记忆)

      function handleEmpty($a, $b) {
         if ($b === null) {
             return false;
         } else {
            return true;
      }
      
      array_reduce($_POST, "handleEmpty");
      

      【讨论】:

        【解决方案5】:

        不是真的。您可以列出预期字段:

        $expected = array(
         'jdmMethod',
         'cmdMethod',
         'fileName'
        ); // etc...
        

        ...然后循环它们并确保所有键都到位。

        $valid = true;
        foreach ($expected as $ex) {
         if (!array_key_exists($ex, $_POST)) {
           $valid  = false;
           break;
         }
         $_POST[$ex] = sanitize($_POST[$ex]);
        }
        
        if (!$valid) {
          // handle the problem
        }
        

        如果您可以开发通用的清理功能,那将有所帮助 - 您可以在循环时清理每个函数。

        我喜欢使用的另一件事是在清理时提供默认值的函数。

        function checkParam($key = false, $default = null, $type = false) {
            if ($key === false)
                return $default;
        
            $found_option = null;           
            if (array_key_exists($key,$_REQUEST))
                $found_option = $_REQUEST[$key];
            if (is_null($found_option))
                $found_option = $default;       
            if ($type !== false) {
                if ($type == 'string' && !is_string($found_option))
                    return $default;
                if ($type == 'numeric' && !is_numeric($found_option))
                    return $default;
                if ($type == 'object' && !is_object($found_option))
                    return $default;
                if ($type == 'array' && !is_array($found_option))
                    return $default;
            }
            return sanitize($found_option);
        }
        

        当可以使用默认值时,您不想执行循环,而是独立检查每个循环:

        $facebook = checkParam('facebook', 'no-facebook', 'string);
        

        【讨论】:

          【解决方案6】:

          这不是您要寻找的答案,但不是。

          您可以创建一个数组,通过该数组循环来检查一个值,但没有比这更好的了。

          例子:

          $postValues = array("appData","tempData",... etc);
          foreach($postedValues as $postedValue){
             if(isset($_POST[$postedValue])){
                ...
             }
          }
          

          【讨论】:

          • 1) 您可以在此处使用foreach。 2)你将如何设置变量? 3)这段代码中没有任何检查,isset的结果是未使用的。
          • 是的,我编写 PHP 代码已经有一段时间了,所以我更正了它,thnx :) 改变了它。
          • 如果可以的话 - 如果您不是 PHP 人,那么在这里回答 PHP 问题没有多大意义。一方面,我永远不会假设回答 ASP 问题,因为很有可能,我会错的。无论如何都要考虑一下。
          • 降级我的答案,虽然它是正确的,但我大部分时间都在编程 c#,但我现在仍然写了一些 PHP,我只是对 foreach 感到困惑.. 该死的人:S
          猜你喜欢
          • 2019-05-22
          • 2021-08-22
          • 2019-07-18
          • 1970-01-01
          • 1970-01-01
          • 2020-02-19
          • 1970-01-01
          • 2012-06-13
          • 2015-12-28
          相关资源
          最近更新 更多