1 模型
1.1 模型中的事务处理
public function test13(){
$model=D('Goods');
//开启事务
$model->startTrans();
$res1=$model->where('goods_id=4')->save(array('goods_name'=>'testAgain'));
$res2=$model->where('goods_id=5')->save(array('goods_name'=>'testAgain'));
if($res1!==false && $res2!==false){
$model->commit();//提交事务
}else{
$model->rollback();//事务回滚
}
}
1.2 TP的连贯操作
- 格式:模型对象->连贯方法->curd方法
public function test14(){
$model=D('Goods');
//where、field、alias、order、limit
//field:指定需要的字段信息
$model->field('goods_id,goods_name')->select();
echo 'field:'.$model->getLastSql().'<hr>';
//elias:指定表的别名
$model->alias('a')->field('goods_id,goods_name')
->where('a.goods_id>5')->select();
echo 'elias:'.$model->getLastSql().'<hr>';
//order:指定排序方式
$model->alias('a')->order('goods_id desc')->field('goods_id,goods_name')
->where('a.goods_id>5')->select();
echo 'order:'.$model->getLastSql().'<hr>';
//limit:限制条数
$model->alias('a')->order('goods_id desc')->limit(2,3)
->field('goods_id,goods_name')->where('a.goods_id>5')->select();
echo 'limit:'.$model->getLastSql().'<hr>';
}
1.3 连表查询
使用join方法(连接方式、指定数据表、连接字段)
public function test15(){
//join方法实现连表查询
//join(连接方式、指定数据表、链接字段)
$data=M('Stu')->alias('a')->field('a.*,b.class_name,b.class_room')->join('left join shop_class b on a.class_id=b.stu_id')->select();
dump($data);
}
1.4 TP使用原生SQL语句
- query:针对查询操作(select类型的SQL语句)。返回结果集
- execute:针对写入操作(添加、修改、删除)。返回受影响的行数
public function test16(){
$model=M();
$data=$model->query("select * from shop_stu");
dump($data);
$res=$model->execute("insert into shop_stu value(null,1,'吉喆R.I.P.')");
dump($res);
}
1.5 模型中的钩子函数
- 数据操作(写入、删除、修改)时会自动触发钩子函数。
- 钩子函数分前置和后置
- 前置在操作前执行,后置即在操作后执行
操作 | 前置 | 后置 |
---|---|---|
写入 | before_insert | after_insert |
修改 | before_updatet | after_update |
删除 | before_delete | after_delete |
在IndexController.php中写入:
public function test17(){
$model=D('Goods');
$res=$model->add(array('goods_name'=>'testNike'));
}
在GoodsModel.php中写入:
//数据写入的前置钩子函数
public function _before_insert(&$data,$options){
echo '_before_insert'.'<hr>';
dump($data);
dump($options);
}
//数据写入的后置钩子函数
public function _after_insert($data,$options){
echo '_after_insert'.'<hr>';
dump($data);
dump($options);
}
2 TP文件上传
- 源码地址:ThinkPHP\Library\Think\Upload.class.php
在add.html中写入:
<div class="formbody">
<form action="" method="post" enctype="multipart/form-data">
<ul class="forminfo">
<li><label>商品名称<input name="name" type="text" class="dfinput" /><i>标题不能超30个字符</i></label></li>
<li><label>图片价格<input name="goods_price" type="text" class="dfinput" /></label></li>
<li><label>图片地址<input name="pic" type="file" class="dfinput" value="jklj"/></label></li>
<li><label>内容<textarea name="body" cols="" rows="" class="textinput" ></textarea></label></li>
<li><label> <input name="submit" type="submit" class="btn" value="保存"/></label></li>
</ul>
</form>
</div>
在GoodsController.php中写入:
public function add(){
if(IS_GET){
$this->display();
}else{
//post表单提交
$model=D('Goods');
//定义自动完成规则
$auto=array(
array('addtime','time',1,'function')
);
$data=$model->auto($auto)->create();
//$this->display();
if(!$data){
//说明目前有数据格式不满足要求
//获取错误信息
$this->error(($model->getError()));
}
$res=$model->add($data);
if(!$res){
//写入失败
$this->error($model->getError());
}
$this->success('写入数据成功');
}
}
在GoodsModel.php中写入:
//数据写入的前置钩子函数
public function _before_insert(&$data,$options){
//实现文件上传功能
//1、实例化对象
$config=array(
'exts'=>array('jpg','gif'),//设置上传文件后缀限制
);
$upload=new \Think\Upload($config);
//2、使用对象调用方法实现上传功能
//关于文件上传根目录需要手动创建(在项目根目录创建Uploads目录)
$info=$upload->uploadOne($_FILES['pic']);
if(!$info){
//说明文件上传失败
$this->error=$upload->getError();
return false;
}
//将上传后的文件信息保存到$data中
$data['goods_img']='Uploads/'.$info['savepath'].$info['savename'];
}
- 测试:
-
在add.html写入数据
-
提交打印出信息
-
数据表数据添加成功
-
图片也保存成功
3 TP分页功能
3.1 分页前提
在GoodsController.php中写入:
public function index(){
$model=D('Goods');
//获取所有商品信息
$data=$model->select();
$this->assign('data',$data);
$this->display();
}
在Admin\View\Goods\index.html中写入:
<table class="table">
<thead>
<tr>
<th>编号</th>
<th>商品名称</th>
<th>图片信息</th>
<th>发布时间</th>
<th>内容</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<volist name="data" id="vo">
<tr>
<td>{$vo.goods_id}</td>
<td>{$vo.goods_name}</td>
<td><img src="/{$vo.goods_img}" height="50" width="50"></td>
<td>{$vo.addtime|date="Y-m-d H:i:s",###}</td>
<td>{$vo.goods_body}</td>
<td>
<a href="#" class="tablelink">查看</a>
<a href="#" class="tablelink">删除</a>
</td>
</tr>
</volist>
</tbody>
</table>
3.2 分页步骤
- 计算数据总数
- 实例化分页类
- 调用show方法计算分页导航
- 根据当前页码显示对应内容
修改GoodsController.php
public function index(){
$model=D('Goods');
//1、计算总记录数
$count=$model->count();
//2、实例化分页类对象
$pagesize=2;//每一页显示数据条数
$page=new \Think\Page($count,$pagesize);
//3、使用对象调用show方法获取分页导航信息
$show=$page->show();
$this->assign('show',$show);
//4、根据当前页,显示对应信息
$p=I('get.p');//等价于$_GET['p'],获取当前页码
//page方法可以根据当前页码以及每页显示条数自动计算偏移量
$data=$model->page($p,$pagesize)->select();
echo $model->getLastSql();
//获取所有商品信息
//$data=$model->select();
$this->assign('data',$data);
$this->display();
}
在Admin\View\Goods\index.html中添加:
<div class="pagin">
{$show}
</div>
4 TP中的会话技术
4.1 session
- session赋值
session(‘name’,‘value’);//设置session - session取值
$value=session(‘name’);
$value=-session(); //获取所有session信息 - session删除
session(‘name’,null);
session(null);//全部删除
//session设置操作
public function sets(){
session('goods_id','342');
$_SESSION['name']='leo';//按照原生方式使用
}
public function gets(){
dump(session());
}
public function delS(){
session('goods_id',null);
}
4.2 cookie
- cookie赋值
session(‘name’,‘value’);//设置cookie
session(‘name’,‘value’,3600);//指定cookie有效期 - cookie取值
$value=cookie(‘name’); - cookie删除
cookie(‘name’,null);
cookie(null);//清空当前设定前缀的所有cookie
cookie(null,‘think_’);//清空指定前缀的所有cookie
//cookie设置操作
public function setC(){
//默认不指定有效时间,表示cookie关闭浏览器失效
cookie('dirtyWord','damn','expire=3600');
}
public function getC(){
dump(cookie('dirtyWord'));
}
public function delC(){
cookie('dirtyWord',null);
}
5 TP的验证码
- 注意确保gd库开启
- 步骤
- 实例化验证码对象
- 使用对象调用entry方法生成验证码
- 使用check方法检查验证码是否匹配
//生成验证码
public function test18(){
$config=array(
'length'=>4,
);
$obj=new \Think\Verify($config);
$obj->entry();
}