• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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",需要引入才能用。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Php的编译与配置思路发布时间:2022-07-10
下一篇:
PHP socket 编程中的超时设置发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap