首页
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
Search
1
NAS的简单介绍
734 阅读
2
网站环境一键部署工具推荐
505 阅读
3
tp5-模型数据处理
406 阅读
4
win10镜像
362 阅读
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
篇与
的结果
2019-11-07
tp5-数据库操作3
数据库操作查询语言的2个方法,3个用法,8个要诀两个方法:where,whereOr三个用法:表达式查询,数组查询,闭包查询八个要诀:•查询条件的调用次序就是生成SQL的条件顺序;•查询字段用&分割表示对多个字段使用AND查询;•查询字段用|分割表示对多个字段使用OR查询;•对同一个查询字段多次调用非等查询条件会合并查询;•闭包查询和EXP查询会在生成的查询语句两边加上括号;•用闭包查询替代3.2版本的组合查询;•除了EXP查询外,其它查询都会自动使用参数绑定;•如果查询条件来自用户输入,尽量使用表达式和闭包查询,数组条件查询务必使用官方推荐的方法获取变量;【查询构造器】查询语句:表达式查询表达式查询,三个参数,其中如果是等于的条件,可以省略等于的条件直接写两个参数$result=Db::table('ecm_goods') ->field(true) //->whereOr('goods_name','like','%thinkphp%') //->where('goods_id','>',1) //->where('goods_id','<',10) //->where('goods_id','<>',10) //->where('goods_id','between',[1,5]) // ->where('goods_id','in','1,2,3,4,5') // ->where('goods_id','in',[1,2,3,4,5]) //->where('goods_id',null) ->where('descriptopn','null','')//select * from 'ecm_goods' where 'descriptopn' is null ->where('descriptopn','')// 'descriptopn' = '' //特殊表达式 //->where("left(goods_name,2)='杰记'",'exp','')//expression 引号内可以写原生表达式 ,left是从左截取 //exp-表达式查询。原生的sql可以写在前面的参数或者后面的参数,唯一不能做的就是拆开写。 ->select();$result=Db:table('ecm_users')->where('add_time','> time',13570128000)->select(); $result=Db:table('ecm_users')->where('add_time','> time','2015/11/12')->select();时间比较(字符串或者数字)常用的符号> time< time>= time<= timebetween timenotbetween time【查询构造器】查询语句:数组查询不推荐使用['字段名1' =>['表达式'],['值'],'字段名2'=>['表达式','值']]$where=[ 'goods_id'=>['>',10], 'price' =>['<',50] ]; $map=[ 'goods_id'=>['>',20], 'goods_name'=>['like','%杰记%'] ]; $result=Db::table('ecm_goods') ->where($where) ->whereOr($map) ->select(); //执行的sql语句 SELECT * FROM `ecm_goods` WHERE `goods_id` > 10 AND `price` < 50 OR `goods_id` > 20 OR `goods_name` LIKE '%杰记%'【查询构造器】查询语句:闭包查询闭包查询(匿名函数),可以使用一次闭包就代表了加了一次括号$result=Db::table('ecm_goods') ->where(function($query){ $query->where('goods_id','between',[10,50]) ->whereOr('price','<',50); }) ->where('goods_name','like','%杰记%')->select(); //执行的sql语句 SELECT * FROM `ecm_goods` WHERE ( `goods_id` BETWEEN 10 AND 50 OR `price` < 50 ) AND `goods_name` LIKE '%杰记%' ->where(function($query){ $query->where(function($q){ $q->where('1=1') }) })闭包里还可以继续套闭包在闭包中使用变量需要在括号外添加use引入多层闭包需要多层引用$key='杰记'; $goods_id=10; $price=50; $result=Db::table('ecm_goods') ->where(function($query) use($goods_id,$price){ $query->where(function($q) ues($goods_id)P{ $q-where('goods_id','>',$goods_id) ->where('goods_id','<',80); }) ->whereOr('price','<',$price); }) ->where('goods_name','like','%'.$key.'%')->select(); >>END
2019年11月07日
210 阅读
0 评论
0 点赞
2019-11-06
tp5-数据库操作2
SQL中联表的三种方式内联,外联(左联-右联)左联与右联的区别:左联方式:在左表为主的数据和右表的数据展示出来右联方式:以右边为主查询数据,左表和右表有关联的数据展示出来,相同字段起别名区分。【链式操作】join*Db::table(表名)->alias(别名)->field(查找的字段)->join(要联的表名,字符串方式定义,不带数据表前缀的表名);参数1:要联的表名 ①数组方式定义,[' ```ecm_goods'=>'g'``` ],【任何时候都没有BUG】<br> ②字符串方式定义,‘ ```ecm_goods g``` ’ ,【当默认的表前缀与当前要联的表不一致时会自动加前缀,造成BUG】<br> ③不带数据表前缀的表名,‘ ```__GCATEGORY__ c``` ’ <br>参数2:联表的条件,按照where的条件定义方式来写 参数3:联表方式。LEFT、RIGHT、INNER(默认),当数据不存在时填充null :arrow_down_small:$field=['goods_id','goods_name','price','c.cate_id','cate_name','parent_id','g.if_show']; $result=Db::table('ecm_goods') ->alias('g') ->field($fielf) ->join(['ecm_gcategory'=>'c'],'g.cate_id=c.cate_id and c.if_show=1','LEFT') ->select();注意两个表相同的字段必须显示指明使用的哪个字段,如if_show 必须写成 g.if_show 注意两个表相同的字段作为where的查询条件时,如 if_show = 1 ,这个时候必须加别名或者表名指明是哪个表的字段 g.if_show = 1【链式操作】order*参数:排序的规则,逗号分隔的字符串或者数组$result=Db::table('ecm_goods') ->field(true) ->order('goods_id desc,add_time desc') ->select(); $result=Db::table('ecm_goods') ->field(true) ->order('goods_id'=>'desc','add_time'=>'desc') ->select(); $result=Db::table('ecm_goods') ->field(true) //->order(['goods_id'=>'desc']) //->order('add_time') ->orderRaw('rand()')//随机排序 //->find();只渲染一条数据 ->select();【链式操作】limit$result=Db::table('ecm_goods') ->field(true) ->limit('0,10') ->select(); $result=Db::table('ecm_goods') ->field(true) ->limit(0,10) ->select(); $result=Db::table('ecm_goods') ->field(true) ->limit(10) ->select();【链式操作】page,一般用于分页查询$result=Db::table('ecm_goods') ->field(true) ->page('2,10') ->select(); $result=Db::table('ecm_goods') ->field(true) ->page(2,10) ->select(); $result=Db::table('ecm_goods') ->field(true) ->page(2) ->limit(10) ->select();【链式操作】group,having$result = Db::table('ecm_goods') ->filed('goods_id,goods_name,cate_id,count(cate_id) as total') ->where('goods_id','<=',50) ->group('cate_id') ->having('total>5') ->select();【查询构造器】查询语言查询语言:2个方法(where,whereOr) 3个用法(表达式查询,数组查询,闭包查询)$result = Db::table('ecm_goods') //->filed(true) ->where('goods_id','>',1) ->where('price','<',10) ->select();$result = Db::table('ecm_goods') //->filed(true) ->where('goods_id','between','1,5') //->where('goods_id','between',[1,5]) //->where('goods_id','in','[1,2,3,5]') ->select();链式方法注意事项链式方法支持所有的CURD操作;链式方法本身只是返回查询对象,只有执行查询后才会返回结果,而且只能在查询方法之前被调用;不同链式方法的调用顺序不影响查询;相同链式方法的调用顺序可能会影响查询(至少会影响SQL语句)链式方法在完成查询后会自动失效;同一个链式方法在CURD操作中的作用可能不同;链式方法仅针对CURD方法,对原生查询无效;
2019年11月06日
98 阅读
0 评论
0 点赞
2019-11-04
tp5-数据库介绍1
什么是端口?所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。常用的端口有哪些?HTTP:80(www服务)DHCP:服务器端口67,客户机端口68POP3:25SMTP:23FTP:20(数据传输),23(控制信令的传输、控制信息和数据能够同时传输)|FTP采用的是TCP连接DNS:53mysql:3306Apache:2268QQ:8000(服务端)和4000端口(客户端)远程桌面:3389查看端口号的两种方式:1任务管理器2.cmd>netstat -ano数据库操作一.查询的类1. DB类-数据库基本的类|特殊方法:query,execute(执行原生的查询方法) <br> 2. 模型类 <br>二.查询构造器 1. 链式操作-解决SQL语句如何拼接的问题 <br> 2. 查询语音-解决where条件怎么写的问题 <br>三.CURL方法 1. C-数据创建|create <br> 2. U-数据更新|update <br> 3. R-读取|find,select <br> 4. D-删除|delete <br> 基础的sql语句public function db(){ //基本的sql语句 $sql = "select * from 表名"; $result = \think\Db::query($sql); }配置了数据库链接信息后可以直接使用数据运行原生SQL操作,支持 query (查询操作) 和 execute (写入操作)支持参数绑定参数绑定Db::query('select * from think_user where id=?',[8]); Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);命名占位符绑定Db::query('select * from think_user where id=:id',['id'=>8]); Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);多个数据库连接Db::connect($config)->query('select * from think_user where id=:id',['id'=>8]);查询构造器链式操作作用是生成标准的严谨sql语句所有的连贯操作都返回当前的模型实例对象(this)其中带*标识的表示支持多次调用 $result =Db::table('ecm_user') ->field('id') ->field('uname') ->field('upwd') ->where('id','=',18) ->order('id,desc') ->select();【链式操作1】table,指定查询的表,直接写完整的表明:如果需要别名一般陪着alias来使用或者直接空格+别名。$result=Db::table('ecm_users')->select(); $result=Db::table('ecm_users a')->select();//起别名 $result=Db::table('ecm_users')->alias('a')->select(); $result=Db::table('__USERS__')->select();//表前缀与系统默认的相同时:去掉表前缀,所有字母都大写。【链式操作2】field*,可以重复使用,指定要查询的字段逗号分隔的字符串:'字段名1,字段名2,字段名3,...'字段名的索引数组:['字段名1','字段名2','字段名3'...]可以对字段夹别名:逗号分隔的字符串'uname as 别名'|'uname 别名'|['uname'=>'别名']多次field方法查询多个字段field(true),显示查询全部字段,默认查询全部字段的内容,默认把全部字段都列出来 隐式查询可以不写field,直接为星号,这种方式查询在高仿问量的系统中效率极低, 一般我们要进行显示查询,指定相关字段查询,这样效率高,即使查询全部字段这种方式也高排除默认写占用资源高的字段或者根据要求显示一部分字段但不显示的占少数,可以考虑使用field('排除的字段',true) 7.字段上可以使用SQL函数$result=Db::table('ecm_users')->field('id,uname,email')->select(); $result=Db::table('ecm_users')->field('id','uname','tel')->select(); $result=Db::table('ecm_users')->field(true)->select(); $result=Db::table('ecm_goods') ->field('goods_id,left(goods_name,3) as goods_info') ->field('FROM_UNIXTIME(add_time, \'%Y-%m-%d %H:%i:%s') as add_times') ->field('if(if_show,"上架","下架") as if_shows') ->select();SQL中时间戳和本地时间互相转换select from_unixtime(1234567890,'%Y-%m-%d %H:%i:%s');select unix_Timestamp('2019-11-04 12:23:00');sql中的if判断if(exp1,exp2,exp3)//exp1是判断条件,exp2是条件true执行,exp3是条件false执行实例化详情小豆丁博客介绍什么是实例化实例化本身public static function instance($options = []) { if(is_null(self::$instance)){ self::$instance = new static($options); } return self::$instance; }static方法实例化本身实例化对象M()和D()的区别参考ThinkPHP中实例化对象M()和D()的区别
2019年11月04日
173 阅读
0 评论
0 点赞
2019-11-01
tp5-请求接参
接收请求参数静态调用》$request = Request::instance(); //use think\Request;助手函数》$request=request();Request::instance();//单例的设计模式,始终保证内存中只有一个类的实例化对象;获取请求参数//变量类型方法([变量名],[/变量修饰符],['‘默认值'],[过滤方法])参数1:变量类型方法,根据请求的类型来使用相应的方法param(parameter,核心目标获取的是pathinfo的参数)、get、post;参数2:变量名,可选,如果写,可以直接接到对应参数的值,不写为获取全部参数的数组,相当于$_GET $_POST;$param=$request->param('');<br> $get=$request->get();<br> //指定参数接值或者不指定参数接值<br>参数3:变量修饰符,对接收的变量进行强制的类型转换,复选框命名要加[]并且接收参需要加/a进行强制类型转换修饰符作用/s强制转换为字符串类型/d强制转换为整型类型/b强制转换为布尔类型/a强制转换为数组类型/f强制转换为浮点类型参数4:默认值。当接收的参数数没有设置的接参变量的时候(没给传递的时候),会将默认值赋给接收的变量注意:pathinfo方式传参时参数名存在,参数值不存在,那么认为该参数没有传,默认值就起效果了get和post方式如果参数名存在,那么就认为参数存在,认为是默认赋值了空字符串的值,request接参时默认值 是没有效果的数组特殊-例如复选框一个不选,走默认值。参数5:过滤方法,执行的顺序是从左向右;其实就是一个参数的函数;只是执行了一个函数而已,函数可以不是过滤的效果,如:md5;常用的过滤函数有trim(去除两端空格),htmlspecialchars(特殊字符转义)strip_tags(滤掉NUL,HTML和PHP的标签)<!--参考代码--><br> $param = $request->param();<br> $get = $request->get();<br> $post = $request->post();<br> $id = $request->param('id/d','1');//参数是否传值<br> $ids = $request->get('ids',2);//参数是否存在<br> $vip = $request->post('vip/a',[22]);//复选框特殊<br> $username = $request-post('username','default','trim,htmlspecialchars,strip_tags');//参数是否存在<br> $usernamee = $request->post('username','default','md5');//参数是否存在<br> // 赋值到模版<br> $this->assign('name','zhuoxiang');使用PHP函数对变量进行比较sql注释 在索引栏中输入一下代码:select * from user where username='admin' or 1=1;--' and upwd='123456';//--注释后面的代码将屏蔽掉不在执行。select * from user where username='admin' or 1=1;drop 表名//删除表
2019年11月01日
156 阅读
0 评论
0 点赞
2019-10-31
tp5-模板
普通标签{$name}普通标签的定界符被修改成<{}>,输出要<{$name}>才生效变量输出$view=new View();$view->name='thinkphp';return $view->fetch();模板使用:hello,{$name}!$data['name']='Thinkphp'$data['email']='thinkphp@qq.com'$view->assign('data',$data);模板使用:Name:{$data.name} 或者 Email:{$data['email']}如果data变量是一个对象:{$data:name}或者{$data->email}系统变量通常以 {$Think打头{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量{$Think.session.user_id} // 输出$_SESSION['user_id']变量{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量{$Think.cookie.name} // 输出$_COOKIE['name']变量支持输出 $_SERVER 、 $_ENV 、 $_POST 、 $_GET 、 $_REQUEST 、 $_SESSION 和$_COOKIE 变量。常量输出{$Think.APP_PATH}配置输出{$Think.config.default_module}{$Think.config.default_controller}请求参数代补使用函数模板输出变量使用函数{$data.name|md5}编译后的结果:<?php echo (md5($data['name'])); ?>函数有多个参数需要调用{$create_time|date="y-m-d",###}编译后的结果:<?php echo (date("y-m-d",$create_time)); ?>果前面输出的变量在后面定义的函数的第一个参数{$data.name|substr=0,3} 或者 {$data.name|substr=###,0,3} 编译后的结果:<?php echo (substr($data['name'],0,3)); ?>以支持多个函数过滤,多个函数之间用“|”分割{$name|md5|strtoupper|substr=0,3}编译后的结果:<?php echo (substr(strtoupper(md5($name)),0,3)); ?>函数会按照从左到右的顺序依次调用可以使用冒号{:substr(strtoupper(md5($name)),0,3)}默认值defaultThinkPHP-4内容运算符{$a+$b}<!--在使用运算符的时候,不再支持常规函数用法,例如:{$user.score+10} //正确的{$user['score']+10} //正确的{$user['score']*$user['level']} //正确的{$user['score']|myFun*10} //错误的{$user['score']+myFun($user['level'])} //正确的-->三元运算ThinkPHP-4内容原样输出literalThinkPHP-4内容模板注释ThinkPHP-4内容
2019年10月31日
147 阅读
0 评论
0 点赞
2019-10-31
tp5-视图层2
使用默认值给变量提供默认值,例如:{$name|default="xxxx"}默认值和函数可以同时使用,例如:{$Think.get.name|getName|default="xxxx"}三元运算符{$name? "yes":"no"}在什么情况下执行三种false: 未定义 , 定义了没赋值 , 空`三种写法{$status? '正常':'错误'}{$info['status']? $info['msg']:$info['error']}{$info.status?$info.msg:$info.error}5.0还支持{$name.aa ?? 'xxxx'}第一种情况: ?:<{$status? '正常';'错误'}> echo !empty($sataus)?''正常;'错误'简写:标准的三目判断 如果问号前面不写参数为输出判断的参数{$status?:'xxxx'}相当于{$status? $status:'xxxx'}第二种情况: ??{vaername.aa ?? 'xxxx'} 原生》echo isset($static) ?$status:'错误';第三种情况 : ?= (只能输出判断表达式为真的情况)<{$status?='xxx'}> 原生》if(!empty($status)) echo 'xxxx';第四种情况: 条件表达式 ==,>=,<=<{$a==$b ? 'yes':'no'}> 原生》 echo $a==$b?'yes':'no';tp的注释-literalhtml中的不适用tp,因为文档加载时优先加载tp代码。{literal} tp代码 {/literal} tp的内置标签,输出不用尖角号<{}>直接{}即可<!---多行注释 {/ /}只能用于一个定界符内<{/xxxxxxxx/}>模板单行注释<{//$sataus}>-->模板注释1.只能注释同一个标签内2.结束标记跟定界符之前可以有空格,但起始标记不能与定界符有任何空格3.模板注释后在临时文件中是不显示的包含文件-include(内置标签){include file='模板文件1,模板文件2,.........' /}参数1:模板表达式【模快@】【控制器/】【操作】参数2:使用模板相对地址模板包含:1.模板表达式中对应的控制器,方法未必一定存在2.如果模板文件中含有对应控制器赋值的变量,那么该变量需要在当前控制器中再次赋值;3.包含文件中可以在使用include标签包含别的文件,但注意不要形成A包含A,或者A包含B而B又包含A这样的死循环。三种接值方法1.post接值$post=$request->post(); $arr=$request->post('id/a');//接数组2.get接值$get=$request->get();3.pathinfo接值$id=$request->param('id/d');//接单值pathinfo不能接数组窝窝头。嘿嘿qwq
2019年10月31日
183 阅读
0 评论
0 点赞
2019-10-30
tp5-视图层1
渲染模板输出return $this->fetch('str',['name'=>'thinkphp']);助手函数渲染模板输出的话,可以使用系统提供的助手函数view,完成相同的功能:return view('hello',['name'=>'thinkphp']);【渲染模板】模板文件的存在不需要对应的控制器和方法存在参数1:模板文件①不写;默认的规则,渲染当前模块下的当前控制器的当前方法对应的模板; > return $this->fetch(); ②模板表达式或者模板渲染方式:[模块@][控制器/][操作],可以从左向右省略,控制器和方法名次采用小写+下划线的方法. > return $this->fetch('admin@goods/index') ③相对路径:相对于入口文件为起始的相对路径 > return('..\\application\\index\\view\\index\\index.html');参数2:模板变量(数组),第一维一定是关联数组,相当于批量赋值的写法fetch('[模板文件]'[,'模板变量(数组)']) // 第二个数值可以不写,逗号占位 > return $this->fetch('','people'->'PRC'); 视图代码:<{$people}>参数3:模板输出替换(数组) ['__IMG__'=>'/static/img']return $this->fetch('',[参数2],['__IMG__'=>'/static/img']);查看Think的版本视图代码: <{$Think.Version}>URL生成在控制器或者php代码种尽量使用类的静态调用方式(速度快)参数①:地址表达式,[模块/][控制器/][操作],作用是为了生成URL地址而存在,控制器和方法名遵循控制器和方法的起名原则(驼峰法) > use think\Url; //导入url > echo \think\Url::build('admin/Goods/showMsg'); //可以简写不用引用 > echo url(); 参数②:参数,URL链接上的参数,采用关联数组方法定义 参数③:伪静态后缀,默认值(true)是输出html,如果不想要后缀可以使用false或者‘’; > echo \think\Url::build('admin/Goods/showMsg',['id'=>11,'name'=>'zhuoxiang'],'true'); //最后的参数是后缀名,可以填jsp,true,false,''; 参数④:是否显示域名,默认为false不显示域名,显示当前域名可以写true,或者直接写域名 > echo Url::build('admin/Goods/showMsg',['id'=11,'name'=>'zhuoxiang'],true,'www.baidu.com'); //最后参数是自定指定的链接使用管道符①使用管道符|来表示函数,模板变量|函数名=参数。 函数只有一个参数或者单多个参数在第一位时,可以不写这个参数或者用###占位 函数支持嵌套执行,从左向右顺序执行 * <{$name|md5|strtoupper|substr=###,1,10}> * <?php echo substr(strtoupper(md5($name)),1,10);?> ②使用冒号:形式输出函数(跟原生的PHP使用函数方式一致,只是在前面加了一个冒号),:函数名(参数...)视图代码控制代码网页显示end
2019年10月30日
156 阅读
0 评论
0 点赞
2019-10-29
tp5-控制器和视图
第二天、控制器和视图第一部分:常识什么是面向对象例如,计算过程不算只要结果1.1 什么面向对象过程例如,封装函数就是面向对象的过程MVC的各层功能Model是应用程序中处理应用程序数据逻辑的部分 View 是应用程序中处理数据显示的部分 controller是应用程序中处理用户交互的部分MVC的优缺点优点: 代码更加清晰,适合于二次开发或者持续的迭代开发 适合与多人开发 用这种结构开发项目的底层和代码更加安全 缺点: 代码结构更加复杂,执行效率偏低》解决办法:增加缓存 大型项目比较适合使用,而小项目降低了效率》解决办法:小项目不使用MVC结构查看PHP版本的四种方式①命令行查询:php -v(version) ②使用预定义常量PHP_VERSION查询:<?php echo PHP_VERION;?> ③使用phpversion()函数查询: <?php echo phpversion();?> ④使用phpinfo()函数查询:<?php echo phpinfo();?>什么命名规范请查看《ThinkPHP介绍》这篇介绍八种类型中简单类型叫什么?八种数据类型其中简单类型4种叫做标量,判断是否为标量is_scalar();五种赋值方式赋值字符串到模板、 赋值一维数组到模板(索引和关联)、 批量赋值(最好使用一维关联数组,一般常用与修改时在模板显示原数据)、 赋值二维数组调用到模板、 赋值对象到模板tp中<{foreach}>各种参数叫什么name是数据源,item表示循环变量,默认key是键 数据源:将赋值过来的变量去掉$就是数据源怎么修改赋值到模板的定界符号config.php文件'模板设置'中tpl_begin\tpl_end修改定界符PHP内置空对象?怎么实例化空对象stdClass() new \stdClass(); //斜杆的意思是前面没有任何别名11.控制器的职责第二部分:代码1. 第七题:五种赋值方法控制器视图控制鸡偶行数0.0 变色网页浏览控制器视图继承和渲染
2019年10月29日
150 阅读
0 评论
0 点赞
2019-10-28
tp5-安装和部署
第一天,安装和部署什么是ThinkPHP?ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架```1.1 查看php版本的多种方法①命令行查询:php -v(version) ②使用预定义常量PHP_VERSION查询:<?php echo PHP_VERION;?> ③使用phpversion()函数查询: <?php echo phpversion();?> ④使用phpinfo()函数查询:<?php echo phpinfo();?>ThinkPHP的组织方式?thinkphp应用基于MVC的方式来组织什么是MVC?MVC是一个设计模式,由三个核心组成Model-模型,View-视图,controller-控制器3.1 MVC的各层功能Model 是应用程序中处理应用程序数据逻辑的部分 View 是应用程序中处理数据显示的部分 Controller 是应用程序中处理用户交互的部分3.2 MVC的优缺点优点: 代码更加清晰,适合于二次开发或者持续的迭代开发 适合与多人开发 用这种结构开发项目的底层和代码更加安全 缺点: 代码结构更加复杂,执行效率偏低》解决办法:增加缓存 大型项目比较适合使用,而小项目降低了效率》解决办法:小项目不使用MVC结构什么是框架?本身不一定完整但可以结局特定问题、可以扩展什么是二层框架?例如smarty,将逻辑代码与内容分离什么是三层框架?例如MVC,分为模型模块-视图模块-控制模块三种结构入口文件的访问方式?单一入口,无论完成什么功能都要通过入口文件访问,统一但不唯一访问模式pathinfo的访问模式,http://项目地址/入口文件/模块名/控制器名/参数名/参数/参数2/参数2...静态后缀模块化设计思想?让代码更清晰、更容易重用。默认划分为前台模块和后台模块什么是命名空间?起个别名,作用是在项目空间中避免重名命名空间的创立?namespace app\文件名\controller;控制器的定义采用大驼峰法(首字母大写),遇到下一个单词首字母继续大学,其他小写 相同一类的业务都放在一个控制器中 根据业务逻辑起别名 类名与控制器名一致 控制器的类文件名与类名一致命名空间的要求tp人为要求命名空间的起名规则与路径相同application下控制器下的Index为什么要大写?遵循开发规范-类文件采用大驼峰(首字母大写)命名、其他采用小驼峰echo与return的区别?return 直接将值返回出来,并停止程序。echo直接显示程序还可以直接执行容易出错。php面向对象和面向过程的区别面向过程就是你把代码封装成子过程或函数(procedure),然后依次去做一件事情; 面向对象就是你把要做的事情抽象成对象,然后告诉具体的那一个对象去做。 面向对象三大特性(封装,继承,多态)使得在做复杂的事情的时候效率和正确率得到保证。17.18.虚拟域名为了安全,让用户只能访问public文件夹 项目部署到其他位置时不出问题 服务器的内容与本地环境一模一样19.控制器控制器名:根据业务流程起名(见明知意) 控制器的类:类名与控制器名一致,首字母大写,采用大驼峰式命名20.common.php应用公共文件使用函数的方法common.phpUser.php21.大写转小写+下划线首字母转小写,后面的大写字母转小写并在前面加下划线 视图层的文件夹名根据控制器名来建立 视图层的模板文件名根据相应控制器的方法来建立栗子:地址栏 http://tp18.com/index.php/GoodsInfo/showMsg模板文件不存在:D:../public/../application/index\view\goods_info\show_msg.html常见的框架:[x] think PHP[ ] zend framework[ ] codelgniter-杭州城市常用[ ] yll framework[x] laravel[ ] cakephp[ ] Ci[ ] symfony关于访问问题正常模式:域名/控制器入口/文件名/函数名域名省略方法:
2019年10月28日
211 阅读
0 评论
0 点赞
2019-10-27
PHP面试题基础篇
前言PHP必须掌握的基本知识及时记录遇到过的习题,知识点一.什么是post通过 HTTP POST 方法传递给当前脚本的变量的数组。二.文件上传处理错误信息说明文件上传成功上传文件超过php限制上传文件超过HTML限制文件部分上传没有文件被上传找不到临时文件没有写入权限三.PHP的错误信息notice通知,warning警告,fatal error致命错误,parse error语法错误四.session和cookie的区别和联系1.不同的访问方法2.不同的隐私政策3.有效期的差异4.不同的服务器压力5.不同的浏览器支持6.跨域支持的差异Cookie支持跨域访问。区别:session安全cookie不安全session存在服务器cookie存在客户端session速度快cookie速度慢session容量大cookie受浏览器限制2-4k联系:session_id储存在cookie中手动关闭浏览器cookie,session失效五.数据库的三大范式不能没有主键每个属性不可再分不能有属性传递依赖六.ajax状态码输入状态码:console.log(xhr,readyState) ajax的状态码:0初始值,1数据发送成功,2服务端已返回数据,3浏览器正在解析数据,4完成 http的状态码:200成功,404路径错误ajax的流程:1.创建ajax对象2.Ajax初始化3.设置头格式 发送请求方式为 键值对4.设置回调函数 返回才调用的函数5.执行ajax发送数据七.jq的ajax语法1.$.ajax-写法复杂,功能全面2.$.post-写法简单,功能简单3.$,get-写法简单,功能简单ajax一个json参数(8个属性):$.ajax({ async:是否异步,url:提交地址,data:提交的数据, type:提交方式,dataType:预期的服务端返回的类型, success:成功的回调函数形参为返回的数据, error:失败的回调函数,beforeSend:等待的回调函数}) post有4个参数:$.post("文件地址",{act:'del',uid=uid},funtion(data){ },"html") 1.发送地址 2.发送数据 3.成功的回调 4. 服务端返回的数据类型ajax属性 $.ajax({ async:true,//是否异步 url:''//提交地址 data:{name:admin,act:'check'}//提交的数据 type:'post',//提交类型 dataType:'html',//(json,xml,html)预期的服务端返回的类型 success:function(data自定义名){ //成功的回调函数 形参为返回的数据 }, error:function(){//失败的回调函数}, beforeSend:function(){//等待的回调函数}, });在一个server.php页面红处理多个ajaxif($act=='check'){//业务1}if($act=='name'){//业务2}...============================================八.封装类的三种封装类型:public公共的,无限访问修饰符protected受保护的,类的外部无法使用private私有的,类的外部无法使用,不能被继承16种魔术方法(方法必须是public function) 构造方法1. __construct (自定义形参)new的时候自动执行 public function __construct($参数1,$参数2...){} 析构方法2. __destruct(无形参)对象被销毁之前自动执行 public function __destruct(){} 销毁 unset(对象名) 方法3. __set(固定两个形参1.属性名2.属性值)类的外部不可调用的属性赋值时自动执行 方法4. __get(一个形参,1.属性名)类的外部对不可调用的属性取值时自动执行 方法5. __isset(一个形参,1.属性名)类的外部判断不可调用的属性是否存在时自动执行 方法6. __unset(一个形参,1.属性名)类的外部销毁不可调用的属性时自动执行 方法7. __toString(无形参)把对象当成字符串去使用时自动执行 方法8. __clone(无形参)在对象被克隆时自动执行 方法9. __sleep(无形参)序列化对象时自动执行 方法10. __wakeup(无形参)反序列化对象时自动执行 方法11. __call(两个形参1.不存在的方法名2.传入的参数[数组])调用不存在的方法时自动执行 方法12. __callStatic(用静态方式中调用一个不可访问方式时调用) 方法13. __autoload(尝试加载未定义的类) 方法14. __invoke(调用函数的方式调用一个对象时的回应方法) 方法15. __set_state(调用var_export()导出类时,此静态方法会被调用) 方法16. __debugInfo(打印所需调试信息)构造方法在new的时候自动执行,设置了形参要在new的同时传入实参栗子:public function __construct($name,$age,$sex){....}$zh=new 类名('小张','18','男')析构方法在对象被销毁之前执行的方法(不可传参)如果没有手动销毁,则在页面执行之后执行栗子:public function __destruct(){echo "";}如果没有unset()销毁对象,那么这个分隔符永远在页面最下面序列化:将复杂类型的数据按照一定的规则转换成字符串的方法栗子://数组$arr=['name'=>'京东','sex'=>'男'];$str=serialize($arr);//序列化echo $str;结果:a:2:{s:4:"name";s:9:"京东";s:3:"sex";s:3:"男";}//对象$xx=new Test("京东");$xx->name="张小龙";$str=serialize($xx);echo $str;结果:O:4:"Test":3:{s:4:"name";s:9:"张小龙";s:6:"*sex";s:3:"女";}反序列化:将序列话后的数据还原1.$arr2=unserialize($str);//数组序列化反序列化2.$xx=unserialize($srt);//对象序列化反序列化json序列化json_encode()序列化json_decode()反序列化-> 对像的连接符号=> 数组的连接符号self 用来调用静态属性和方法:: 范围解析操作符 用来调用静态属性和静态属性方法serialize()方法通过序列化表单值,创建URL编码文本字符串JSON的一般写法:{name:'xiaozhang',age:'18'}或者serialize序列化写法O:6:"Person":{s:3:"sex";s:3:"男";}或者json_encode-json序列化写法[['admin',1],['admin',2]...]九.类的三大特性封装(将函数和变量结合在了一起)继承(类是可以继承的)多态(多种形态)同一个父类 有多个子类 他们调用同一个方法 得到的结果继承规则:一个父类可以有多个子类 一个子类只能有一个父类子类可以继承父类的所有非私有的成员class 名{ //属性 public $a; //公共的,无限访问修饰符 protected $b; //受保护的,类的外部无法使用 private $c; //私有的,类的外部无法使用,不能被继承 //方法 public function __construct($max,值2,值3){ $this->max=$max; $this->... $this->... } }十.Class的普通属性和静态属性
2019年10月27日
260 阅读
0 评论
0 点赞
2019-10-24
Smarty模板
smarty模板smarty定界符:一定要遵守smarty规则php实例化$smarty=new Smarty();设置html文件存放的位置$smarty->setTemplateDir("html");设置编译文件存放的位置$smarty->setCompileDir("compile");修改smarty定界符 放置符号冲突$smarty->left_delimiter="<{";$smarty->right_delimiter="}>";创建函数创建字符串$name="滑稽啊"; $smarty->assign("name",$name);$arr=['one'=>'大','two'=>'二']; $smarty->assign("name",$name);格式:$smarty->assign(函数名,值);创建数组$arr2=[ ['id'=>1,'name'=>'国毅','hobby'=>'遛鸟'], ['id'=>1,'name'=>'京东','hobby'=>'看鸟'], ['id'=>1,'name'=>'宏安','hobby'=>'烤鸟'], ]; $smarty->assign("arr2",$arr2);$smarty->display("index.html");html提取php分配过来的变量html中引文<{include file="common/head.html"}>使用php中的变量<{$name}><{$arr['one']}> 或者 <{$arr.one}>使用foreach循环<{foreach $arr as $k=>$v}> 循环条件 <{/foreach}>使用三目运算符<{($arr['one']=="大")?'对':'错'}>if分支栗子: style="color:<{if $k==0}>red<{elseif $k==1}>green<{else}>blue<{/if}>;"插入图片<!--插入图片 要以php文件为基准--> <img src="img/1.jpg" alt="" width="100" height="100">时间格式<{$time|date_format:"%Y-%m-%d %T"}> <!--详情请看手册《smarty3中文手册.chm》-->截取<{$title|truncate:60:'···':false:false}> <!--详情请看手册《smarty3中文手册.chm》-->config配置文件在html页</head>和<body>之间加入代码<{config_load file="color.conf"}>在html页<body>中添加背景颜色样式bgcolor<body bgcolor="<{#bg#}>">新建文件color.confbg=yellow注意:引文步骤(一般在总引文中设置)//设置配置文件存放的位置 $smarty->setConfigDir("config");在php页面中注意smarty的总引文,和最后一条的$smarty->display("index.html");最后结尾很容易忽略附录常用的总引文封装包
2019年10月24日
157 阅读
0 评论
0 点赞
2019-10-24
阿里云OSS+PicGo组建图床
前言写博客经常插入一些说明图片,使用绝对路径或者相对路径地址的图片不是很方便。到目前为止博客一直用的网络图床。常见的微博图床、七牛图床、又拍云图床、腾讯云COS、阿里云OSS等。一直以来我所使用的是喵素图床https://miao.su/ 直到昨天该图床的网站证书过期导致警告访问,不能正常显示图片,博客还有网站中的显示图片的链接都以挂掉。这免费图床让我感到不安图片说不定哪天就怀掉,不如就自己来搞一个私人图床。第一步,寻找储存服务器最为一个长时间使用的服务推荐使用阿里云OSS或者腾讯云COS参考价格对象储存不仅可以用来当图床,可以当作云盘使用,缺点是操作没有百度云盘方便,还可以将静态网站放置在上面访问第二步,创建专用用户输入 登录名称 和 显示名称 访问方式选择 编程方式 进入 权限管理 ,点击 新增授权 ,搜索 AliyunOSSFullAccess,确认。选择 认证管理 ,点击 创建新的AccessKey,会生成 AccessKeyID 和 AccessKeySecret,AccessKeySecret是无法找回的请妥善保存。第三步,创建BucketBucket名称要全局唯一区域最好选择离你近的权限选择公共读,这样子图片别人才能访问得到第四步,安装PicGoPicGo是一个支持多种图床的客户端图片上传工具可以实现快速上传图片到指定图床,并将链接保存到剪贴板。Github地址:https://github.com/Molunerfinn/PicGo链接设置如下:PicGo设置上传快捷键: 当使用截图工具截图后,会保存到剪贴板,这时按下快捷键,PicGo就会自动上传图片,然后将指定格式的链接地址放到剪贴板,直接粘贴到Markdown文档即可。其他待补充...
2019年10月24日
249 阅读
2 评论
0 点赞
2019-10-07
右键新增md文件
Windows下设置右键可新建.md文件 应用场景:Windows10,Typora(Markdown编辑器) 因为习惯用Markdown来写文档, 所以常常需要新建.md文档,但由于Windows并不会自带把.md文档放入右键新建项中(像Word那样) 所以方便起见,自己手动设置,其实就是把它写进Windows的注册表。1.进入注册表编辑器win+r,输入regedit,回车。选择第一项"HKEY_CLASSES_ROOT",点开。2. 新建项找到".md"项,此时该项应该是空的,“右键”,“新建”->“项”。此时该“项”中会有一个默认的字符串值。3. 新建字符串值选中刚才新建的项,“右键”,“新建”->“字符串值”至此,设置完毕。关闭注册表编辑器。在当前界面,“右键”->“新建”,可以看到"Markdown File" 选项了。另一种方式:右键新建txt文档Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.md] @="Typora.md" "Content Type"="text/markdown" "PerceivedType"="text" [HKEY_CLASSES_ROOT\.md\ShellNew] "NullFile"=""重命名后缀为.reg双击运行即可
2019年10月07日
214 阅读
0 评论
0 点赞
2019-10-07
火狐浏览器跨域报错
在HTML父窗口和子窗口进行互动时,查找窗口的父窗口window.parent只有在火狐浏览器预览会出现上图中的错误,提示跨域错误。问题出现在火狐浏览器上,解决办法如下:
2019年10月07日
217 阅读
0 评论
0 点赞
1
...
6
7