从没有名称密钥的多个复选框中获取$ _POST,包括' []'

时间:2014-10-27 22:19:08

标签: php post

使用具有相同名称属性的多个复选框获取$ _POST数据的最佳解决方案是什么? WITHOUT 使用类似的内容;

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

我正在使用Unbounce制作登录页面,他们目前不提供任何方法将name属性设置为自定义,包括'[]'以表示PHP将值放入数组中。< / p>

1 个答案:

答案 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);
    }