ThinkPHP3.1.3中,如果提交的post请求中,如果要在url中写入参数,如下面的例子:
var url = ‘/index.php?g=Manager&m=Msgwall&a=changestatus‘; var args = { ‘id‘ : id, ‘status‘ : status }; $.post(url, args, function(result){ // 返回的操作 });
因为我用的是从别处申请的虚拟服务器,并不支持PATHINFO模式,我就舍易求繁了,用传统的传参方式指定分组、模块和操作。按照一般的思路,并不想把这些信息都加到args里面,用PATHINFO模式更是这样了,但是,ThinkPHP3.1.3里面,被封装的$this->_param只能拿到id和status参数,拿不到g、m和a这些,经过搜索官网,找到了解决方案,需要找到ThinkPHP/Lib/Core/Action.class.php,把第243行修改为:
$input = array_merge($_GET,$_GET[C(‘VAR_URL_PARAMS‘)],$input);
一定要保证$input放在最后,从_param的定义来进行分析,该函数实现如下:
case ‘_param‘ : switch($_SERVER[‘REQUEST_METHOD‘]) { case ‘POST‘: $input = $_POST; break; case ‘PUT‘: parse_str(file_get_contents(‘php://input‘), $input); break; default: $input = $_GET; } if(C(‘VAR_URL_PARAMS‘) && isset($_GET[C(‘VAR_URL_PARAMS‘)])){ $input = array_merge($input,$_GET[C(‘VAR_URL_PARAMS‘)]); } break;
原来的情况下,$input只是合并了原来的$input(POST或者GET方法正统的参数)和$_GET[‘_URL_‘]的参数,而$_GET[‘_URL_‘]只包含PATHINFO格式的地址中包含的参数列表,因此,传统传递方式的参数,就无法获取传统$_GET的参数,因此,使用
$input = array_merge($_GET,$_GET[C(‘VAR_URL_PARAMS‘)],$input);
替换该语句,将$input放到最后,目的是覆盖前面可能通过URL注入的同名变量,否则$input的参数就可能被URL同名参数覆盖。
PHP开发-ThinkPHP3.1.3中无法获取post请求中的url参数的问题
原文:http://www.cnblogs.com/smarterplanet/p/3531807.html