检查是否设置了多个POST参数的最简单方法?

时间:2018-12-21 19:34:30

标签: php for-loop post isset

嗨,所以我想知道检查是否设置了多个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"];

     ...
  }

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

2 个答案:

答案 0 :(得分:1)

我如何使用array_map()来实现此目的,因此我可以返回数组中的所有值,同时检查其是否UserProfileSerializer

PHP 5.6>

isset()

PHP 7 +

$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"]);

您的错误方法可能看起来像这样:

$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

答案 1 :(得分: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...
  }