基础问题记录(php篇)

一.php后端数据在js的应用(2018/12/18)
后端处理后,将相关的数据传到了后端
例如:

 $link = 'http://baidu.com';
 $this->assign('link',$link);   //分配到前端
 return $this->fetch();

想将过来的数据直接在js里面用(之前的做法是将对应的后端传过来的值放到隐藏域后再用js获取对应的值,其实是非常的多余的,主要还是我的问题)

var link = "{$link}";
console.log(link);   //打印查看,就是这么的简单。

二.php后端接受数据(一次性接受所有的数据)(2018/12/20)
我一般都是一个一个name来获取,过滤操作啥的

$users_params = array();
$users_params['createtime']    = time();
$users_params['username']      = trim( input('post.username','','htmlspecialchars') );
$users_params['depart_id']     = trim( input('post.depart_id','','htmlspecialchars') );

改进如下:
在前端用数组的形式命名这个name的值,例:row[‘username’] , row[‘depart_id’] 等
这样子,我们在后端就可以一次接受完所有的数据,也就是接受这个row的数据即可

$params = $this->request->post("row/a", [], 'strip_tags');    //在这里直接可以过滤,避免过多重复的操作了。
$params = array_intersect_key($params, array_flip(array('merchant_name', 'merchant_address', 'parent_id','business_license','id_card' ,'is_branch' ,'order_alone'))); //array_intersect_key返回交集,方便操作

三.接受后的数据验证(这里主要是用的是tp5的validate验证机制)(2018/12/20)
1.自己写验证也可以,不过这样就不能复用,代码重复比较高,不美观
2.使用validate验机制,基础的看文档吧,这里只记录具体的用法
php文件

$accountValidate  = Loader::validate('accounts');    //实例化validate
$re  = $accountValidate->scene('add')->check($account_data);   //选择场景并check方法检查传入的数据是符合定义的规则
if(!$re){
    return $this->error($accountValidate->getError());
     }

对应的validate文件夹里的account.php文件写的是规则(复杂的规则去看文档吧)

<?php
namespace app\admin\validate;
use think\Validate;
class Accounts extends Validate
{
    /**
     * 验证规则
     */
    protected $rule = [
        'owner_m_id|商户号'   =>'require',
        'name|账户名称'       => 'require|length:2,20',
        'code|账户号'         => 'require|length:2,50',
        'description|描述'    => 'require|length:0,200',
    ];
    /**
     * 提示消息
     */
    protected $message = [
    ];
    /**
     * 验证场景
     */
    protected $scene = [
        'add'  => ['m_id','name','code','description'],//场景需要自己去加了
    ];
}

四.php中处理出树状图结构数据(具体效果不贴图,懒癌)(2018/12/20)
第①种(这是我项目实际用的一个函数):

    /**
     * merchant树状图结构
     * @return mixed
     */
    public function collectionMerchantTree(){
        $merchantList = collection(model('merchant')->field('mid as id,merchant_name as name,parent_id as pid')->where('status','1')->where('is_show',1)->select())->toArray();//改成自己的查询条件即可
        Tree::instance()->init($merchantList);
        $this->merchantList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0),'name');
        $merchantData=array();
        foreach($this->merchantList as $k=>$v) {
            $merchantData[$v['id']] = $v['name'];
        }
      

第②种(这是在fastadmin框架里面找出来的处理成树状结构的数据结构的函数,也可以直接拿来用)

function getTree($list,$pid=0,$itemprefix = '') {
    static $icon = array('│', '├', '└');
    static $nbsp = "&nbsp;";
    static $arr = array();
    $number = 1;
    foreach($list as $row) {
        if($row['pid'] == $pid) {
            $brotherCount = 0;
            //判断当前有多少个兄弟分类
            foreach($list as $r) {
                if($row['pid'] == $r['pid']) {
                    $brotherCount++;
                }
            }
            if($brotherCount >0) {
                $j = $k = '';
                if($number == $brotherCount) {
                    $j .= $icon[2];
                    $k = $itemprefix ? $nbsp : '';
                }else{
                    $j .= $icon[1];
                    $k = $itemprefix ? $icon[0] : '';
                }
                $spacer = $itemprefix ? $itemprefix . $j : '';
                $row['name'] = $spacer.$row['name'];
                $arr[] = $row;
                $number++;
                getTree($list,$row['id'],$itemprefix . $k . $nbsp);
            }
        }
    }
    return  $arr;
}

五.php后端ajax处理相关事宜(2018/12/20)
自己写的一个方法:

    public function merchantAjax(){
        if($this->request->isAjax()){
            $merchantModel = new Merchant();
            $merchantData = $merchantModel->getMchantList();
            $merchantData = transformerTree($merchantData); //得到相关的数据,需要把相关的数据放置到前端的ajax里面处理
            if($merchantData){
                exit(json_encode(array('code'=>200,'data'=>$merchantData)));   //这里使用json_encode进行json编码处理
            }else{
                exit(json_encode(array('code'=>-1,'data'=>'请求数据不存在!')));
            }
        }else{
            return $this->error('连接失败!');
        }
    }

