一.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 = " ";
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)
用于富文本框的反序列化