【问题标题】:Check if multiple strings are empty [duplicate]检查多个字符串是否为空[重复]
【发布时间】:2012-06-08 14:10:09
【问题描述】:

可能重复:
More concise way to check to see if an array contains only numbers (integers)
PHP checking if empty fields

我有一个提交 10 个字段的表单,其中 7 个应该填写,这是我现在在 PHP 中检查它的方式:

if (!$name || !$phone || !$email || !$mobile || !$email || !$state || !$street || !  $city) {
        echo '<div class="empty_p">You have empty fields!!!</div>';}
else{
        //process order or do something
}

我的问题是:有没有更简单的方法可以做到这一点?因为有时我要检查的字符串更多(12-15)

【问题讨论】:

  • 如果将它们添加到数组中,您可以使用 foreach。
  • @dynamic - 如果是表单数据,很可能它首先来自数组($_POST 或 $_GET)
  • @MarkBaker 是的,但他说他只需要检查 7 个表单提交的变量。

标签: php


【解决方案1】:

另一种可能性:

$elements = array($name, $email, $mobile);
$valid = true;

foreach ($elements as $element) {
    if (empty($element)) {
        $valid = false;
    }
}

if ($valid) {
    // complete
} else {
    // alert! some element is empty
}

【讨论】:

    【解决方案2】:

    这样的?

    foreach($_POST as $key => $value) 
    {
        if (empty($_POST[$key]))
        {
            echo '<div class="empty_p">'.$_POST[$key].' is empty.</div>';
        }
    }
    

    【讨论】:

    • 您可以删除 !isset($_POST[$key]),因为如果它尚未设置,它就不会在您循环的 POST 数组中。
    • 咳咳,你说得对。习惯:P
    • 好东西,尽管仔细检查 n 大小写不会有什么坏处;p
    • @Bono 这行也会抛出错误,因为if (empty($_POST[$key]) 中缺少) --- 应该读作if (empty($_POST[$key]))
    • @Fred-ii- good eye ;) 我已经编辑了我的答案
    【解决方案3】:

    最好具体说明这些数据的预期位置,例如$_POST:

    if (!isset($_POST['name'], $_POST['phone'], $_POST['email'], $_POST['mobile'], $_POST['state'], $_POST['street'], $_POST['city'])) {
        // something is up
    }
    

    您可以通过使用所需的字段名称创建一个数组来稍微缩短此代码:

    $required_fields = array('name', 'phone', 'email', 'mobile', 'state', 'street', 'city');
    

    “检查存在”代码可以简化为:

    foreach ($required_fields as $f) {
        if (!isset($_POST[$f])) {
            // something is up
        }
    }
    

    更好的方法 ™

    但是,您应该认真考虑结合存在验证/清理检查。 PHP 提供了一系列filter functions 函数,可用于验证和/或清理输入变量。例如,要获得与上述相同的行为:

    $required_fields = filter_input_array(INPUT_POST, array(
        'name' => FILTER_UNSAFE_RAW,
        'email' => FILTER_VALIDATE_EMAIL,
    ));
    
    if (is_null($required_fields) || in_array(null, $required_fields, true)) {
        // some fields are missing
    }
    

    存在但未通过验证的字段将设置为false,因此您可以通过以下方式检测此类事件:

    foreach ($required_fields as $name => $value) {
        if (false === $value) {
            // field $name failed validation (e.g. bad email format)
        } elseif (!strlen(trim($value))) {
            // field is empty
        }
    }
    

    【讨论】:

      【解决方案4】:

      最好的方法是创建某种形式的验证器。但是你可以使用这个函数:

      <?php
          function isAnyEmpty() {
              $total = 0;
              $args = func_get_args();
              foreach($args as $arg)
              {
                  if(empty($arg)) {
                      return true;
                  }
              }
      
              return false;
          }
          $var1 = 1;
          $var2 = 'test';
          $var3 = '';
      
          if(isAnyEmpty($var1, $var2, $var3)) {
              echo 'empty fields!';
          }
      ?>
      

      【讨论】:

        【解决方案5】:

        您可以尝试创建一个可重复使用且更精确的通用验证类。

        一些伪代码:

        <?
        
        class validateFields {
            $validators = array(
                "name" => array(
                    "empty" => array(
                        "rule"          => "some regex",
                        "errorMessage"  => "name may not be empty"
                    ),
                    "noNumbers" => array(
                        "rule"          => "some regex",
                        "errorMessage"  => "No numbers are allowed in the name field"
                    )
                ),
                "otherVariable" => array(
                    "atLeast50chars" => array(
                        "rule"          => "some regex",
                        "errorMessage"  => "This field must be at least 50 chars"
                    )
                )
            );
        
        
            public function Validate($post){
                $errors = array();
        
                foreach($_POST as $key => $value){
                    if(!array_key_exists($key, $validators)) {
                        continue;
                    }
        
                    foreach($validators[$key] as $validator) {
                        if(!preg_match($validator["rule"], $value) {
                            $errors[$key] = $validator["errorMessage"];
                            break;
                        }
                    }
                }
        
                return $errors;
            }
        }
        
        
        ?>
        

        然后在您的代码中,您可以执行以下操作:

        $errors = Validate($_POST);
        foreach($error as $errorMessage) {
            echo $errorMessage . "</br>";
        }
        

        当然,你可以想象一下,在相关输入字段的正下方/旁边添加带有类的 div,然后将 $errorMessage 加载到那里。 我敢肯定那里有很多例子:)

        【讨论】:

          【解决方案6】:

          你可以写 Foreach 循环

            foreach($_POST as $key => $value) 
              {
                  if (!isset($_POST[$key]) || empty($_POST[$key])
                  {
                      echo '<div class="something">You have empty fields!!!</div>';
                  }
              }
          

          【讨论】:

          • empty == "" 不需要重复两次,但0也会被认为是空的。
          • 你是不是复制了我的代码? ://
          • 由于if (!isset($_POST[$key]) || empty($_POST[$key]) 中缺少),此行将引发错误---应该读作if (!isset($_POST[$key]) || empty($_POST[$key]))
          【解决方案7】:
          <input type="text" name="required[first_name]" />
          <input type="text" name="required[last_name]" />
          ...
          
          
          $required = $_POST['required'];
          foreach ($required as $req) {
             $req = trim($req);
             if (empty($req))
                echo 'gotcha!';
          }
          

          /* 更新 */

          好的!伙计们,轻松...

          你可以让它更安全,就像我们程序员对输出数据所做的那样,就像$id = (int) $_GET['id']$username = (string) addslashes($_POST['username'])等等......;

          $required = (array) $_POST['required'];

          然后,任何来自帖子字段的内容都让它们来,这段代码只是寻找它需要的东西。 这就对了!呃……

          【讨论】:

          • 漂亮。永远不会想到这一点..你每天都学到一些东西!
          • 有点晚了,这就是为什么这里的想象力不足:P
          • 嗯,这很好用,但是如果有人编辑表单的源代码并将“required[first_name]”更改为空怎么办。那么什么都不会发送,还会有数据丢失?
          • 这是一个可怕的想法。客户端修改 HTML 或简单地发送手动制作的 POST 请求将能够绕过此检查。虽然这很可能不会导致严重的问题,但它非常难看。
          • 通过addslashes 神奇地实现安全性,并且您已经在编辑中专注于安全性。哎呀,太可怕了。同样正如 ThiefMaster 所写,您不会将输入变量名称列入白名单。这太讨人喜欢了。你从我这里得到 -1。
          猜你喜欢
          • 2014-07-06
          • 1970-01-01
          • 2019-06-06
          • 2020-07-16
          • 2015-06-12
          • 1970-01-01
          • 2012-03-26
          • 1970-01-01
          相关资源
          最近更新 更多