PHP在微信小程序项目中遇到的坑,解决方法
第一个坑:在为了获取用户名的特殊字符,我用urlencode转化在保存到数据库里,读取用户用户名时用urldecode解析。然而在保存urlencode转化后的用户名,因为数据库字段长度设置短了而转化后的用户名长了,导致保存数据不完全,在解析时出错了,导致把赋值的数组或字段清空;解决就是加长字段长度;
例如:$shop_auction=M('shop_auction')->field('user_id,total_money,endtime,action_status')->where($wh)->order('total_money desc')->select();
foreach ($shop_auction as $k => $vk) {$userListd = M('user')->field("avater,id,username,remak_avater,remak_username")->where('id='.$vk['user_id'])->find();
if($userListd['remak_username']){
$shop_auction[$k]['username'] = urldecode($userListd['remak_username']);
}else{
$shop_auction[$k]['username'] = urldecode($userListd['username']);
}
if($userListd['remak_avater']){
$shop_auction[$k]['avater'] = $userListd['remak_avater'];
}else{
$shop_auction[$k]['avater'] = $userListd['avater'];
}
$shop_auction[$k]['total_money'] = $vk['total_money'];
}
因为 urldecode($userListd['remak_username'])解析失败导致 $shop_auction为空;
第二个坑:
DES加密,网上有很多现成代码;例如: https://www.jb51.net/article/112533.htm 这个PHP后台解密前端js加密的数据。完整代码自己看网站,因为我是直接引用代码,在解密过程中总是解密失败,然后看了很多其他网站代码和寻找问题解决,弄了一天,不断测试,才发现自己采坑了,主要是$key这个秘钥长度必须大于8,我也希望大家注意了,不是代码不好用,是我们没理解别人代码;有了DES加密在数据传输就安全多了,就不怕别人截取数据,对网站小程序进行攻击,特别是提现,支付类的;最容易受到攻击;还有就是有些编辑器对 mcrypt不支持,要换低点版本的编辑器千万不要信网上,说PHP里面缺少一个文件然后去下载,那是骗人的;
第三个坑:
1、$infoLists=M('user')->field('id,amount')->where('openid='.$openid))->find();
2、$infoLists=M('user')->field('id,amount')->where(array('openid'=>$openid))->find();
上面 1、SQL语句有时报错$openid查询找不到数据,所以我一般用二这种方法,就不会出现这种问题了,
这只针对于字段比价长的。比如订单号order_sn、用户openid;
第四个坑:
为了保证数据的完整,一般会用到数据库事物,有时忘记写$model->commit,事物无法提交,导致数据无法,更新、删除、保存。我开始找是否是SQL语句的问题,找了很久,才发现,原来事物没有提交。一个疏忽,一个小问题导致用了很长时间查找,也许这就是程序员走的路,一个一坑踩过来了;
第五个坑:
微信小程序支付:
/**
* _request():发出请求
* @param curl:访问的URL
* @param https:安全访问协议
* @param method:请求的方式,默认为get
* @param data:post方式请求时上传的数据
*/
private function request($curl, $https=true, $method='get', $data=null)
{
$ch = curl_init();//初始化
curl_setopt($ch, CURLOPT_URL, $curl);//设置访问的URL
curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
if($https)
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不做服务器认证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不做客户端认证
}
//退款设置证书 start
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, DOC_ROOT.$this->config['sslcert_path']);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, DOC_ROOT.$this->config['sslkey_path']);
//退款设置证书 end
//
if($method == 'post')
{
curl_setopt($ch, CURLOPT_POST, true);//设置请求是POST方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置POST请求的数据
}
$str = curl_exec($ch);//执行访问,返回结果
curl_close($ch);//关闭curl,释放资源
return $str;
}
红色的代表是文件路径地址,千万不要写成URL网站路径,我开始理解错了,导致request函数返回为空,又不报错,查了好久,在网上看到解决方法,就是这个路径问题;
还有很多以后在写了,写的不好地方,给我留言!谢谢。