PHP在微信小程序项目中遇到的坑,解决方法

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函数返回为空,又不报错,查了好久,在网上看到解决方法,就是这个路径问题;
还有很多以后在写了,写的不好地方,给我留言!谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_37616043/article/details/80848305
今日推荐