语法①: json_encode ( $value),对变量进行JSON编码
将我们需要的变量转换成json字符串,方便传到前端使用。

$book = array('a'=>'xiyouji','b'=>'sanguo','c'=>'shuihu','d'=>'hongloumeng');
$json = json_encode($book);
echo $json;
浏览器打印实例结果:{"a":"xiyouji","b":"sanguo","c":"shuihu","d":"hongloumeng"}

语法② json_decode ($json,‘false/ture’),JSON数据进行解码,转换为PHP变量

$book = array('a'=>'xiyouji','b'=>'sanguo','c'=>'shuihu','d'=>'hongloumeng');
        $json = json_encode($book);   //模拟一个json格式的数据
        $array = json_decode($json,TRUE);    //为true转换为数据
        $obj = json_decode($json);
        var_dump($array);
        var_dump($obj);

浏览器打印出的结果如下:
array(4) { ["a"]=> string(7) "xiyouji" ["b"]=> string(6) "sanguo" ["c"]=> string(6) "shuihu" ["d"]=> string(11) "hongloumeng" }
object(stdClass)#2 (4) { ["a"]=> string(7) "xiyouji" ["b"]=> string(6) "sanguo" ["c"]=> string(6) "shuihu" ["d"]=> string(11) "hongloumeng" } 

六.php同步接口数据(2018/12/20)
说通俗点就是,拼接接口的所需参数,根据参数获取自己想要的数据,并将数据记录到自己的数据表中即可

/**
 * 同步推广员数据下来
 */
public function add(){
    $promoterModel = new \app\admin\model\Promoter();
    //组装必要的参数
    $name = config('synchronize.name');     //远程接口账户(参数1)
    $pwd  = config('synchronize.pwd');      //远程接口密码(参数2)
    $url  = config('synchronize.url');      //URL(参数3)
    $page = config('synchronize.page');     //页数(参数4)
    $pageszie = config('synchronize.pageszie');   //(参数5)
    $timeStamp = time();
    //$maxid第一次获取为1,之后取最后一条参数的id值,这样就不需要循环了
    $maxid = $promoterModel->getLastValue();
    if(!$maxid){
        //无数据,初始值为1
        $maxid = 1;
    }
    $token = md5($name.$pwd.$timeStamp);
    $_URL  = $url.'?name='.$name.'&token='.$token.'&TimeStamp='.$timeStamp.'&act=synchro&page='.$page.'&pageszie='.$pageszie.'&maxid='.$maxid;
    //获取数据
    $r_data = $promoterModel->httpGet($_URL);      //根据这个httpGet()方法去访问这个接口,其下面的都是数据库操作了
    $res = json_decode($r_data,1);
    if($res['code'] != '200'){
        if($res['code'] == '-404'){
            $this->error('已经没有更多数据了!');
        }
        $this->error('获取数据失败!');
    }
    //新增入库到我们的推广员表中去的数据
    $insert_data = $res['data'];
    foreach($insert_data as $kkk=>$vvv){
        $insert_data[$kkk]['name'] = $insert_data[$kkk]['username'];
        $insert_data[$kkk]['create_time'] = $insert_data[$kkk]['post_date'];
        unset($insert_data[$kkk]['username']);
        unset($insert_data[$kkk]['post_date']);
    }
    foreach($insert_data as $i=>$j){
        $now_data = $insert_data[$i];
        $all_res  = $promoterModel->getAllPromoter();
        $arr = array();
        foreach($all_res as $kk=>$vv){
            array_push($arr,$all_res[$kk]['code']);
        }
        if(!in_array($insert_data[$i]['code'],$arr)){
            Db::name('promoter')->insert($insert_data[$i]);
        }
    }
    $this->redirect('/admin/merchants/promoter/index');
}
    /**
     * 请求
     * @param unknown $url
     * @return mixed
     */
    public function httpGet($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $temp = curl_exec($ch);
        return $temp;
    }

七.php同步接口数据(2018/12/25)
目的:PHP实现将textarea的值根据回车换行拆分至数组
textarea回车换行为 \r\n

$keyword_list = trim($_REQUEST['keywords']);
$keyword_arr = explode("\r\n", $keyword_list);

这个地方需要注意是要去除textarea 前后的空格,否则会多出一个。
或者使用explode也是可以的
只是不能用\r\n只能用双引号,不能用单引号

八.htmlspecialchars_decode函数(2018/12/25)

用于富文本框的反序列化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值