上一篇的隨筆寫的是基本操作,現在可以做一些高級操作,例如有條件的查詢數據,有分頁的條件查詢數據
一、一個條件的查詢數據
查詢數據自然是先要顯示出數據,然后根據條件進行查詢數據
(1)顯示出表的數據
這個方法我還是寫在了HomeController.class控制器文件中
(1.1)寫了一個方法shouye()
public function shouye() { $n = M("nation"); //數據庫中的表 $arr = $n->select(); //查詢表中的所有數據 $this->assign("shuju",$arr); //將二維數組注入變量 $this->show(); //顯示數據 }
(1.2)方法寫完了之后,下面就是寫顯示頁面了,這個名字和方法名一致
這里我們用表格來顯示一下數據
<table width="50%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>代號</td> <td>名稱</td> <td>操作</td> </tr>
<!--注意:這里的循環沒有{}這是和smarty模板的區別--> <foreach name="shuju" item="v" > <!--參數name是php頁面中的注入的名字,item是賦值的量--> <tr> <td>{$v.code}</td> <!--這就是顯示的code列--> <td>{$v.name}</td> <!--這是顯示的name列--> <td>操作</td> </tr> </foreach> </table>
下面運行看下效果:注意地址欄的書寫:http://localhost/tp/index.php/Home/Home/shouye
(2)添加查詢條件
(2.1)這樣的話就要添加查詢的文本框和查詢按鈕了,我們添加在表的前面
這里用表單來寫,因為提交嘛,所以用表單進行寫
<form action="__ACTION__" method="post"> <div> 根據名稱查詢:<input type="text" name="name" /> <input type="submit" value="查詢"/> </div> </form>
看下顯示效果
(2.2)顯示出來之后,就是后面的處理頁面了
這個查詢和添加、修改的邏輯處理方式還不一樣,這里就不用if判斷了
public function shouye() { $tj = " 1=1 "; //條件恆成立 if(!empty($_POST["name"])) //判斷傳過來的name值是不是空的 { $name = $_POST["name"]; $tj = " Name like '%{$name}%' "; //修改$tj的值 } $n = M("nation"); $arr = $n->where($tj)->select(); //因為是tp框架,所以直接可以調用這個條件,用where()方法 $this->assign("shuju",$arr); $this->show(); }
這樣運行一下,然后查看一下結果
查詢一下“回”的信息,可以實現這個查詢
(2.3)可以在這個查詢中添加分頁,也就是分頁的顯示
1.這里我們引用一下以前寫過的page分頁的類,先把這個page的類放到自己的模塊下面,我放在了這里
打開這個類文件,修改一下命名空間如下所示:
然后關閉就可以了。
2.在shouye()方法中調用Page類
2.1首先要調用這個page類
2.2這個類要有兩個參數:分頁的總條數,顯示的條數
$page = new \Home\shuju\page($zts,2); //第一個參數:數據總條數;第二個參數是顯示幾條
2.3總條數:查詢也是要顯示總條數
$zts = $n->where($tj)->count(); //總條數也要包括查詢
2.4在limit這里要對源文件,進行修改
$page->limit; //LIMIT 10,3
這樣的話會多着個limit,那么在page.class.php源文件中刪除就可以
2.5查詢所有條件時加上這個limit($page->limit)方法
$arr = $n->where($tj)->limit($page->limit)->select();
2.6注入變量(將分頁的信息顯示信息注入)
$this->assign("fenye",$page->fpage()); //page的fpage分頁的顯示信息
看下總的這個shouye()的方法,上面的綜合
public function shouye() { $tj = " 1=1 "; if(!empty($_POST["name"])) { $name = $_POST["name"]; $tj = " Name like '%{$name}%' "; } $n = M("nation"); $zts = $n->where($tj)->count(); //總條數也要包括查詢 $page = new \Home\shuju\page($zts,2); //第一個參數:數據總條數;第二個參數是顯示幾條 //$page->limit; //LIMIT 10,3 $arr = $n->where($tj)->limit($page->limit)->select(); //這是顯示的分頁 $this->assign("shuju",$arr); //注入變量(總的數據的) $this->assign("fenye",$page->fpage()); //注入變量(分頁的顯示信息) $this->show(); }
2.7在顯示頁面,顯示這個變量
<div>{$fenye}</div>
看先運行結果,是有了分頁信息
但是這樣有個缺陷,就是在查詢一個條件時,第一條是顯示的總條數是正確的額,但是后面的是錯誤的,那么就是要修改代碼
注意:將數據的傳輸方式修改(post修改為get)
3.查詢的文本框顯示默認值
這里在條件恆成立下,定義一個name值為空,然后在注入變量
在顯示頁面的文本框的中,添加value值是前面注入的變量
注意:
1.看下完整的php頁面的代碼
public function shouye() { $tj = " 1=1 "; $name = ""; if(!empty($_POST["name"])) { $name = $_POST["name"]; $tj = " Name like '%{$name}%' "; } $n = M("nation"); $zts = $n->where($tj)->count(); //總條數也要包括查詢 $page = new \Home\shuju\page($zts,2); //第一個參數:數據總條數;第二個參數是顯示幾條 //$page->limit; //LIMIT 10,3 $arr = $n->where($tj)->limit($page->limit)->select(); //這是顯示的分頁 $this->assign("shuju",$arr); //注入變量(總的數據的) $this->assign("fenye",$page->fpage()); //注入變量(分頁的顯示信息) $this->assign("name",$name); //將name的值注入變量 $this->show(); }
2.顯示頁面的整體內容
<form action="__ACTION__" method="get"> <div> 根據名稱查詢:<input type="text" name="name" value="{$name}"/> <input type="submit" value="查詢"/> </div> </form> <br /> <table width="50%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>代號</td> <td>名稱</td> <td>操作</td> </tr> <foreach name="shuju" item="v" > <tr> <td>{$v.code}</td> <td>{$v.name}</td> <td>操作</td> </tr> </foreach> </table> <div>{$fenye}</div>
這樣總的效果就已經結束了
進行查詢后,文本框顯示查詢的名字,顯示的條數也是會變換的
二、數據取值方式
1.寫一個方法,來進行數據的傳值差別:正常的GET方式取值
public function testget() { echo $_GET["name"]; }
在瀏覽器的地址欄地址中輸入:
(1)后面是:?名稱="值"
1.沒有傳值的話是空
http://localhost/tp/index.php/Home/Home/testget
輸出就是空的:
2.有值的傳值
http://localhost/tp/index.php/Home/Home/testget?name=%22%E4%BD%A0%E5%A5%BD%22
這樣就會輸出:你好
(2)后面是路徑的方式:/名稱/值
地址欄中輸入:
http://localhost/tp/index.php/Home/Home/testget/name/qqqqqq
輸出結果
注意:傳多值就是/名字/值/名字/值
2.給方法賦值的方式取值
public function testget($code) { echo $code; }
三、session方法和cookie方法
(1)session方法
1.默認情況下,初始化之后系統會自動啟動session,如果不希望系統自動啟動session的話,可以設置SESSION_AUTO_START
為false,例如:
'SESSION_AUTO_START' =>false
關閉自動啟動后可以項目的公共文件或者在控制器中通過手動調用session_start
或者session('[start]')
啟動session。
2.session賦值
session('name','value'); //設置session
3.session判斷
// 判斷名稱為name的session值是否已經設置 session('?name');
4.session管理
session('[pause]'); // 暫停session寫入 session('[start]'); // 啟動session session('[destroy]'); // 銷毀session session('[regenerate]'); // 重新生成session id
(2)cookie方法
Cookie設置
cookie('name','value'); //設置cookie cookie('name','value',3600); // 指定cookie保存時間
四、模板(三元運算)
模板可以支持三元運算符
{$status?'正常':'錯誤'} {$info['status']?$info['msg']:$info['error']}
注意:三元運算符中暫時不支持點語法。
五、AJAX返回
要使用ajax就要引用jQuery了,我們把jQuery拿進來
(1)我放到了Public文件夾下,新建一個js文件夾下
(2)然后就是在顯示的頁面調出這個js文件
<script src="__PUBLIC__/js/jquery-1.11.2.min.js"></script>
(3)看下這個文件是不是引入了
在瀏覽器的地址欄中輸入:http://localhost/tp/index.php/Home/Home/shouye
查看源代碼查看是不是引入了
點開之后要是能夠出現就是引入成功了
(4)在控制器中寫一個方法chuli,讓ajax返回這個方法
public function chuli() { }
(5)就要寫ajax了
<script type="text/javascript"> $.ajax({ url:"__CONTROLLER__/chuli", //處理方法的 dataType:"TEXT", success: function(data){ //成功之后的輸出的信息 } }) </script>
(6)在chuli方法頁面就要寫返回值了
public function chuli() { $this->ajaxReturn("hello","eval"); //返回的值,返回值的方式eval就是text方式 }
注意:如果是JSON/JSONP格式,會自動編碼成JSON字符串,如果是XML方式,會自動編碼成XML字符串,如果是EVAL方式的話,只會輸出字符串data數據。
完整的顯示頁面的代碼:
<script type="text/javascript"> $.ajax({ url:"__CONTROLLER__/chuli", dataType:"TEXT", success: function(data){ alert(data); //返回的信息 } }) </script>
看下效果:
也可以是關聯數組的數據,就不寫了
六、跳轉和重定向
(1)頁面跳轉
使用方法很簡單
$User = M('User'); //實例化User對象 $result = $User->add($data); if($result){ //設置成功后跳轉頁面的地址,默認的返回頁面是$_SERVER['HTTP_REFERER'] $this->success('新增成功', 'User/list'); } else { //錯誤頁面的默認跳轉頁面是返回前一頁,通常不需要設置 $this->error('新增失敗'); }
注意:success和error方法的第一個參數表示提示信息,第二個參數表示跳轉地址,第三個參數是跳轉時間(單位為秒)
// 操作完成3秒后跳轉到 /Article/index $this->success('操作完成','/Article/index',3); // 操作失敗5秒后跳轉到 /Article/error $this->error('操作失敗','/Article/error',5);
注意:跳轉地址是可選的,success方法的默認跳轉地址是$_SERVER["HTTP_REFERER"]
,error方法的默認跳轉地址是javascript:history.back(-1);
。
這就是tp框架的另外的一些知識和操作