thinkphp筆記,thinkphp
M 項目目錄/應用目錄/Lib/Model
V 項目目錄/應用目錄/Tpl
C 項目目錄/應用目錄/Lib/Action
1.PATHINFO 模式 http://域名/項目名/入口文件/模塊名/方法名/鍵1/值1/鍵2/值2
2.普通模式 http://域名/項目名/入口文件?m=模塊名&a=方法名&鍵1=值1&鍵2=值2
3.REWRITE模塊 http://域名/項目名/模塊名/方法名/鍵1/值1/鍵2/值2
4.兼容模式 http://域名/項目名/入口文件?s=模塊名/方法名/鍵1/值1/鍵2/值2
<?php
// 本類由系統自動生成,僅供測試用途
class IndexAction extends Action {
public function index(){
echo "hello world";
}
public function add(){
echo "你好,吳昊<br>";
echo '你好'.$_GET['name'].'你的年齡是'.$_GET['age'];
}
}
http://localhost/test/index.php/Index/add?name=wuhao
http://localhost/test/index.php/Index/add/name/wuhao
http://localhost/test/index.php/Index/add/name/wuhao/age/18
'URL_PATHINFO_DEPR'=>'-', //修改URL的分隔符
'TMPL_L_DELIM'=>'<{', //修改左定界符
'TMPL_R_DELIM'=>'}>', //修改右定界符
http://localhost/test/index.php/Index-add-name-wuhao-age-23
http://localhost/test/index.php/Index/index
http://localhost/test/index.php/Index/add
public function add(){
/*echo "你好,吳昊<br>";
echo '你好'.$_GET['name'].'你的年齡是'.$_GET['age'];*/
$name='吳昊';
$this->assign('myname',$name);
//$this->myname='abc';
$this->display();
}
<meta http-equiv="content-type" content="text/html;charset=utf-8">
一些動態的數據可以通過assign()方法分配給模板顯示
<h1>訪問了add方法。</h1>
<p>你好!{$myname}</p>
D:\wamp\www\test\App\Tpl\Index
需要在方法中通過new Model(表名)的形式操作數據庫
$m=new Model('User');
$arr=$m->select();
'DB_TYPE'=>'mysql', //設置數據庫類型
'DB_HOST'=>'localhost',//設置主機
'DB_NAME'=>'thinkphp',//設置數據庫名
'DB_USER'=>'root', //設置用戶名
'DB_PWD'=>'', //設置密碼
'DB_PORT'=>'3306', //設置端口號
'DB_PREFIX'=>'tp_', //設置表前綴
'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置數據庫信息 ,優先級比傳統方式高
$user=new Model('User');
$arr=$user->select();
var_dump($arr);
$this->display();
'SHOW_PAGE_TRACE'=>true,//開啟頁面Trace
還有一種簡單實用模型的方式
M() 等效為 new Model();
$m=M('User');
$arr=$m->select();
使用模型的實例可以對數據進行操作,操作的工作一般就是對數據庫進行 增刪改查 CURD
增 -C Create $m->add()
刪 -D Delete $m->delete()
改 -U Update $m->save()
查 -R Read $m->select()
a、模板可以遍歷數組
<volist name='data' id='vo'>
{$vo.id}----{$vo.username}-----{$vo.sex}<br/>
</volist>
b、我們可以開啟調試功能中的page_trace
1.開啟調試功能
define('APP_DEBUG',true);
2.我們需要設置配置文件,開啟頁面trace
'SHOW_PAGE_TRACE'=>true,//開啟頁面Trace
讀取數據
對數據的讀取 Read
$m=new Model('User');
$m=M('User');
select:$m->select(); //獲取所有數據,以數組形式返回
find:$m->find($id); //獲取單條數據
getField(字段名) //獲取一個具體的字段值
$arr=$m->where('id=2')->getField('username');
創建數據
對數據的添加 Create
$m=new Model('User');
$m=M('User');
$m->字段名=值
$m->add(); 返回值是新增的id號
刪除數據
$m=M('User');
$m->delete(2); //刪除id為2的數據
$m->where('id=2')->delete(); 返回值是受影響行數
更新數據
$m=M('User');
$data['id']=1;
$data['username']='ztz2';
$m->save($data); 返回值是受影響行數
CURD演示:
==================================================================================================================================================================================================
查詢方式:
一、普通查詢方式
a、字符串
$arr=$m->where("sex=0 and username='gege'")->find();
b、數組
$data['sex']=0;
$data['username']='gege';
$arr=$m->where($data)->find();
注意:這種方式默認是and的關系,如果使用or關系,需要添加數組值:$data['_logic']='or';
二、表達式查詢方式
$data['id']=array('lt',6); $arr=$m->where($data)->select();
EQ 等於,NEQ不等於, GT 大於,EGT大於等於, LT 小於,ELT小於等於,LIKE 模糊查詢
$data['username']=array('like','%ge'); $arr=$m->where($data)->select();
NOTLIKE
$data['username']=array('notlike','%ge%'); $arr=$m->where($data)->select();
注意:如果一個字段要匹配多個通配符
$data['username']=array('like',array('%ge%','%2%','%五%'),'and'); //如果沒有第三個值,默認關系是or關系
BETWEEN
$data['id']=array('between',array(5,7)); $arr=$m->where($data)->select();
//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )
$data['id']=array('not between',array(5,7)); $arr=$m->where($data)->select();
IN
$data['id']=array('in',array(4,6,7)); $arr=$m->where($data)->select();
//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )
$data['id']=array('not in',array(4,6,7)); $arr=$m->where($data)->select();
//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )
三、區間查詢
$data['id']=array(array('gt',4),array('lt',10)); //默認關系是 and 的關系
//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) )
$data['id']=array(array('gt',4),array('lt',10),'or') //關系就是or的關系
$data['name']=array(array('like','%2%'),array('like','%五%'),'gege','or');
四、統計查詢
count //獲取個數;max //獲取最大數;min //獲取最小數;avg //獲取平均數;sum //獲取總和
五、SQL直接查詢
a、query 主要是處理讀取數據的:成功返回數據的結果集,失敗返回boolean false
$m=M();
$result=$m->query("select * from t_user where id >50");
var_dump($result);
b、execute 用於更新個寫入操作:成功返回影響行數,失敗返回boolean false
$m=M();
$result=$m->execute("insert into t_user(`username`) values('ztz3')");
var_dump($result);
'DB_LIKE_FIELDS'=>'title|content' //查詢語句中條件自動變為模糊查詢%%
查詢方式演示:
==================================================================================================================================================================================================
常用連貫操作
1.where 幫助我們設置查詢條件
2.order 對結果進行排序
$arr=$m->order('id desc')->select(); $arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();
3.limit 限制結果
limit(2,5) limit('2,5') limit(10) //limit(0,10)
4.field 設置查詢字段
field('username as name,id') field(array('username'=>'name','id')
field('id',true) //獲取除了id以外的所有字段
5.table
6.group
7.having
二、補充
alias 用於給當前數據表定義別名 字符串
page 用於查詢分頁(內部會轉換成limit) 字符串和數字
join* 用於對查詢的join支持 字符串和數組
union* 用於對查詢的union支持 字符串、數組和對象
distinct 用於查詢的distinct支持 布爾值
lock 用於數據庫的鎖機制 布爾值
cache 用於查詢緩存 支持多個參數(以後在緩存部分再詳細描述)
relation 用於關聯查詢(需要關聯模型擴展支持) 字符串
validate 用於數據自動驗證 數組
auto 用於數據自動完成 數組
filter 用於數據過濾 字符串
scope* 用於命名范圍 字符串、數組
==================================================================================================================================================================================================
視圖:
一、模板的使用
a、規則
模板文件夾下[TPL]/[分組文件夾/][模板主題文件夾/]和模塊名同名的文件夾[Index]/和方法名同名的文件[index].html(.tpl)
更換模板文件的後綴名(修改配置文件)
'TMPL_TEMPLATE_SUFFIX'=>'.html', //更改模板文件後綴名
b、修改模板文件目錄層次
'TMPL_FILE_DEPR'=>'_', //修改模板文件目錄層次
c、模板主題
'DEFAULT_THEME'=>'your', //設置默認模板主題
需要在TPL下面新建一個your文件夾作為模板主題文件夾
如何動態修改模板主題?
1、在後台准備一個功能,修改config.php文件中的默認模板項
2、通過url傳遞 t=主題 參數可以修改不同的模板
'DEFAULT_THEME'=>'your',//設置默認模板主題
'TMPL_DETECT_THEME'=>true,//自動偵測模板主題
'THEME_LIST'=>'your,my',//支持的模板主題列表
http://localhost/test/index.php/Index/index/t/my http://localhost/test/index.php/Index/index/t/you
二、輸出模板內容
a、display
1.display中沒有參數:$this->display();
2.可以帶參數
$this->display(本模塊文件夾下的其他模板文件);
$this->display('index2');
$this->display(其他文件夾下的模板文件);
$this->display('Public:error'); //注意,僅僅需要在Tpl下有Public文件夾以及其中的error.html即可,不需要一定有Public模塊
$this->display(其他主題下的 文件夾下的 模板文件); //需要開啟主題支持
$this->display('my:Index:index');
$this->display(一個URL路徑);
$this->display('./Public/error.html');
$this->display('./Public/error.html','utf-8','text/xml');
$this->show($content);
3.fetch方法
獲得模板文件中的內容,以字符串形式返回:$content=$this->fetch('Public:error');
4.show方法
不需要模板文件,可以直接輸出模板內容
$content=$this->fetch('Public:error');
dump($content);
$content=str_replace('h1','i',$content);
$this->show($content);
三、模板中的賦值
//$this->assign('name','趙桐正');
$this->name='趙桐正2'; $this->display();
四、模板替換
__PUBLIC__:會被替換成當前網站的公共目錄 通常是 /Public/
__ROOT__: 會替換成當前網站的地址(不含域名)
__APP__: 會替換成當前項目的URL地址 (不含域名)
__GROUP__:會替換成當前分組的URL地址 (不含域名)
__URL__: 會替換成當前模塊的URL地址(不含域名)
__ACTION__:會替換成當前操作的URL地址 (不含域名)
__SELF__: 會替換成當前的頁面URL
更換模板變量規則,修改配置項
'TMPL_PARSE_STRING'=>array( //添加自己的模板變量規則
'__CSS__'=>__ROOT__.'/Public/Css',
'__JS__'=>__ROOT__.'/Public/Js',
),
登錄框實例:
引入擴展類,把ThinkPHP3.1.2_Extend裡面的文件放在D:\wamp\www\test\ThinkPHP\Extend文件夾下。
對應的js和css:
D:\wamp\www\test\Public\Css ·D:\wamp\www\test\Public\Js
==================================================================================================================================================================================================
模板中的變量:
一、變量輸出
1.標量輸出
2.數組輸出
{$name[1]} {$name['k2']} {$name.k1}
3.對象輸出
{$name:k} {$name->k}
二、系統變量
用法 | 含義 | 例子 |
$Think.server
獲取$_SERVER
{$Think.server.php_self}
$Think.get
獲取$_GET
{$Think.get.id}
$Think.post
獲取$_POST
{$Think.post.name}
$Think.request
獲取$_REQUEST
{$Think.request.user_id}
$Think.cookie
獲取$_COOKIE
{$Think.cookie.username}
$Think.session
獲取$_SESSION
{$Think.session.user_id}
$Think.config
獲取系統配置參數
{$Think.config.app_status}
$Think.lang
獲取系統語言變量
{$Think.lang.user_type}
$Think.const
獲取系統常量
{$Think.const.app_name}或{$Think.APP_NAME}
$Think.env
獲取環境變量
{$Think.env.HOSTNAME}
$Think.version
獲取框架版本號
{$Think.version}
$Think.now
獲取當前時間
{$Think.now}
$Think.template
獲取當前模板
{$Think.template}
$Think.ldelim
獲取模板左界定符
{$Think.ldelim}
$Think.rdelim
獲取模板右界定符
{$Think.rdelim}
三、使用函數
{$name|strtoupper} 生成的編譯後文件是: <?php echo (strtoupper($name)); ?>
{$name|date='Y m d H:i:s',###}
四、默認值
{$name|default='這裡是默認值'}
五、運算符
+ - * / % ++ -- {$name++}
模板中的基本語法:
一、導入CSS和JS文件
1、<link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/test.css'/>
<script src='__PUBLIC__/Js/test.js'></script>
2.import
<import type='js' file='Js.test' /> //導入Public文件夾下面的Js目錄中的test.js文件,import標簽可以省略type屬性,默認就是js的
<import type='css' file='Css.test' />
<import type='js' file='Js.my' basepath='./Other'/> //可以更改默認文件夾 設置basepath屬性
3.load
<load href='__PUBLIC__/Js/test.js' /> //方法可以自動檢測導入的文件類型
二、分支結構
<if condition='$age lt 18'>
未成年
<elseif condition='$age eq 18'/>
青春年少
<else />
成年
</if>
> gt < lt == eq <= elt >= egt != neq === heq !== nheq
<switch name='number'>
<case value='1'>一個和尚挑水吃</case>
<case value='2'>兩個和尚台水吃</case>
<case value='3'>三個和尚沒水吃</case>
<default/> 這裡是默認值
</switch>
三、循環結構
1.for
<table border='1' width='500'>
<for start='10' end='00' name='j' step='-2' comparison='gt'>
<tr><td>{$j}</td><td>abc</td></tr>
</for>
</table>
2.volist
<volist name='list' id='v'>
{$v.username}<br/>
</volist>
3.foreach
$user=M('User1');
$arr=$user->select();
$this->assign('list',$arr);
$this->display();
<foreach name='list' item='v'>
<tr>
<td>{$v.id}</td>
<td>{$v.username}</td>
<td>{$v.sex}</td>
<td>{$v.password}</td>
</tr>
</foreach>
四、特殊標簽
1、比較標簽
eq或者 equal 等於 neq 或者notequal 不等於 gt 大於 egt 大於等於 lt 小於 elt 小於等於 heq 恆等於 nheq 不恆等於
2.范圍標簽
in
<in name='n' value='9,10,11,12'>在這些數字裡面<else/>不在這些數字的范圍內</in>
<notin name='n' value='9,10,11,12'>在這些數字裡面<else/>不在這些數字的范圍內</in>
between
<notbetween name='n' value='1,10'>{$n}在1-10之間<else/>{$n}不在1到10之間</between>
3.present:標簽來判斷模板變量是否已經賦值,
<present name='m'>m有賦值<else/>m沒有賦值</present>
4.Empty:empty標簽判斷模板變量是否為空,
<empty name='n'>n為空賦值<else/>n有值</empty>
5.Defined: 判斷常量是否已經定義
6.Define:在模板中定義常量
7.Assing: 模板中變量賦值
五、其他標簽使用
1、在模板中直接使用PHP代碼
<php> echo "我是趙桐正" </php>
2、建議更改左右定界符
在配置文件中改變
'TMPL_L_DELIM'=>'<{', //修改左定界符
'TMPL_R_DELIM'=>'}>', //修改右定界符
模板的使用技巧:
一、模板包含
<include file="完整模板文件名" />
<include file="./Tpl/default/Public/header.html" />
<include file="read" />
<include file="Public:header" />
<include file="blue:User:read" />
<include file="$tplName" />
<include file="header" title="ThinkPHP框架"keywords="開源WEB開發框架"/>
在模板中變量用[變量]接受:<include file='file1,file2' />
二、模板渲染
1、自動開啟模板渲染 設置配置文件
'LAYOUT_ON'=>true, //開啟模板渲染
准備一個模板渲染頁面,在頁面中使用{__CONTENT__}接受具體模板頁面的內容
如果在某一個具體模板中不希望使用渲染模板,可以在頁首添加{__NOCONTENT__}
2、不開啟自動模板渲染可以在每一個具體頁面的頁首添加:<layout name='layout'/>
3.使用技巧:在渲染模板文件中也可以使用其他模板文件的內容
<include file='Public:header'/>
<body>
<p>這裡是渲染頁面!!!</p>
{__CONTENT__}
</body>
</html>
三、模板的繼承
==================================================================================================================================================================================================
控制器的模塊和操作:
一、空模塊和空操作
1、空操作
function _empty($name){
$this->show("$name 不存在 <a href='__APP__/Index/index'>返回首頁</a>");
}
2.空模塊
class EmptyAction extends Action{
function index(){
$city=M('City');
$arr=$city->select();
$this->assign('list',$arr);
$name=MODULE_NAME;
$this->display("City:$name");
}
}
二、前置操作和後置操作
1、前置操作: _before_操作名
2、後置操作: _after_操作名
==================================================================================================================================================================================================
URL:
'URL_CASE_INSENSITIVE'=>true,//url不區分大小寫
'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制偽靜態的後綴
一、URL規則
1、默認是區分大小寫的
2、如果我們不想區分大小寫可以改配置文件
'URL_CASE_INSENSITIVE'=>true, //url不區分大小寫
3、如果模塊名為 UserGroupAction
那麼url找模塊就必要要寫成
http://localhost/thinkphp4/index.php/user_group/index
4、如果'URL_CASE_INSENSITIVE'=>false
那麼url也可以寫為
http://localhost/thinkphp4/index.php/UserGroup/index
二、URL偽靜態
'URL_HTML_SUFFIX'=>'html|shtml|xml', //限制偽靜態的後綴
三、URL路由
1、啟動路由
要在配置文件中開啟路由支持
2、使用路由
1.規則表達式配置路由
'my'=>'Index/index', //靜態地址路由
':id/:num'=>'Index/index', //動態地址路由
'year/:year/:month/:date'=>'Index/index', //動態和靜態混合地址路由
'year/:year\d/:month\d/:date\d'=>'Index/index', //動態和靜態混合地址路由
加上 \d代表類型只能是數字
'my/:id$'=>'Index/index', // 加上$說明地址中只能是 my/1000 後面不能有其他內容了
2.正則表達式配置路由
'/^year\/(\d{4})\/(\d{2})\/(\d{2})/'=>'Index/index?year=:1&month=:2&date=:3'
3、注意事項:
1.越復雜的路由越往前面放
'URL_ROUTE_RULES'=>array(
'my/:year/:month:/:day'=>'Index/day',
'my/:id\d'=>'Index/index',
'my/:name'=>'Index/index',
)
2.可以使用$作為完全匹配的路由規則
'URL_ROUTE_RULES'=>array(
'my/:id\d$'=>'Index/index',
'my/:name$'=>'Index/index',
'my/:year/:month:/:day$'=>'Index/day',
),
3.用正則匹配的方式
'URL_ROUTE_RULES'=>array(
'/^my\/(\d+)$/'=>'Index/index?id=:1',
'/^my\/(\w+)$/'=>'Index/index?name=:1',
'/^my\/(\d{4})\/(\d{2})\/(\d{2})$/'=>'Index/day?year=:1&month=:2&day=:3',
),
四、URL重寫
五、URL生成
頁面跳轉
$this->success('查詢成功',U('User/test'));
$this->redirect('User/test','',5,'頁面正在跳');
'APP_GROUP_LIST' => 'Home,Admin', //項目分組設定
'DEFAULT_GROUP' => 'Home', //默認分組
==================================================================================================================================================================================================