PHP基础
变量:用$符号定义如$a=10; 类的文件名: 类名.class.php 数组的定义:$arr=array('a'=>12,'b'=>13);或者$arr=['a'=>12,'b'=>13];常用的全局函数
获取当前时间 date_default_timezone_set('Asia/Shanghai'); $date = new DateTime();字符串操作
分割:explode(char,str,limit) 转码:html_entity_decode()文本转html;htmlentities()html转文本 穿插:join(str,arr); 替换:str_replace(src,des,str);src可以是数组。 得到char数组:str_splite(str); 长度:strlen(str); 首现:strstr(srcstr,desstr); 截取:substr(str,start,end); 补全:str_pad(src,len,char,0/1); trim:ltrim/rtrim — 删除字符串开头/结尾的空白字符(或其他字符)数组操作
返回列:array_column(arr,col) php的数组有交集差集键值结合等函数,十分强大。 所有key:array_keys(arr); 存在key:array_key_exit(key,arr); 出入栈:array_pop(arr);array_push(arr,var); 补全:array_pad (arr,size,value): 反序:array_reverse(arr); 存在值:array_search(value,arr) 在数组中搜索给定的值,如果成功则返回相应的键名 处理:array_walk (&$arr,callback); 排序:sort(&$arr);Thinkphp基础
文件功能:
文件夹:Application放应用本身,应用配置和缓存 Public放JS、CSS、img等公用的文件 ThinkPHP是框架的核心包,一般不用修改 文件:index.php整个应用的入口文 //定义项目名 define('APP_NAME','Index'); // 定义应用目录 define('APP_PATH','./Application/'); 默认情况下应用名和路径如下,一套框架只驱动一个应用 应用下面可以有多个模块,模块下面又分多个控制器,再分多个行为多模块的实现:
默认产生一个Home模块,复制Home文件夹,修改命名空间即可。数据库配置:
在模块文件夹下的Conf/config.php中配置本模块的数据库。或者更高级目录下配置。如下: 'DB_TYPE'=>'mysql', //配置数据库类型 'DB_HOST'=>'localhost', //配置数据库地址 'DB_USER'=>'root', //配置数据库用户 'DB_PWD'=>'', //配置数据库密码 'DB_NAME'=>'mydb', //配置数据库库名 'DB_PREFIX'=>'think_', //配置数据库前缀(可以没有这一项) 'DB_PORT'=>'3306', //配置数据库端口(也可以没有)MVC
MVC的主要思路是要解放控制器,让模型承担更多的任务,而控制器往往是简单几句话。诸如:用户的输入合法性,一致性,自动转换等都交给了模型。 而视图层要结合控制器,进行变量的同步等。最为灵活的是在视图中可以潜入php标签。
模型的建立
Model文件夹,新建类名xxModel.class.php,声明命名空间为Home\Model,引用并继承Model类。 另外mysql数据库本身就是模型。模型的引用
M方法和D方法:M方法专门针对数据库的快速模型化。用M(表名)的方式就可以引用模型。D方法则针对Model文件夹的模型类D(xx)引用此模型。模型的操作
模型主要操作数据库:查询操作:
基本查询:where和select函数,//模型类是指M方法和D方法所构造的类 用法一:字符串条件 $model->where("id=1 AND name='Frank'")->select(); 使用非常简单就是把查询的where条件字符串形式直接放到where参数中 但是安全性不好 用法二:数组条件/对象条件 $where=[id=>1,name=>'Frank']; $model->where($where)->select(); 除了数组之外也可以是对象,Think提供了一个动态的类:\stdClass $where=new \stdClass();$where->id=1;$where->name='Frank'; model->where($where)->select(); 安全性高,但是只能=,其他关系查询麻烦。 用法二扩展:其他逻辑条件 将条件数组的一员,在定义为数组,key表示关系,val表示值 $where=[id=>['gt',3],name=>['like',[%a%,%b%],'AND']]; 其他逻辑用法: ['between','1,10']; ['in','1,3,4,5'] 注:多数逻辑是存在not xxx反逻辑的 其他扩展:多条件查询和‘或’逻辑查询 $map['name|pwd']='frank';//name=frank or pwd=frank $map['name&pwd']='frank';//name=frank & pwd=frank $map['name|pwd']=['frank','123123',_multi=true];//name=frank or pwd=123123 $map['name&pwd']=['frank','123123',_multi=true];//name=frank & pwd=123123 find()函数获取一条 统计查询:count max min ave 用法:直接加列名 动态查询:getbyxx和getFieldbyxx函数 getbyid(1);//获取id=1的第一行数据 getFieldbyid(1,'name');//获取id=1的第一行的数据的name列,name引号也可不加 注:这两个函数只能选一行数据,且不用加select方法,直接单独使用 排序和分组等:order group having limit order('id DESC','name');//先按id倒叙再按name正序 field('id','name');//只返回这两列 group('id')->having('id>10');//分组 limit(3);//只保留前三个 cache(true);//开启缓存 预定查询:$_scope 如果某查询语句在项目中多次使用,可以直接加到模型类中: protected $_scope=[ 'mysql1'=>['where'=>['id'=>['gt',3]],'limit'=>10], ] 调用: $model->mysql1()->select(); 最基本的用法: $model=M(); $model->query('select * from table');增加操作:
add函数: 添加方式:$data['name']=xxx;$data['pwd']=xxx;$model.add($data); 或者:$model->name=xx;$model->pwd=xx;$model->add();删除操作:
delete函数: 删除方式:delete(key值); 或者结合where使用。修改操作:
save函数: 定义一个含有主键的array,$model->save($data);自动验证:
模型的保护成员$_validate 常用表单验证: ['字段','验证方式',警告文字,(验证模式)] ['email','require','邮箱是必须的',0] //模式0默认存在就验证否则不验证,1始终验证,2不为空才验证。一般用默认和1 常用验证方式: require email number integer double english等 附加验证规则: ['字段','验证参数',警告文字,验证模式,附加规则] 附加规则:regex正则表达式,验证参数为正则的式子//下面的很多都可以通过正则直接写 confirm验证是否和另一字段相等,验证参数为另一字段名 equal验证是否和给定参数相等 in验证是否在参数集合中,验证参数为数组(或者,隔开的字符串) length验证字符串长度,参数为一个值或者,隔开的两个范围边界值 验证的过程: create函数触发验证,create可以是前端的表单直接用。也可以$model->create($data); 如果所有条件验证通过,create函数返回true。否则返回false,并且错误提示的语句产生到$model->getError()中。 使用ajax方式传到前端:$this->ajaxReturn($model->getError());自动填充:
模型的另一个保护成员$_auto 基本的填充方式: ['name','佚名',(填充时机)]//填充时机1默认新增数据时,2更新数据时,3是无论何时都填充 调用系统函数的填充: ['pwd','md5',3,'function']//第四个参数是function会调用系统函数,或者function.php文件中的全局函数 调用自定函数的填充: ['pwd','myfun',3,'callback',(如果回掉函数有俩参数这是第二个)] protected function myfun($pwd,$secondparam){ return xxx; } 忽略空字符串的填充: ['pwd','',2,ignore]//如果pwd为空字符串,则忽略这个数据pwd字段的save操作实战测验:
1.配置数据库连接 2.为user表建立model(id,name,pwd) 3.验证model的name pwd不能空,以ajax返回验证结果 4.自动将pwd填充为md5加密后的字符串,并且在这个md5码最后再加一个后缀:'think' 5.要求写出配置文件,整个UserModel类,以及控制器中相关操作。不要求写前端。
视图的创建:
在View文件夹下新建和控制器同名的文件夹,然后建立和行为同名的html文件就是行为函数中$this->display()所呈现的页面。视图调用PHP:
变量传递: 控制器:$this->assign('val','Frank'); 视图:{$val} 函数传递: 视图:{:U(index)}//函数可以是系统函数也可以是自己定义在function.php中的全局函数 变量调用时直接应用函数:{$val|default='frank'}内置标签:
语法标签: thinkphp的视图模板内置了很多语法标签,诸如if swich等,这些标签写法需要记忆。所以不建议使用,建议直接用的形式直接用php语法。 展示标签: volist和foreach遍历展示数组,volist name指向数组id指向成员,foreach name指向数组item指向成员。这里不带$符号。 在前端的php模板中有时可以用.来代替['']或者->。不过考虑到>符号是html的标签符,所以少用->,数组的尽量还是用[],对象的用.代替->。 <volist name="d" id="item" > <h1>id:{$item.id};name:{$item.name}</h1> </volist> <foreach name="d" item="item"> <h1>id:{$item.id};name:{$item.name}</h1> </foreach> 引入标签: <import type='js' file='js.myjs'/> 等价于 <script src='__PUBLIC__/js/myjs.js'></script>模板页:
模板中留出,然后在要展示的页面继承这个模板<extend name="base" /><block name="title"><title>mytitle</title></block>,并指改动block部分即可.
控制器的创建:
controller文件夹下仿照原来的IndexController.class.php。和模型一样也要引入并继承Controller类。 类中的每一个方法都相当于一个行为action,路由方面可以通过http://域名/index.php/Home/Index/index访问该函数,即 入口文件/模块/控制器/行为。控制器下调用函数:
处理业务逻辑的函数一般不要封装在控制器类中,而是单独建立类来封装这些函数,这些类不属于MVC中任何一个,所以建议新建一个文件夹,并声明这个空间,然后封装函数以供控制器调用。 如果想要调用另一个控制器下的函数,则用A方法:A('modulename\controllername','Controller');//第二个参数是所处文件夹,一般情况下都是Controller行为函数的参数绑定:
行为函数的参数可以绑定前段的请求参数,只需要参数名$xx和请求数据的参数名xx同名。但是如果没有传入这个参数时,页面就会报错。不推荐调试使用。控制器下的跳转函数:
$this->success('操作成功','[controller]/action',[time]);第二个参数也可以是全地址,如果没有第二个参数,可以直接写第三个时间参数。就会跳到原网页。 $this->error();函数用法同上。前端数据的接收:
PHP原生的$_GET和$_POST依旧可以用,但是更推荐使用I('[get/post.]参数名',[默认值]);没有提交参数的时候给个默认值。向前端返回数据:
$this->display();//默认展示View文件夹下和行为名同名的xxx.html $this->ajaxReturn($data);//向前端返回ajax形式的数据,有用的全局变量:
IS_GET,IS_POST,IS_AJAX。可以根据这几个变量判断是初次加载的页面还是请求提交的页面。
session & cookie
session赋值和取值和删除 session('id',1); session('id'); session('id',null); 判断是否存在: session('?id')//用的很多 cookie用法相同,只是在赋值的时候有第三个参数时效(s)图像处理
打开图片: $img=new Image(); $img->open('./Public/img/1.jpg'); 裁剪图片: $img->crop(400,400,200,0,200,200); 参数2-6个,宽高-[起点]-[压缩后宽高] 添加水印: $img->water(‘filepath’,’position’,’透明度’); position 5是右下,1是左上,不写为5验证码
产生验证码: $verify=new Verify(); $verify->entry(); 调整参数 $c=['length'=>3,'useNoise'=>false,'charSet'=>'1234']; new Verify($c);即可 显示验证码: img标签的src属性写上该行为即可 校验验证码: new Verify()->check(); 校验的机制基于session,所以同一电脑同一浏览器新开网页后,前一个验证码失效。entry和check也可以带参数,以区分同意应用下不同页面的验证码输入。文件上传
首先要创建./Uploads文件夹 前端: <form method="post" action="{:U('upload')}" enctype="multipart/form-data"> <input type="file" name="photo"/> <input type="submit" value="submit"> </form> 服务端: public function upload(){$upload=new Upload(); $upload->maxSize=3145728; $upload->exts=['txt','js']; $upload->saveName='upfile'; $info=$upload->upload(); if(!$info){ echo $upload->getError(); } else{ echo '上传成功'; } }分页
$page=new Page(总条数,每页条数); $model->limit($page->firstRow,$page->listRows)->select(); 其实没啥用,不如自己写的灵活性高。缓存
变量数据缓存: S('name',$data,10); 文件静态缓存: 配置文件中设置HTML静态缓存: 'HTML_CACHE_ON'=>true, 'HTML_CACHE_TIME'=>60,