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();
}