小记parse_str

来源:互联网 发布:阿里云服务器外网ip 编辑:程序博客网 时间:2024/06/07 17:19

在官网这么是这么说明此函数的,将字符串解析成多个变量,常用于解析前端传过来的字符串解析为数组,如下面的例子。

$_POST['form'] = 'arr[id]=100&arr[name]=%10地区已覆盖&arr[time]=2016-12-24 15:05:59';parse_str($_POST['form']);print_r($arr);

打印输出为

Array(    [id] => 100    [name] => 地区已覆盖    [time] => 2016-12-24 15:05:59)

乍一看正常,但是,仔细看,会发现name的值不完整,%10不见了。为什么呢,再仔细看了下官网关于此函数的介绍,Note:magic_quotes_gpc 影响到了 parse_str() 这个函数的输出,和 PHP 用于填充 $_GET、 $_POST 及其他变量的机制一致。也就是此函数来解析字符串到数组时,会对字符串按GPC来处理。其实,追踪PHP源码(ext/standard/string.c)也可以看到

/* {{{ proto void parse_str(string encoded_string [, array result])   Parses GET/POST/COOKIE data and sets global variables */PHP_FUNCTION(parse_str){    char *arg;    zval *arrayArg = NULL;    char *res = NULL;    int arglen;    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &arg, &arglen, &arrayArg) == FAILURE) {        return;    }    res = estrndup(arg, arglen);    if (arrayArg == NULL) {        zval tmp;        if (!EG(active_symbol_table)) {            zend_rebuild_symbol_table(TSRMLS_C);        }        Z_ARRVAL(tmp) = EG(active_symbol_table);        sapi_module.treat_data(PARSE_STRING, res, &tmp TSRMLS_CC);    } else  {        zval ret;        array_init(&ret);        sapi_module.treat_data(PARSE_STRING, res, &ret TSRMLS_CC);        /* Clear out the array that was passed in. */        zval_dtor(arrayArg);        ZVAL_COPY_VALUE(arrayArg, &ret);    }}/* }}} */

既然知道缘由,就好着手解决了,我的办法是在前端加上jsencodeURIComponent URL编码

$('input[name=form]').val("arr[id]=" + prize_id + "&arr[name]=" + encodeURIComponent($('input[name="prize"]:checked').attr('data-name')) + "&arr[time]=" + $('input[name="prize"]:checked').attr('data-time'));

这时再用一开始的代码便可以打印出正常效果

Array(    [id] => 100    [name] => %10地区已覆盖    [time] => 2016-12-22 15:05:59)
0 0
原创粉丝点击