2014-10-27 52 views
0

從多個具有相同名稱屬性的複選框獲取$ _POST數據的最佳解決方案是什麼?沒有使用類似這樣的東西;

<input type="checkbox" name="some_value[]"> 
<input type="checkbox" name="some_value[]"> 

我使用Unbounce做一個登陸頁面,他們目前不提供name屬性設置爲自定義的東西,包括「[]」來表示對PHP把值的任何方式數組。

+0

爲什麼你不能給他們不同的名字? – danmullen 2014-10-27 22:20:23

+0

等號意味着,這些複選框是「鏈接」的。如果您使用收音機而不是複選框,則尤其如此。無論如何,我沒有看到任何爲什麼你應該避免這樣的名字。 – DarkSide 2014-10-27 22:21:58

+0

使用Unbounce,我不能改變他們的名字是唯一的。 – 2014-10-27 22:26:05

回答

1

您可以閱讀使用像自己的POST數據:

$formData = file_get_contents('php://input'); 

然而,解析了「應用程序/ x-WWW的形式,進行了urlencoded」,你要找到一個第三方庫因爲所有本地PHP選項都會顯示相同的行爲(後來的鍵會覆蓋較早的鍵),您可以使用普通的$ _POST結構找到它們。

下面是一個parse_str()用戶地版本的「玩具」實現,其中'重複'值被轉換爲數組。我並沒有權利要求該代碼的質量來處理「應用程序/ x-WWW的形式,進行了urlencoded」數據的所有可能的邊緣情況:

<?php 

$form = file_get_contents('php://input'); 

$arg_sep = ini_get('arg_separator.input'); 
$max  = ini_get('max_input_vars'); 
$token = strtok($form, $arg_sep); 
$data = []; 
while (false !== $token && $processed < $max) { 
    if (false !== ($pos = strpos($token, '='))) { 
     list($key, $value) = explode('=', $token); 
     $value = urldecode($value); 
     if (strlen($key)) { 
      if (isset($data[$key])) { 
       if (is_array($data[$key])) { 
        array_push($data[$key], $value); 
       } else { 
        $data[$key] = [$data[$key], $value]; 
       } 
      } else { 
       $data[$key] = $value; 
      } 
     } 
    } 
    $token = strtok($arg_sep); 
    ++$processed; 
} 

var_dump($data); 

爲了便於比較,這裏是PHP的內部膽量實現 - 請注意,除此之外還有更多,但這是鍵/值解析邏輯的核心:

switch (arg) { 
      case PARSE_GET: 
      case PARSE_STRING: 
        separator = (char *) estrdup(PG(arg_separator).input); 
        break; 
      case PARSE_COOKIE: 
        separator = ";\0"; 
        break; 
    } 

    var = php_strtok_r(res, separator, &strtok_buf); 

    while (var) { 
      val = strchr(var, '='); 

      if (arg == PARSE_COOKIE) { 
        /* Remove leading spaces from cookie names, needed for multi-cookie header where ; can be followed by a space */ 
        while (isspace(*var)) { 
          var++; 
        } 
        if (var == val || *var == '\0') { 
          goto next_cookie; 
        } 
      } 

      if (++count > PG(max_input_vars)) { 
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input variables exceeded " ZEND_LONG_FMT ". To increase the limit change max_input_vars in php.ini.", PG(max_input_vars)); 
        break; 
      } 

      if (val) { /* have a value */ 
        size_t val_len; 
        size_t new_val_len; 

        *val++ = '\0'; 
        php_url_decode(var, strlen(var)); 
        val_len = php_url_decode(val, strlen(val)); 
        val = estrndup(val, val_len); 
        if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len TSRMLS_CC)) { 
          php_register_variable_safe(var, val, new_val_len, &array TSRMLS_CC); 
        } 
        efree(val); 
      } else { 
        size_t val_len; 
        size_t new_val_len; 

        php_url_decode(var, strlen(var)); 
        val_len = 0; 
        val = estrndup("", val_len); 
        if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len TSRMLS_CC)) { 
          php_register_variable_safe(var, val, new_val_len, &array TSRMLS_CC); 
        } 
        efree(val); 
      } 
next_cookie: 
      var = php_strtok_r(NULL, separator, &strtok_buf); 
    }