【问题标题】:Shorting isset POST? [duplicate]做空isset POST? [复制]
【发布时间】:2013-05-11 23:13:49
【问题描述】:

我有很多 isset 检查:

if (isset($_POST['name']) && isset($_POST['day']) && isset($_POST['month']) && isset($_POST['year']) && isset($_POST['email']) && isset($_POST['email2'])&& isset($_POST['pass']) && isset($_POST['pass2']))
{

有办法缩短吗?

$isset = array
(
    'name', 'day', 'month', 'year',
    'email', 'email2', 'pass', 'pass2'
);

foreach ($isset As $set)
{
    if (!isset($_POST[$set]) || empty($_POST[$set]))
    {
        echo 'error';
        break;
    }
}

正确吗?

【问题讨论】:

  • 这是检查每个帖子的正确方法
  • 你总是可以使用!empty() 但是这会返回错误值的误报
  • 和isset()一样吗?
  • 除非您将所有内容命名为相同的名称并在末尾增加数字;你得到的方法是检查这些变量的最短方法。
  • 不要使用empty(),尤其是在处理数字时。 empty(0) 在 php 中实际上是 TRUE。

标签: php


【解决方案1】:

您可以只使用循环和empty

$keys = array('name', 'day', 'month');  // ...

foreach ($keys as $key) {
  if (empty($_POST[$key])) {
    // fail
    break;
  }
}

或者你可以使用array_diff_key():

if (array_diff_key(array_flip($keys), $_POST)) {
  // fail (some keys not present in $_POST)
}

【讨论】:

  • 看看我的编辑,对吗?
  • 是的,但请注意empty 也将匹配0(可能会因复选框而失败)。如果这是一个有效值,您应该只坚持isset(),稍后再进行单独检查。另外,如果你使用emptyisset() 是多余的
  • 所以这意味着我可以使用 empty() 代替?
  • 是的,但我建议您先查看empty 的手册页,看看哪些值被视为“空”
  • empty 与第二种方法一起使用:array_diff_key(array_flip($keys), array_filter($_POST))array_filter 将丢弃空的项目)
【解决方案2】:

isset() 可以接受多个参数,因此您可以像这样简单地缩短它。

if (isset($_POST['name'], $_POST['day'], $_POST['month'], $_POST['year'], $_POST['email'], $_POST['email2'], $_POST['pass'], $_POST['pass2']))

PHP 文档:http://php.net/manual/en/function.isset.php

【讨论】:

    【解决方案3】:

    定义一个这样的函数:

    function getPost($key, $default = null) {
        if (isset($_POST[$key])) {
            return $_POST[$key];
        }
        return $default;
    }
    

    然后你可以跳过isset验证。如果没有sucho值,默认返回null

    【讨论】:

    • 如果您这样做,您将只能为每个键/函数对获得一个返回值。那你会怎么用这个? Foreach($_POST as $key) $SomeArray[$key] = getPost($key, $default)?这里缺少的东西是,即使 $_POST 值为 "" 它仍然在技术上设置。因此,从字面上看,每个 post 值都会在该函数中返回 true。您真正要做的就是将 $_POST 更改为 $Something,并且键将是相同的,具有相同的值。
    【解决方案4】:

    如果您从输入表单发送这些并且您的默认值属性是 value="" 那么它仍然会在 $_POST 中设置。

    例如,如果上一页有:

    <input type="text/css" id="email" name="email" value="" />
    

    然后如果用户将其留空,isset($_POST['email']) 将返回 true,并且 $_POST['email'] 的值为 ""。没用吧?

    试试这个。

    $c = 0;
    foreach($_POST as $key => $value)
    {
    $value = trim($value);//Makes sure there's no leading, or ending spaces.  Safe to guard against a string that is " " instead of "".
    if(strlen($value) > 0)
        {
        $c++;
        }
    else
        {
        echo "$_POST['" . $key . "'] has a problem.";
        }
    break;
    }
    

    那么对于您想到的任何条件,您的新 if 语句可能是:

    if($c == 8)//8 being the number of keys you're expecting to not be "" or null.
    {
    //Your conditions.
    }
    

    记住这一点很好。你只测试了 8 个数组键,但是如果你有 800 个呢?这样的事情将是必要的。

    【讨论】:

      【解决方案5】:

      取决于你在做什么,如果是设置一个值,三元运算符可以创造奇迹:

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

      在那一行之后,$day 总是被设置并且你只用 if($day) 进行测试。

      如果有很多值,你总是可以循环运行这个赋值:

      foreach(array('day','month','name') as $var)
      {
        isset($_POST[$var])?$$var=$_POST['$var']:$$var='';
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 2012-11-18
        • 2013-09-07
        • 1970-01-01
        • 2016-04-06
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多