使用具有相同名称属性的多个复选框获取$ _POST数据的最佳解决方案是什么? WITHOUT 使用类似的内容;
<input type="checkbox" name="some_value[]">
<input type="checkbox" name="some_value[]">
我正在使用Unbounce制作登录页面,他们目前不提供任何方法将name属性设置为自定义,包括'[]'以表示PHP将值放入数组中。< / p>
答案 0 :(得分:1)
您可以使用以下内容自行阅读POST数据:
$formData = file_get_contents('php://input');
但是,对于解析“application / x-www-form-urlencoded”,您需要在某处找到第三方库,因为所有本机PHP选项都表现出相同的行为(后面的键覆盖了之前的键) )你会发现正常的$ _POST结构。
这是用户级版本parse_str()的“玩具”实现,还有“重复”值转换为数组的额外好处。我没有声明此代码的质量来处理“application / x-www-form-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);
}