首页
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
Search
1
NAS的简单介绍
729 阅读
2
网站环境一键部署工具推荐
505 阅读
3
tp5-模型数据处理
404 阅读
4
win10镜像
359 阅读
5
第20200225期-电脑壁纸-P10
350 阅读
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
登录
Search
标签搜索
ThinkPHP
MySQL
Laravel
PHP
API
GIT
Windows10
markdown
Web
跨域
ajax
小程序
壁纸
Linux
jsonp
try
异常
Dcat
UEFI
win10
phpfunny
累计撰写
104
篇文章
累计收到
24
条评论
首页
栏目
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
页面
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
搜索到
104
篇与
的结果
2020-03-02
关于success在frameset框架中跳转套娃问题
清除tp中默认session作用域//检查是否登录public function __construct(Request $request){ parent::__construct($request); if(!session('?userid','','')){ $this->error('请先登录!','index/login/login'); } } session('名称',‘值’,‘前缀’)设置前缀为空字符串随之也修改session方法中protected function success($msg ='',$url=null,$data='',$wait=3,array $header=[],$parent='')将$result=[...]参数加入'parent'=>$parent,在最后一个参数加入$parent=''session('成功','index',[],3,[],'parent');最后一个参数为跳转的方式在$result中添加'parent'=>$parent,修改session作用域这一步骤可以省略,目的是避免session中多个作用域冲突修改跳转模板参数模板地址:thinkphp/library/tpl/dispatch_jump.tpl在location.href = href;代码前加入判断<?php echo($parent?$parent.'.':'')?>来根据session(‘’,‘’,‘parent’)来决定跳转的方式。同样error方法还有点击跳转也要加点击跳转的a标签加 target="_parent"总结success的跳转默认是在当前框架中子框架中跳转页面,想要跳出整个框架,需要用到js/jq的跳转代码location.href前面加上parent.这样就可以跳出框架的限制。附加-其他解决方式<script> if(window.top!=window){ window.top.location.href=document.location.href; } </script>
2020年03月02日
214 阅读
1 评论
1 点赞
第20200225期-电脑壁纸-P10
=》下载地址
2020年02月25日
350 阅读
3 评论
0 点赞
2020-02-23
tp5-Token表单令牌
用途有效方式防止重复提交,以及跨站伪造请求(anti csrf)特点随机性不可预测原理原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。然后,如果应用于“anti csrf攻击”,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。用法在表单中添加<input type="hidden" name="__hash__" value="{$Request.token}" /> 或者 {:token()}在验证器中添加规则,验证是否符合protected $rule = [ '__token__' => 'require|token', ]; protected $message = [ '__token__.require' => '非法提交', '__token__.token' => '请不要重复提交表单' ];因为数据表中没有__hash__字段,要删除表单提交过来中数据中的__hash__字段控制器中使用自动逸令牌规则,调用Request类$token = $this->request->token('__token__', 'sha1'); $this->assign('token', $token);
2020年02月23日
175 阅读
0 评论
0 点赞
2020-02-22
tp5-验证器
验证器验证器可以利用写好的规则进行快速的验证并且提示出错误信息验证使用独立的think\Validare类//任何时候,都可以使用Validate类进行独立的验证操作 $validate = new Validate([ 'name' => 'require|max:25', 'email' => 'email' ]); $data = [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ]; if (!$validate->check($data)) { dump($validate->getError()); }验证使用验证器进行验证//定义一个\app\index\validate\User验证器类用于User的验证 namespace app\index\validate; use think\Validate; class User extends Validate { protected $rule = [ 'name' => 'require|max:25', 'email' => 'email', ]; }//在需要进行User验证的地方,添加如下代码即可: $data = [ 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com' ]; $validate = Loader::validate('User'); if(!$validate->check($data)){ dump($validate->getError()); } //Loader-加载|check-校验//使用助手函数实例化验证器 $validate = validate('User');验证规则设置规则详情见tp5官方开发手册规则定义在$rules=['name'=>'require'];中使用多个规则有两种方法可供选择1.使用管道符'name'=>'require|max:25'2.使用数组'name'=>['require','max'=>25]属性定义protected $rule = ['name' => 'require|max:25']; protected $message = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符' ];数据验证(含批量,控制器类,闭包,自定义)$rule=['name'=>'require|max:25',]; $msg=['name.require'=>'名称必填',]; $data=['name'=>'admin123']; //普通验证 $validate=new Validate($rule,$msg); $result=$validate->check($data); //批量验证 $validate=new Validate($rule,$msg); $result=$validate->batch()->check($data); //使用定义的验证器验证 $validate = Loader::validate('User'); if(!$validate->check($data)){ dump($validate->getError()); } //闭包函数验证 $validate = new \think\Validate([ 'name' => function($value,$data) { //第一个参数是当前字段值,第二个参数是全部数据 return 'thinkphp'==$value ? true : false; }, ]); //自定义验证规则 class User extends Validate { protected $rule = [ 'name' => 'checkName:thinkphp', 'email' => 'email', ]; protected $message = [ 'name' => '用户名必须', 'email' => '邮箱格式错误', ]; // 自定义验证规则 protected function checkName($value,$rule,$data) { //$value,$rule,$data,$fieldname,$description //验证数据,验证规则,全部数据(数组),字段名,字段描述 return $rule == $value ? true : '名称错误'; } }错误信息使用默认的错误提示信息(默认)验证规则和提示信息分开(推荐)验证规则和提示信息一起定义使用多语言(不常用)验证场景场景验证只验证场景中规定的字段//验证不同场景 $rule=[...]; $msg=[...]; $data=[...]; $validate = new Validate($rule); $validate->scene('edit', ['name', 'age']); $result = $validate->scene('edit')->check($data); //使用验证器类 protected $rule=[]; protected $message=[]; protected $scene=['edit'=>['name','age']]; //然后在需要验证的地方使用scene方法 $data=[...]; $validate=new \app\index\validate\User($rule); $result=$validate->scene('edit')->check($data);也可以在定义场景的时候对某些字段的规则重新设置protected $scene=[ 'edit'=>['name','age'=>'require|number|between:1,120'], ];scene-场景验证方式:验证器验证(首选)、控制器的验证方法验证、模型类的方法验证(废弃) 验证规则:内置了非常丰富的内置规则;自定义规则; 错误信息:只需要定义信息文字即可在出现错误时返回错误信息 验证场景:根据需要在不同的情况下灵活使用已经定义好的验证规则->scene('场景') 高级的使用:批量验证(返回的错误是数组;每个字段是一个元素;每个字段只返回一个错误)、表单令牌(跨域提交csrf跨站脚本攻击)*内置规则require-必须number/integer/float-数字email-邮箱地址array-数字accepted-yes/no/1date-日期alpha-字母alphaNum-字母和数字alphaDash-字母/数字/_/-chs-汉字chsAlpha-汉字/字母chsAlphaNum-汉字/字母/数字chsDash-汉字/字母/数字/_/-activeUrl/url/ipdateFormat:format:y-m-d-指定格式日期lengthmax/minin/notIn/between/notBetweenafter:日期-之前before:日期-之后expire:开始时间,结束时间confirm:-比较另一个字段值different:-比较另一值不一致eq/same-等于某个值eqt/>=-大于等于gt/>-大于elt/<=-小于等于lt/<-小于正则上传行为其他验证控制器验证[验证方式①]验证器验证:定义一个验证器的类,在控制器中进行验证验证成功:返回true; 验证失败:返回false;如果需要获取错误信息:$validate->getError();$validate = Loader::validate('Users'); $result = $validate->check($post); //$result = $validate->batch(true)->check($post); if(!$result){ //var_dump($validate->getError()); $this->error($validate->getError()); //return json($validate->getError()); }[验证方式②]控制器的验证方法:验证成功:返回true;验证失败:返回错误信息;@param array $data 数据@param string|array $validate 验证器名或者验证规则数组@param array $message 提示信息@param bool $batch 是否批量验证@param mixed $callback 回调方法(闭包)$result = $this->validate($post,'Users'); //$result = $this->validate($post,'Users',[],true); if(true !== $result){ //var_dump($result); $this->error($result); } exit("验证通过!");
2020年02月22日
287 阅读
0 评论
1 点赞
2020-02-20
XP最终版
XP 终结版下载补丁更新至2014年4月演示图片版本说明* 系统重要补丁更新至2014-4(最后一批XP补丁)* 系统经过适当优化精减,加速增强等;* IE浏览器为IE8,未锁定主页* 集成Adobe Flash Player* 集成QQ拼音输入法4.6官方版* 集成WinRAR 5.01简体中文版* 集成常用运行库;* 本系统不含任何第三方插件、恶意软件;* 全自动无人值守安装,免序列号,免激活;* 采用 MSDN Windows XP SP3 简体中文版制作。->迅雷下载文件信息 文件: GhostXP_2014.GHO 大小: 797M MD5: DB8CF077EBE4E64B81C771F584D792DE SHA1: C69DE8FAEAD3609EC7B13C7DB668EDCF4E9262FF特别说明:该镜像由吻妻整理二次制作使用win7系统推荐使用吻妻整理镜像
2020年02月20日
260 阅读
0 评论
0 点赞
2020-02-18
tp5-模型数据处理
模型数据处理模型提供比数据库类更为强大的数据处理功能,处理数据可以更方便,更安全获取器获取器的作用是对模型的数据对象的(原始)数据做出自动处理。定义:受保护的方法,名字格式为:get+FieldName(大驼峰)+Attr,一般数据库的字段都是小写+下划线格式所以需要转换为驼峰法写法://Model $protected function getFieldNameAttr($value){ return $value; } //View <{$vo['id']}>//原本输出代码 <{$vo->id}>//输出处理过的数据 <{$vo->getAttr('id')}>//输出处理过的数据 <{$vo->getData('id')}>//不触发-输出原数据自动触发:模型的数据对象取值操作($model->field_name);模型的序列化输出操作($model->toArray());显式调用getAttr方法($this->getAttr('field_name'));场景栗子:时间日期字段的格式化输出;$protected function getFieldNameAttr($value){ return data('Y-m-d H:i:s',$value); }时间戳转本地时间data('Y-m-d H:i:s',time())本地时间转时间戳strtotime('2020-02-18')集合或枚举类型的输出;//Config 'if_show'=>[ '0'=>'下架', '1'=>'上架', '3'=>'待审核' ] //Model $protected function getFieldNameAttr($value){ $if_show=\think\Config::get('if_show'); return $if_show[$value]; }虚拟字段的输出;使用虚拟一个字段来避免获取器重名,使一个字段达到不同效果//Model-1 $protected function getTextAttr($value,$data){ return $data['id']; } //HTML <{$vo->text}>组合字段的输出;//Model $protected function getFieldNameAttr($value,$data){ return '['.$data['id'].']——'.$value; }推荐使用3,虚拟字段和4, 组合字段一起使用效果更好修改器和获取器相反,修改器的主要作用是对模型设置的数据对象值进行处理触发条件模型对象赋值;调用模型的data方法,并且第二个参数传入true;调用模型的save方法,并且传入数据;显式调用模型的setAttr方法;定义了该字段的自动完成;//对密码字段进行MD5加密后存入数据库 protected function setUpwdAttr($value){ return md5($value); }场景栗子时间日期字段的转换写入;集合或枚举类型的写入;// 极少数情况会涉及到这种方式来处理 protected function setPermissionAttr($value){ $permission = \think\Config::get('permission'); foreach($permission as $k=>$v){ if($v === $value){ return $k; } } return 0; } //Config 'permission'=[ '0'=>'有权限', '1'=>'无权限' ]数字状态字段的写入;某个字段涉及其它字段的条件或者组合写入;自动时间字段待补// 开启时间字段自动写入protected $autoWriteTimestamp = true; // 定义时间字段名protected $createTime = 'create_at'; protected $updateTime = 'update_at'; 数据类型转换待补数据自动完成[自动完成]当提交的表单(数据)中不存在某个字段,我们可以通过自动完成的方式添加上这个字段,同时会触发该字段的修改器protected $auto = ['add_time']; // 针对添加和修改的动作的时候,对表单自动添加字段; protected $insert = ['permission'=>2];// 仅针对新增的情况 protected $update = ['login_times'];// 仅针对修改的情况待补充
2020年02月18日
404 阅读
0 评论
0 点赞
2020-02-16
win10安装提示磁盘布局不受UEFI固件支持
有两种情况win10会出现错误信息:win10无法安装,磁盘布局不受UEFI固件支持1.是在升级更新时2.是在第一次安装系统时原因分析:Win10系统新增UEFI检测机制,在BIOS开启了UEFI时,如果硬盘分区表格式不是GPT,则会提示无法安装win10,也就是说UEFI+GPT或Legacy+MBR才能安装win10。解决办法:方法一:关闭UEFI1、重启系统时按Del或F2进入BIOS设置;2、以下面的BIOS为例,在Boot将Boot Mode改为Legacy Support,Boot Priority改为Legacy First,按F10保存退出;3、关闭UEFI引导,即可在MBR硬盘中安装win10系统。方法二:硬盘分区表改成GPT1、进入U盘启动盘PE系统;2、打开磁盘分区工具,比如DiskGenius,将硬盘分区表转换成GPT格式;3、预留228MB可用空间,按下Win+R输入cmd打开命令提示符;4、依次输入以下命令,按回车执行;diskpart list disk select disk 0(0是执行list disk之后显示的硬盘标识,一般是0和1) create partition efi size=100 format quick fs=fat32 create partition msr size=128 format quick fs=ntfs exit4、接着输入bcdboot C:\windows /l zh-cn,回车,C表示系统盘盘符;5、最后重启系统。上述方法来自网络,可以一试升级出现这个问题建议取消更新,尝试这些方法很麻烦,不适合计算机小白操作。在第一次安装系统出现这个问题,建议去查看启动方式和分区格式。现在一般电脑使用分区格式都是Legacy+MBR拓展:UEFI+GPT和Legacy+MBR的区别MBR和GPT分区区别MBR分区:最大支持2TB磁盘,最多4个主分区,理论支持安装windows所有版本的系统。GPT分区:允许每个磁盘有多达128个主分区,支持超过2TB的磁盘,理论仅支持win8以上的操作系统。BIOS和UEFI启动区别启动流程BIOS+MBR模式:(Legacy+MBR)1、这种启动模式兼容性较好2、可以安装32位和64位系统3、硬盘分区最大支持支持2TB4、理论支持安装Windows所有版本的系统UEFI+GPT模式:1、只能安装64位系统3、硬盘分区最大支持18EB,基本上算是无限大4、启动速度更快5、为用户提供更高级的图形界面6、支持鼠标使用7、安全启动,防止在启动前环境中运行的恶意软件和rootkit8、提供独立于CPU架构的模块化接口,也为基于EFI驱动程序(称为EBC-EFI字节码)的应用和设备提供模块化接口9、能够与BIOS并行运行10、理论仅支持win8以上的操作系统了解一下专业名词:BIOS,全称"Basic Input Output System",中文名称"基本输入输出系统"。UEFI,全称“Unified Extensible Firmware Interface”,中文名称“统一的可扩展固件接口”。GPT分区,全称“GUID Partition Table”,中文名称“全局唯一标识磁盘分区表”。MBR分区,全称“Master Boot Record”,中文名称“主引导记录”。最后通过上面的比较区别显而易见使用UEFI+GPT方法启动更符合现代系统,使用最多的启动方式还是Legacy+MBR。题外话:判断windows启动方式是uefi还是legacy bios参考->https://qqdie.com/archives/judge-windows-startup-mode-is-legacy-or-bios-uefi.html
2020年02月16日
226 阅读
0 评论
0 点赞
2020-02-12
tp5-CURD之更新2
CURD更新2讲实现方法1.Db类Db::table('user') ->where('id',1) ->update([ 'name'=>'topThink', 'email'=>'topThink@qq.com' ]);2.模型动态$user=User::get(1); $user->name='topThink'; $user->email='topThink@qq.com'; $user->save();或者$user=User::get(1); $user->save([ 'name'=>'topThink', 'email'=>'topThink@qq.com' ]);3.模型静态调用User::update([ 'name' => 'topthink', 'email' => 'topthink@qq.com', ], ['id' => 1]);区别save方法返回影响的记录数 update方法返回的是模型的对象实例模型和Db更新方法的区别是模型的更新只会更新有变化的数据,没有变化的数据是不会更新到数据库的,如果所有数据都没有变化,不会执行数据库更新操作。强制更新强制本次操作为更新与创建区分开//更新数据 $this->isUpdate(true)->allowField(true)->save($data); //创建数据 $this->isUpdate(false)->allowField(true)->save($data);更新条件1.默认主键更新//获取主键名 $this->getPk(); //$data函数必须含有主键字段 $this->isUpdate(true)->allowField(true)->save($data);2.where条件更新//$data数组中不能含有主键字段 $where=[ 'id'=>['>',676] ] $this->isUpdate(true)->allowField(true)->save($data,$where);注意:按着where条件更新时,要注意$data数组中不能含有主键字段,否则主键和where条件同时存在时,默认主键更新作为条件而where条件失效。3.主键和where同存判断$pk=$this->getPk(); if(empty($data[$pk]) && empty($where)){ $this->error="更新条件不能为空"; return false; } return $this->isUpdate(true)->allowField(true)->save($data,$where);如果主键存在,自动覆盖更新条件如果主键不存在,自动使用更新条件进行更新如果都不存在,提示错误4.数据无变化判断//控制器 $userObj=new Users(); $result=$userObj->edit($data,[]); if(false===$result){ $this->error('修改失败!原因:'.$shuxingObj->getError()); }elseif(0===$result){ $this->error('没有修改任何数据!'); }else{ return $this->fetch(); }代码栗子执行更新和删除的流程public function edit(){ //接参 //参数判断 //执行更新-执行删除 //业务跳转 }
2020年02月12日
185 阅读
0 评论
2 点赞
2020-01-14
tp5-模型层CURD1
CURD的三种写法1.第一种:Db类2.第二种:Model动态3.第三种:Model静态在写项目时,常用写法:创建和更新使用Model动态方法save()查一条和多条使用Model静态方法get(),all()删除使用Model静态方法destroy()模型类与Db类的区别:模型类具有修改器,获取器,自动完成,类型转换等高级操作,而Db类没有;异常Exceptionuse think\Exception;获取异常try{}catch(\think\Exception $e){//catch可以写多次}常用的属性:$this->error=$e->getMessage();//调用模型类的一个属性error,并将抛出的异常信息,赋值到error属性中getLastInsID()//作用是获取最后一次添加记录的主键(id)allowField(true)类似链式操作的一种写法//作用是在进行增加方法时,在用户提交的信息中将与数据库字段吻合的数据添加在异常中使用三种方法新增//测试是在控制器中,普通写法应该是在Model; try{ $data=[ 'name'=>'admin', 'pwd'=>md5(123), 'email'=>'110901678@qq.com' ] //1.使用Db类新增 $rt=Db::table('表名')->field(true)->insert($data); echo Db::getLastInsID(); //2.使用模型静态-不推荐 $rt=\app\index\model\Users::create($data); //3.使用模型动态-推荐 $rt->allowField(true)->save($data); }catch(\think\Exception $e){ echo $e->getMessage(); } 拓展:static与self在实例化的区别面向对象中new static 与new self区别:1.写在类的本身时没有区别2.写在类的继承时(例如下栗子)当红框中是self时,最后echo 的是'Text'.当红框中是static时,最后echo 的是'Zx'.
2020年01月14日
201 阅读
0 评论
0 点赞
2020-01-09
tp5-模型层
Db与模型的区别Db查询返回的数据类型为数组模型查询返回类型的是模型对象实例模型定义写法:<?php namespace app\index\model; use think\Model; class User extends Model{ }模型定义的要素:通常会继承 think\Model(或者子类) ,虚拟模型除外;一个模型可以一对一,一对多;(一个模型类对应操作的数据是一张表,模型类实例化对象就是表里的一条数据)模型名和数据表名可以不是直接对应关系空模型与Db类功能一样,但意义不用。模型定义的目的定义数据表(默认就是模型类名)定义数据表主键(默认会自动获取)定义数据库连接(默认使用数据库配置)定义数据处理逻辑(包括属性和方法)定义业务逻辑(方法)模型定义不支持数据表字段(不需要,会自动获取,并支持缓存机制)数据表前缀(不支持,模型不关心前缀)模型名对应数据表UseruserUserTypeuser_typeUserthink_userUserTypethink_user_type模型调用模型支持实例化调用和静态调用(主要是查询,查询后会返回一个模型对象实例)。实例化调用$user = new \app\index\model\User();静态调用$user = \app\index\model\User::get(1);助手函数$user = model('User');tp中表名都是按照小写加下划线的命名规则命名,表名转成类文件名和类名去掉表前缀,用驼峰法:one: ::two: :重用度高:three: :先整体后局部
2020年01月09日
142 阅读
0 评论
0 点赞
2020-01-07
tp5-分页
$list=$db->paginate('每页显示条数',true/false,['type'=>'bootstrap','var_page'=>'page','list_rows'=>15,]);一,原生分页求总数总数÷每页条数,得到一个值向上取整,得出总数limit 方法算一个起始结束位置计算分页链接二,分页实现Db类查询的时候调用paginate方法:// 查询状态为1的用户数据 并且每页显示10条数据 2.$list = Db::name('user')->where('status',1)->paginate(10); 3.// 把分页数据赋值给模板变量list 4.$this->assign('list', $list); 5.// 渲染模板输出 6.return $this->fetch(); //--------------------------------------- //模板输出{$list->paginate();}模型的分页查询代码// 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10); // 把分页数据赋值给模板变量 list$this->assign('list', $list); // 渲染模板输出return $this->fetch(); //---------模板文件输出--------------- <div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$list->render()}单独赋值分页输出// 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10); // 获取分页显示 $page = $list->render(); // 模板变量赋值 $this->assign('list', $list); $this->assign('page', $page); // 渲染模板输出 return $this->fetch(); //----------模板文件分页输出--------------- <div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$list->render()}三,分页参数list_rows-每页数量 page-当前页path-url路径query-url额外参数fragment-url锚点var_page-分页变量type-分页类名四,分页循环each(function($item,$key){xxxxx})$list=$db->paginate(5,false,[ 'type'=>'bootstrap', 'vat_page'=>'page', 'query'=>$request->get(), ]) ->each(function($item,$key){ $item['goods_name']='【'.$item['cate_name'].'】'.$item['goods_name']; });
2020年01月07日
188 阅读
0 评论
0 点赞
2019-11-25
md文档插入GIF图片
介绍在md文档编辑中常常会插入图片,在以前的文档介绍阿里云OSS+PicGo组键图床使用自建图床生成图片链接。https://j1109053660.oss-cn-hangzhou.aliyuncs.com/img/20191120174135.png曾用过格式工厂的视频转换,但效果不是很理想,转换后的图片模糊像下面这个图片这样。录制的视频尺寸再大些画面会更加模糊。也用过一些现成的录制GIF软件,下载使用了一下就卸载了,作为一个 白嫖 学习党找到了一个 免费 开源的软件,那就是 ScreenToGif 软件开源地址:GitHub启动界面:录制窗口:编辑面板:录制完之后会自动进入编辑器,调节参数然后另存为暂时--本博客添加的视频都是采用GIF方式-有待改进
2019年11月25日
212 阅读
2 评论
1 点赞
2019-11-19
ajax介绍
AJAX的简单介绍AJAX是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)缩写AJAX的优点是在不重新加载整个页面情况下,可以与服务器交换数据并更新部分网页内容。AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。AJAX是异步传输技术AJAX流程图AJAX传参的三种方式a链接(get方式)from表单(post)JS/JQ(ajax)AJAX的8个属性ajax一个json参数(8个属性):$.ajax({async:是否异步(默认true),url:提交地址,data:提交的数据(json格式),type:提交方式(post),dataType:(html,json,xml)预期的服务端返回的类型,success:成功的回调函数形参为返回的数据,error:失败的回调函数,beforeSend:等待的回调函数})post有4个参数:$.post("文件地址",{act:'del',uid=uid},funtion(data){ },"html")1.发送地址 2.发送数据 3.成功的回调 4. 服务端返回的数据类型XML格式<book> <content> <name>李大鹏</name> <sex>男</sex> </content> </book> JSON格式<script> var js=[{name:'李大鹏'},{sex:'男'}]; </script>XML格式与JSON格式区别:XML重量级|JSON轻量级代码程序1. js原生index.phpsercer.php页面展示2. JQ-html数据类型index.phpajax.php页面展示效果和下面json一样。3. JQ-json数据类型index.phpajax.php页面展示4. JQ-JSON数据类型index.phpajax.php页面展示5.JQ-POST数据类型index.phpajax.php页面展示
2019年11月19日
195 阅读
0 评论
0 点赞
2019-11-19
PHP常用系统函数速查表
常用的一些系统内置函数~要记住常用的系统函数数学函数名字参数个数一参二参三参四参备注ceil()向上取整1数字////floor()向下取整1数字////round()四舍五入2数字位数///rand随机数2数字数字///mt_rand随机数2小位数大位数///number_format()格式化数字4数字保留小数位数最小为0小数分隔符千位分隔符/加密函数名字参数个数一参二参三参四参备注base64_encode()base64加密1字符串////base64_decode()base64解密1字符串////md5()md5加密1字符串///不可解密,32位长度sha1()sha1加密1字符串///不可解密,40位长度时间函数名字参数个数一参二参三参四参备注time()当前时间戳0/////strtotime()转时间戳1时间格式字符串////date()格式化时间戳2时间格式字符串时间戳//第二个参数不写,默认当前时间字符串函数名字参数个数一参二参三参四参备注strlen()获取长度1字符串////mb_strlen()获取字符长度2字符串编码///substr()字符串截取3父字符串截取开始位置截取长度/开始位置为负数是倒数mb_substr()中文字符串截取4字符串截取开始位置截取长度编码开始位置为负数是倒数substr_replace()替换字符串的子串4字符串替换的字符串开始位置为负数是倒数截取长度/trim()去掉两端空格2字符串去掉的字符///ltrim()去左侧空格2字符串去掉的字符///rtrim()去右侧空格2字符串去掉的字符///strpos()字符串查第一次位置3父字符串子字符串开始匹配位置/区分大小写stripos()字符串查第一次位置3父字符串子字符串开始匹配位置/不区分大小写strrpos()字符串查最后一次位置3父字符串子字符串开始匹配位置/区分大小写strripos()字符串查最后一次位置3父字符串子字符串开始匹配位置/不区分大小写str_replace()字符串替换3要替换的字符串替换的字符串原字符串/区分大小写str_ireplace字符串替换3要替换的字符串替换后的字符转原字符串/不区分大小写strtolower()转为小写1字符串////strtoupper()转为大写1字符串////ucfirst()首字母大写1字符串////ucwords()单词首字母大写1字符串////iconv()字符按编码换函数3转换前的格式转换后的格式字符串//转换函数名字参数个数一参二参三参四参备注explode()字符串转数组2符号字符串///implode()数组转字符串2符号字符串///排序函数名字参数个数一参二参三参四参备注sort()升序排列1数组///键值不保留asort()升序排列1数组///键值保留rsort()降序排列1数组///键值不保留arsort()降序排列1数组///键值保留ksort()按键升序排列1数组////krsort()按键降序排列1数组////shuffle()随机排序1数组///键值不保留统计函数名字参数个数一参二参三参四参备注count()计算个数1数组////array_sum()数组求和1数组////max()/min()数组中最值1数组////in_array()元素是否在数组中2元素数组//返回true/falsearray_key_exists()键是否存在2键值数组//返回true/falsearray_values()键重置1数组///生成新数组array_keys()值变键,值消失1数组///生成新数组empty()数组是否为空1数组////is_array()是否是数组1数组////is_null()是否是空1字符串///只有null返回值为trueisset()是否被定义1字符串///null,'',0均为trueis_numeric()是否为数字或数字字符串1数字/字符串///返回true/false遍历函数名字参数个数一参二参三参四参备注current()指针当前所指元素1数组////next()指针下移1数组///移出数组后指针丢失prev()指针上移1数组///移出数组后指针丢失reset()重置指针1数组////end()指针指向最后一个1数组////key()指针当前所指元素键1数组//// 操作函数名字参数个数一参二参三参四参备注array_push()尾部添加2+n数组元素//可添加对个array_pop()尾部移除,返回该值1数组////array_unshift()首部添加2+n数组元素//可添加对各array_shift()首部移除,返回该值1数组////array_unique()移除数据中重复元素1数组排序方式请见php手册//原数组不变补充str_pad()填充字符串原字符串*字符串长度*填充字符默认空白填充位置xSTR_PAD_BOTH - 填充字符串的两侧STR_PAD_LEFT - 填充字符串的左侧STR_PAD_RIGHT - 填充字符串的右侧。默认strtolower()字符串转小写字符串xxxx该函数将传入的字符串参数所有的字符都转换成小写strtoupper()字符串转大写字符串xxxx该函数将传入的字符串参数所有的字符都转换成大写usfilst()字符串首字符转大写字符串xxxx.ucwords()字符串单词首字符转大写字符串xxxx例如"Hello Word"
2019年11月19日
343 阅读
0 评论
1 点赞
2019-11-08
tp5-数据库高级4
复习-查询构造器查询构造器分为:链式操作,查询语言【高级查询技巧】获取SQL语句【返回SQL语句】属于链式操作的一种;返回要执行的SQL语句,一般用于调试SQL语句报错信息解决办法:添加fetchSql(true)返回的是sql语句(字符串)方法1:链式操作之一 $result=Db::table('ecm_users') ->where('ids','>',20) ->fetchSql(true) ->select(); 方法2:数据库类的方法返回sql语句并在两端多了括号 $result=Db::table('ecm_users') ->where('ids','>',20) ->buildSql();【高级查询技巧】*聚合查询【聚合查询】每个方法对应的原生SQL都会自动加上limit 1;查询字段都会自动起别名CONUNT(*) as tp_count五个函数:sum,avg,count,min,max => limit 1返回的是字符串//参数可选的方式,不写参数为count(*) $result=Db::table('ecm_goods')->field(true)->count(); // SELECT COUNT(*) AS tp_count FROM `ecm_goods` LIMIT 1 //参数可选的方法,写参数count(id) $result=Db::table('ecm_goods')->field(true)->count('goods_id'); // SELECT COUNT(*) AS tp_count FROM `ecm_goods` LIMIT 1 //sum 和 avg $result=Db::table('ecm_goods')->field(true)->sum('price'); // SELECT SUM(price) AS tp_sum FROM `ecm_goods` LIMIT 1 $result=Db::table('ecm_goods')->field(true)->avg('price'); // SELECT AVG(price) AS tp_sum FROM `ecm_goods` LIMIT 1count例子中field链接没有用,查询时可以省略【高级查询技巧】*快捷查询-不同字段不同字段的相同值的查询,多个字段之间用|分隔表示OR查询,用&分隔表示AND查询$result=Db::table('ecm_goods') ->field(true) ->where('goods_id&if_show&recommended','=',1) //WHERE ('goods_id' = 1 AND 'if_show' = 1 AND 'recommended' = 1) ->where('if_show|recommended','=',1) //WHERE('if_show' = 1 OR 'recommended','=',1) ->select();【高级查询技巧】*快捷查询-相同字段相同字段的不相同值的查询$result=Db::table('ecm_goods') ->field(true) ->where('goods_id',['>=',1],['<=','10']) ->where('goods_name',['like','%杰记%'],['like','%海泉%'],['like','%0%'],'OR') ->select(); // ( `goods_id` >= 1 AND `goods_id` <= 10 ) //( `goods_name` LIKE '%杰记%' OR `goods_name` LIKE '%海泉%' OR `goods_name` LIKE '%0%' ) 【高级查询技巧】快捷表达式查询$result=Db::table('ecm_goods') ->field(true) //->where('goods_id','in',[1,2,3,4,5,6]) ->whereIn('goods_id',[1,2,3,4,5,6]) ->select();方法作用whereNull查询字段是否为NullwhereNotNull查询字段是否不为NullwhereIn字段IN查询whereNotIn字段NOT IN查询whereBetween字段BETWEEN查询whereNotBetween字段NOT BETWEEN查询whereLike字段LIKE查询whereNotLike字段NOT LIKE查询whereExistsEXISTS条件查询whereNotExistsNOT EXISTS条件查询whereExp表达式查询【高级查询技巧】*快捷查询-时间表达式whereTime('日期字段名',‘日期表达式’)$result=Db::table('ecm_goods') ->field(true) ->whereTime('add_time','>','2019-11-08') ->whereItme('add_time','d') ->select();支持的日期表达式包括:today或d今天week或w本周month或m本月year或y今年yesterday昨天last week上周last month上月last year去年-2 hours查询两个小时内10 hours ago10小时之前到先到【高级查询技巧】动态查询查询方法不是链式操作,要做为每次查询的最后一次调用的方法来使用,查询条件都是值等“=” getBy+FieldName() ,将要查询的字段转成驼峰法来写;根据某个字段里的值查询一条数据 getFieldBy+FieldName() ,返回一个字段里的值,根据一个字段的值查询另一个字段的值;默认排序的第一条的对应字段 动态查询描述getByFieldName(根据某个字段查询)getFieldByFieldName(根据某个字段获取某个值)根据字段的值查询记录(仅一条记录,默认排序规则的第一条),/-> getByFieldName(值) 返回值为一维数组|NULL 相当于find方法$result=Db::table('ecm_goods') ->field('description',true) ->getByGoodsId(1); //WHERE 'goods_id' = 1 LIMIT 1根据字段的值查询某个字段的值(仅一条记录,默认排序规则的第一条),-> getFieldByFieldName(值,字段名) 返回值为字符串|整型|NULL 相当于find方法$result=Db::table('ecm_goods') ->field('description',true) ->getFieldByGoodsId(111,'goods_name'); //SELECT 'goods_name' FROM 'ecm_goods' WHERE 'goods_id' = 1 LIMIT 1【高级查询技巧】*子查询1. 子查询作为新表进行查询$sql=Db::table('ecm_goods') ->field(true) ->where('goods_id','<',50) ->buildSql(); $result=Db::table($sql.' a') ->where('price','<',20) ->select(); //该例子为简单方式教学,通常第一个查询是很复杂(三表或多表联查)2.子查询作为字段进行查询$sql=Db::table('ecm_gcategory') ->alias('g') ->field('cate_id') ->where('c.cate_id=g.parent_id','exp','') ->limit(1) ->buildSql(); $result=Db::table('ecm_goods') ->alias('c') ->field('cate_id,cate_name,parent_id') ->field('if('.$sql.',1,0) as has_next') //->field('if(select cate_id from ecm_gcategory g where c.cate_id=g.parent_id limit 1),1,0) as has_next') ->where('c.parent_id',0) ->select(); 3.子查询作为查询条件,只会多数用于whereIn的条件中$result=Db::table('ecm_goods') ->field('goods_id,goods_name.price') ->whereIn('goods_id',function($query){ $query->table('ecm_users') ->field('id') ->where('uname','like','%a%') }) ->select(); >>END
2019年11月08日
223 阅读
0 评论
0 点赞
1
...
5
6
7