【问题标题】:Easiest way to check if multiple POST parameters are set?检查是否设置了多个 POST 参数的最简单方法?
【发布时间】:2019-05-22 05:30:36
【问题描述】:

嗨,我想知道检查是否设置了多个 POST 参数的最简单方法。与其对通过“&&”链接在一起的多个“isset($_POST['example'])”进行长时间的 if 检查,我想知道是否有更简洁的方法。

我最终做的是创建一个数组并循环它:

  $params_needed = ["song_name", "artist_name", "song_release_date",
                "song_genre", "song_medium"];

然后我会调用下面的函数,传入 $params_needed 以检查是否设置了上面的参数名称:

  function all_params_valid($params_needed) {
     foreach ($params_needed as $param) {
        if (!isset($_POST[$param])) {
           error("Missing the " . $param . " variable in POST request.");
           return false;
        }
     }
     return true;
  }


  if (all_params_valid($params_needed)) {
     $song_name = $_POST["song_name"];
     $artist_name = $_POST["artist_name"];
     $song_release_date = $_POST["song_release_date"];
     $song_genre = $_POST["song_genre"];
     $song_medium = $_POST["song_medium"];

     ...
  }

但是,当我这样做时,它会卡在第一个索引上并显示“缺少 song_name 变量...”,尽管它实际上包含在 POST 请求中,我不确定为什么会发生这种情况。预期的行为是它继续前进并告诉我下一个参数“artist_name”未设置,但这不会发生。

【问题讨论】:

  • var_dump() 你的 $_POST - 你的键值都存在吗?
  • song_name 要么丢失、有错字、有大写字母,要么由于某种原因有多余的间距。 echo '<pre>'; var_dump($_POST); echo '</pre>'; 将揭示您的问题。
  • 也许您没有发送 POST 请求?检查您的$_GET
  • 如果你想在找到第一个丢失的参数后返回false,你的函数没有问题。这个问题似乎与在 $_POST 中没有得到你所期望的更相关,这可能是之前 cmets 中的原因之一。
  • isset 确实采用多个参数,例如isset($_POST["song_name"], $_POST["artist_name"], $_POST["song_release_date"], ...) 有点干净

标签: php for-loop post isset


【解决方案1】:

我个人喜欢在这个问题上使用array_diff

PHP array_diff documentation

您关心的是您的预期输入给定输入相同。

所以你可以像这样使用array_diff

  $params_needed = ["song_name", "artist_name", "song_release_date",
                "song_genre", "song_medium"];
  $given_params = array_keys($_POST);

  $missing_params = array_diff($params_needed, $given_params);

  if(!empty($missing_params)) {
    // uh oh, someone didn't complete the form completely...
  }

【讨论】:

  • 我喜欢这种方法,一直以来我一直使用 array_map 来实现这一点。很好的答案!
  • 我非常喜欢这个答案,但我认为应该是 array_diff($params_needed, $given_params);因为它“返回一个数组,其中包含 array1 中不存在于任何其他数组中的所有条目。” php.net/manual/en/function.array-diff.php
  • @JoshuaMaza 已修复。感谢您指出了这一点!很难记住所有这些 PHP 怪癖
  • Dylan Pierce - 将 if(!empty($missing_params) { 更改为 if(!empty($missing_params)) { 加上一个额外的 ) 所以它是有效的语法。伟大的解决方案,看起来比大量的 issets 更好。
【解决方案2】:

我的处理方法是使用 array_map(),这样我就可以返回数组中的所有值,同时检查它是否isset()

PHP 5.6 >

$args = array_map(function($key) {
    return isset($_POST[$key]) ? array($key => $_POST[$key]) : someErrorMethod($key);
}, ["song_name", "artist_name", "song_release_date", "song_genre", "song_medium"]);

PHP 7+

$args = array_map(function($key) {
    return array($key => $_POST[$key] ?? someErrorMethod($key));
}, ["song_name", "artist_name", "song_release_date", "song_genre", "song_medium"]);

您的错误方法可能如下所示:

function someErrorMethod($key) { die("$key cannot be empty."); }

在您的$args 变量内,您将拥有一个键 => 值数组。例如,

echo $args['song_name'];

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多