【问题标题】:Check if $_POST exists检查 $_POST 是否存在
【发布时间】:2010-08-16 20:15:49
【问题描述】:

我正在尝试检查 $_POST 是否存在,如果存在,则将其打印在另一个字符串中,如果不存在,则根本不打印。

类似这样的:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

任何帮助都会很棒!

【问题讨论】:

    标签: php


    【解决方案1】:
    if( isset($_POST['fromPerson']) )
    {
         $fromPerson = '+from%3A'.$_POST['fromPerson'];
         echo $fromPerson;
    }
    

    【讨论】:

    • 我试过这个但没有用,而是使用if($_POST['fromPerson'])
    【解决方案2】:

    简单。您有两个选择:

    1。检查是否有任何帖子数据

    //Note: This resolves as true even if all $_POST values are empty strings
    if (!empty($_POST))
    {
        // handle post data
        $fromPerson = '+from%3A'.$_POST['fromPerson'];
        echo $fromPerson;
    }
    

    (或)

    2。仅检查帖子数据中是否有特定的密钥

    if (isset($_POST['fromPerson']) )
    {
        $fromPerson = '+from%3A'.$_POST['fromPerson'];
        echo $fromPerson;
    }
    

    【讨论】:

    • 根据 Shi 的评论 on Augustus Francis's answerempty() 对于选项#1 是正确的,因为在 php 中,字符串 '0' 相当于 false - empty() 返回true 用于所有等效于假的值。所以使用empty,如果值为'0',代码将跳过打印。如果要排除空字符串,请参阅 Augustus 答案。
    【解决方案3】:

    每个人都说要使用 isset() - 这可能对你有用。

    但是,重要的是您要了解

    $_POST['x'] = NULL;$_POST['x'] = '';

    isset($_POST['x']) 将在第一个示例中返回 false,但将在第二个示例中返回 true,即使您尝试打印其中一个,两者都会返回一个空白值。

    如果您的 $_POST 来自用户输入的字段/表单并且留空,我相信(尽管我对此不是 100% 确定)该值将为 "" 但不是 NULL。

    即使这个假设是不正确的(如果我错了,请有人纠正我!)以上内容仍然很适合将来使用。

    【讨论】:

    • empty() 检查变量是否存在和非空值,因此当空字符串返回 false 时使用该函数。
    • @HanDijk - 根据 Shi 的评论 on Augustus Francis's answerempty() 在这里 正确,因为在 php 中,字符串 '0' 相当于 false -并且empty() 返回true 用于所有等于false 的值。所以使用empty,如果值为'0',代码将跳过打印。
    【解决方案4】:

    很惊讶它没有被提及

    if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){
    

    【讨论】:

    • 为什么?如果服务器方法不是 POST,则不会设置 POST 变量,因此只需要后半部分。我错了吗?
    • @ToolmakerSteve 是的,在大多数情况下这就足够了,但我的回答并不总是展示另一种可以做到的方式。
    • 如果您有一个带有复选框的表单并且没有名称提交,它也可以工作。
    • 描述isset($_POST['fromPerson']true 的情况,即使if($_SERVER['REQUEST_METHOD'] == 'POST'false。除非有这种情况,否则只需要isset... 部分。
    • 没错,但情况恰恰相反。 fromPerson 可能不存在,但 POST 可能仍然存在。问题是,“如果 $_POST 存在。”并且仅在一个示例中,使用了 $_POST['fromPerson']。在某些情况下,如@goat describes here,即使fromPerson 是提交名称,它也可能不会出现在POST 中。
    【解决方案5】:
    isset($_POST['fromPerson']) 
    

    【讨论】:

      【解决方案6】:

      检查数组键是否存在的正确方法是函数array_key_exists()

      不同之处在于,当您拥有$_POST['variable'] = null 时,这意味着密钥存在并且已发送但值为空

      另一个选项是isset(),它将检查数组键是否存在以及是否已设置

      最后一个选项是使用empty(),它会检查数组键是否存在,如果设置并且值不被认为是空的。

      例子:

      $arr = [
        'a' => null,
        'b' => '',
        'c' => 1
      ];
      
      array_key_exists('a', $arr); // true
      isset($arr['a']); // false
      empty($arr['a']); // true
      
      
      array_key_exists('b', $arr); // true
      isset($arr['b']); // true
      empty($arr['b']); // true
      
      
      array_key_exists('c', $arr); // true
      isset($arr['c']); // true
      empty($arr['c']); // false
      

      关于你的问题

      检查值是否已发送的正确方法是使用 array_key_exists() 检查请求方法

      if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
      {
         // logic
      }
      

      但有些情况取决于您的逻辑,isset()empty() 也可以。

      【讨论】:

      • 很棒的答案,除了建议使用empty。根据 Shi 的评论 on Augustus Francis's answerempty()not 正确的替代选择,因为在 php 中,字符串 '0' 等效于 false - 和 empty() 返回 true对于所有等于 false 的值。所以使用empty,如果值为'0',代码将跳过打印。如果要排除空字符串,请参阅 Augustus 答案。
      【解决方案7】:
      • 在这种情况下使用方法isset 是不合适的。

      根据 PHP 文档:http://php.net/manual/en/function.array-key-exists.php
      (参见示例 #2 array_key_exists() 与 isset()
      array_key_exists 方法用于检查数组中的键是否存在。

      所以问题中的代码可以更改如下:

      function fromPerson() {
         if (array_key_exists('fromPerson', $_POST) == FALSE) {
              return '';
         } else {
              return '+from%3A'.$_POST['fromPerson'];
         };
      }
      
      $newString = fromPerson();
      


      • 检查数组 $_POST 的存在不是必需的,因为它是 PHP 4.1.0 版本以来的环境全局变量(现在我们不满足旧版本的 PHP)。

      【讨论】:

      • 此代码仅在设置了 post 字段但包含 NULL 时的行为与 isset 解决方案不同。这是一个不错的替代方案如果您想在else 分支中允许NULL然而,如果需要字符串,那就错了;在那种情况下,isset 做了正确的事情,但这段代码没有——它将传递NULL 的值。 Robert's later answer 展示了不同之处。
      【解决方案8】:

      实际上不鼓励所有方法,这是 Netbeans 7.4 中的一个警告,而且不直接访问超全局变量肯定是一个好习惯,请改用 filter

      $fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
      if($fromPerson === NULL) { /*$fromPerson is not present*/ }
      else{ /*present*/ }
      var_dump($fromPerson);exit(0);
      

      【讨论】:

      • 另一方面,代码的可读性也很重要。恕我直言,isset 比过滤表达式更具可读性。但感谢您指出这一点;这是一个有用的选择。
      • 好吧,你可以编写自己的 myIsset/2 包装方法,它使用过滤器但具有 isset/2 的行为
      • “实际上不鼓励所有方法” - 这是一个强有力的声明(即使 NetBeans 确实将其标记为警告)。您是否有一个权威来源的链接,不鼓励直接引用 $_POST? (有一个关于 php 的 lot 是为了编码方便而不是严谨而设计的 - 看看这个问题的答案中有多少人错误地使用了 empty,被 php 的松散输入绊倒了;很难想象访问 $_POST 会被认为是糟糕的风格。)
      • 如果你只需要知道它是否存在而不关心值,例如检查提交按钮,你可以使用filter_has_var(INPUT_POST, 'fromPerson')
      【解决方案9】:

      试试

      if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
          echo "Cool";
      }
      

      【讨论】:

      • Per Han Dijk 对 Rafael 的回答的评论,empty($_POST['fromPerson']) 做了这个综合测试。更容易阅读和输入:)
      • @ToolmakerSteve:empty('0') 返回true。所以就不一样了。
      • @Shi - 是的,你是对的;我说的是错的!似乎没有比这里显示的代码更简单的解决方案了。
      【解决方案10】:

      试试isset($_POST['fromPerson'])

      【讨论】:

        【解决方案11】:
        if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
            echo 'blah' . $_POST['fromPerson'];
        }
        

        【讨论】:

        • is_array($_POST) 是否检查 POST 中是否有任何值?在我的应用程序中,我试图在做其他任何事情之前确定是否有帖子。
        • 查看我的编辑。 is_array() 检查是否为数组,第二部分检查是否有 key 为 'fromPerson' 的项。
        【解决方案12】:

        我想添加我的答案,即使这个帖子已有多年历史并且它在 Google 中对我来说排名很高。

        我最好的方法是尝试:

        if(sizeof($_POST) !== 0){
        // Code...
        }
        

        由于$_POST 是一个数组,如果脚本加载并且$_POST 变量中没有数据,那么它的数组长度将为0。这可以在IF 语句中使用。

        您可能还想知道这是否会引发“未定义索引”错误,就像我们正在检查是否设置了 $_POST...事实上 $_POST 始终存在,“未定义索引”错误只会出现如果您尝试搜索不存在的 $_POST 数组值。

        $_POST 本身总是存在,要么是空的,要么有数组值。 $_POST['value'] 可能不存在,从而引发“未定义索引”错误。

        【讨论】:

          【解决方案13】:

          if( isset($_POST['fromPerson']) ) 是对的。

          你可以使用函数并返回,比直接回显更好。

          【讨论】:

          • 这个答案没有增加讨论,这在其他答案中没有说过,早。
          【解决方案14】:

          我喜欢在三元运算符中检查它是否为 isset 以及它是否为空。

          // POST variable check
          $userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
          $line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
          $message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
          $source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
          $version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
          $release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;
          

          【讨论】:

          • empty('0')true。所以最好不要有version0,或userID0等。
          猜你喜欢
          • 1970-01-01
          • 2011-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-18
          • 2018-09-10
          相关资源
          最近更新 更多