【PHP开发】ThinkPHP3.1.3问题集及解决方法
Outline:
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",需要引入才能用。
【PHP开发】ThinkPHP3.1.3问题集及解决方法的更多相关文章
- Android开发华为手机无法看log日志解决方法
Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- Android开发环境搭建时遇到问题的解决方法
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/linux_loajie/article/details/33823637 Android开发环境搭建 ...
- HTML5外包注意事项-开发HTML5游戏的九大坑与解决方法剖析
随着移动社区兴起,势必带动HTML5的革命.未来一两年内,HTML5移动游戏必将呈现大爆发趋势. 以下是整理的HTML5游戏研发.市场趋势以及渠道布局和技术解决方案的内容.希望大家能从本文中找到对HT ...
- 〖Android〗从Android Studio转为Eclipse开发项目运行程序闪退的解决方法
很久没有撸Android App开发了- 最近把一个月前通过反编译.二次修改的Android SSHD项目进行简单修改一下: 突然发现迁移项目时,报了一个错误,同时还出现了闪退情况: - ::): t ...
- 关于DE2-115 FPGA开发板无法烧写程序的解决方法
友晶科技推出的DE2-115 FPGA开发板,有时候莫名奇妙,无法烧写或者固化程序.利用JTAG 向DE2-115开发板烧写.sof文件失败,并提示以下错误,如图1和图2所示 图1 图2 解决方法:只 ...
- (转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法
本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jd ...
- 在英文Win7操作系统上部署C#开发的Web系统出现乱码的解决方法
今天,迁移机器,把一个使用C#开发的Web系统部署到一台英文版Win7操作系统上,部署好以后,系统可以登录,只是网页上出现汉字乱码. 在这台电脑上,打开Word等文本编辑器,是可以正常输入.显示中文的 ...
- 前端webview开发中遇到的一些问题及其解决方法
最近做了一个webview中的兑换页面,本来以为很简单,想不到遇到了远远超出预期数量的BUG,记下来,以备后患. 1 inline-block元素折行 BUG描述:现在我有三个DIV,要在一列等宽排列 ...
随机推荐
- FTK应用程序编程接口(API)手册-1【转】
转自:http://blog.csdn.net/absurd/article/details/6702047 框架函数 框架函数支撑FTK的主体,它负责初始化应用程序,启动主循环和退出主循环.它对任何 ...
- 案子前申請 EVB board (Evaluation Board)
在跑案子前, 需向各 component vendor 申請 EVB board, 其中也包含 mosfet , 以利做實驗, spec 有可能會寫錯 或不清楚, 所以需要使用 EVB board 檢 ...
- Windows远程命令执行0day漏洞安全预警
网站安全云检测这不是腾讯公司的官方邮件. 为了保护邮箱安全,内容中的图片未被显示. 显示图片 信任此发件人的图片 一.概要 Shadow Brokers泄露多个Windows 远程漏洞利用工具 ...
- 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)
一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...
- js 拦截全局 ajax 请求
你是否有过下面的需求:需要给所有ajax请求添加统一签名.需要统计某个接口被请求的次数.需要限制http请求的方法必须为get或post.需要分析别人网络协议等等,那么如何做?想想,如果能够拦截所有a ...
- Fresco,Facbook强大的图片加载框架
项目git地址:https://github.com/facebook/fresco Fresco是 facebook推出的一款强大的图片加载的框架:主要有Image Pipeline和Drawees ...
- PE经典DIY案例1:全解开方案让量产PE也能
更新说明:因未来的uefi似乎并不能识别并引导ud区,但能识别和引导量产和u+B+隐藏或高端隐藏区,故解决量产PE对u+B+隐藏区的支持,并增加对UEFI启动支持,已经成为PE制作的最主流技术. PE ...
- 经验分享 | Burpsuite抓取非HTTP流量
使用Burp对安卓应用进行渗透测试的过程中,有时候会遇到某些流量无法拦截的情况,这些流量可能不是HTTP协议的,或者是“比较特殊”的HTTP协议(以下统称非HTTP流量).遇到这种情况,大多数人会选择 ...
- 给控件做数字签名之一:将控件打包为Web发布包 [转]
微软代码签名证书使用指南 http://www.wotrust.com/support/signcode_guide.htm 签名重要性:http://www.wotrust.com/FAQ/whyS ...
- 时间迭代和BigDecimal操作
常规小操作的代码: import java.math.BigDecimal; import java.sql.Timestamp; import java.text.SimpleDateFormat; ...