【PHP开发】ThinkPHP3.1.3问题集及解决方法

Outline:

无法获取post请求中的url参数的问题

中文存入数据表后为空字符串

1. 无法获取post请求中的url参数的问题

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放在最后,这样就可以了。

但是,过了一个年,也不知道改了什么,突然又不行了,经过调试发现isset($_GET[C('VAR_URL_PARAMS')])这个地方返回了false。

所以要进一步修改,在原if后面加上else,内容如下:

$input = array_merge($_GET,$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同名参数覆盖。

这一块的最终代码变为:

if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){
    $input = array_merge($_GET,$_GET[C('VAR_URL_PARAMS')],$input);
} else {
    $input = array_merge($_GET,$input);
}

2. getlastsql()可显示正确的SQL语句,但中文存入数据表后为空字符串

这个是由于编码问题造成的,用getlastsql()可以看到正确的SQL输出,但是查看却发现是GBK编码,而数据表是UTF-8,因此存数据出现问题。

解决方法是:可能是表单所在页面没有指定编码,加上下面的语句即可:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

或者,如果知道提交过来的参数一定是什么编码,比如gbk,可以使用

auto_charset($content, "gbk", "utf-8");

注:我没有试过这个函数,位置在ThinkPHP/Extend/Function/extend.php中,后面的参数不写就默认是"gbk"和"utf-8",需要引入才能用。