zoukankan      html  css  js  c++  java
  • 【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",需要引入才能用。

  • 相关阅读:
    JDBC 连接 MySQL 数据库
    通过java类的反射机制获取类的属性类型
    反射机制实例化类,并获取类中的属性、方法、和构造器
    java8u162反射机制的一个BUG
    Java反射关于getDeclaredMethods()和getMethods()的区别
    Java反射
    30天C#基础巩固------了解委托,string练习
    30天C#基础巩固------读写流(StreamWrite/StreamReader)
    30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集
    30天C#基础巩固------面向鸭子编程,关于string和File的练习
  • 原文地址:https://www.cnblogs.com/smarterplanet/p/3531807.html
Copyright © 2011-2022 走看看