ThinkPHP入门
ThinkPHP項(xiàng)目的創(chuàng)建
<?php include "../../ThinkPHP/ThinkPHP.php";在index.php中導(dǎo)入ThinkPHP.php即可,會(huì)自動(dòng)創(chuàng)建目錄。
tp創(chuàng)建流程分析
1. 入口文件index.php2. ThinkPHP/ThinkPHP.phprequire THINK_PATH.'Common/runtime.php';3. ThinkPHP/Common/runtime.php聲明許多常量信息加載系統(tǒng)核心類文件if(is_file($file)) require_cache($file);自動(dòng)創(chuàng)建應(yīng)用目錄build_app_dir();Think::Start(); 4. ThinkPHP/lib/Core/Think.class.phpstatic function start(){}Think::buildApp(); // 預(yù)編譯項(xiàng)目引入相關(guān)配置文件App::run(); 5. ThinkPHP/lib/Core/App.class.phpstatic public function run(){}App::init();Dispatch分析路由分析路由(控制器MODULE_NAME 方法ACTION_NAME) index.php?c=控制器&a=方法App::exec();通過反射ReflectionMethod使得控制器對(duì)象調(diào)用對(duì)應(yīng)的方法PHP中的反射
<?phpclass Person{public $name = "xiaoming";function say(){echo "I am ".$this->name;}function run($addr,$age){echo "I am ".$this->name;echo ",I at ".$addr;echo ", my age is ".$age;echo ",running";} } $per = new Person; //$per -> say();//利用反射實(shí)現(xiàn)對(duì)象調(diào)用方法 //$md = new ReflectionMethod(類名,方法名); //反射方法對(duì)象 //反射好處:可以獲得 方法的屬性(是否公開的、私有的、受保護(hù)的等等) //$md = new ReflectionMethod("Person","say"); //讓指定的對(duì)象調(diào)用這個(gè)方法 //$md -> invoke($per);//通過反射執(zhí)行帶參數(shù)的方法 $mda = new ReflectionMethod("Person","run"); $mda -> invokeArgs($per,array('beijing',23));空操作和空模塊
tp框架把MVC中的控制器稱作是模塊(module) index.php?m=控制器&a=操作
http://網(wǎng)址/index.php/User/login 正常請(qǐng)求
http://網(wǎng)址/index.php/User/beijing “空操作”請(qǐng)求
http://網(wǎng)址/index.php/American/login “空模塊”
用戶訪問一個(gè)控制器中不存在的方法,就是空操作。
實(shí)例化對(duì)象,這個(gè)對(duì)象去調(diào)用類里邊不存在的方法
在OOP中有魔術(shù)方法,__call(),自動(dòng)調(diào)用方法,
對(duì)象調(diào)用類中不存在方法要統(tǒng)一走這個(gè)方法
2.空操作處理:
a)在對(duì)應(yīng)的控制器里邊定義方法_empty()
b)給應(yīng)用添加一個(gè)函數(shù)名字是:__hack_action() 推薦使用
應(yīng)用函數(shù)庫(kù)文件:shop/Common/common.php
3.空模塊(空控制器)
tom=newAmerican();tom是不存在的對(duì)象
處理方式:
①定義函數(shù)__hack_module() 推薦使用
②給系統(tǒng)定義空模塊:EmptyAction.class.php
跨模塊調(diào)用
一個(gè)控制器可以實(shí)例化另一個(gè)控制器,并調(diào)用其相關(guān)方法
/系統(tǒng)有自動(dòng)加載機(jī)制,會(huì)完成控制器類的引入// ThinkPHP/Lib/Core/Think.class.php//$user = new UserAction();//echo $user -> number();//系統(tǒng)給我們提供快捷函數(shù),實(shí)現(xiàn)控制器的實(shí)例化//A('控制器標(biāo)志')//A('[項(xiàng)目://][分組/]控制器');//A() ThinkPHP/Common/common.php$user = A('home/User');echo $user -> number();$indx = A("book://Index");echo $indx -> apple();//R("[項(xiàng)目://][分組/]模塊/操作方法") 跨模塊調(diào)用函數(shù)//實(shí)例化控制器并直接調(diào)用相關(guān)方法//R()方法有封裝A()方法,之后利用對(duì)象調(diào)用相關(guān)操作echo R("home/User/number");echo R("book://Index/apple",array('hello','world'));ThinkPHP數(shù)據(jù)庫(kù)操作
在config.php中配置
//數(shù)據(jù)庫(kù)配置'DB_TYPE' => 'mysql', // 數(shù)據(jù)庫(kù)類型'DB_HOST' => 'localhost', // 服務(wù)器地址'DB_NAME' => 'shop', // 數(shù)據(jù)庫(kù)名'DB_USER' => 'root', // 用戶名'DB_PWD' => '111111', // 密碼'DB_PORT' => '', // 端口'DB_PREFIX' => 'sw_', // 數(shù)據(jù)庫(kù)表前綴'DB_FIELDTYPE_CHECK' => false, // 是否進(jìn)行字段類型檢查////處于性能考慮,把數(shù)據(jù)表字段放入緩存里邊,//這樣下次訪問就避免執(zhí)行sql語(yǔ)句重復(fù)執(zhí)行重新獲取//開發(fā)調(diào)試模式APP_DEBUG=true,下邊緩存無(wú)效//生產(chǎn)模式APP_DEBUG=false,緩存有效'DB_FIELDS_CACHE' => true, // 啟用字段緩存//修改模板引擎為smarty'TMPL_ENGINE_TYPE' => 'Smarty', // 默認(rèn)模板引擎 //在頁(yè)面底部顯示日志信息'SHOW_PAGE_TRACE' => true, // 顯示頁(yè)面Trace信息實(shí)例化數(shù)據(jù)模型model的三種方法
1.goodsmodel=newGoodsModel();2.goods_model = D(“Goods”); 快捷函數(shù)
a)obj=D();//創(chuàng)建了一個(gè)基類model的對(duì)象,沒有指明具體操作的數(shù)據(jù)表b)通過這個(gè)obj就可以執(zhí)行原生的sql語(yǔ)句
3.model=M();創(chuàng)建基類model對(duì)象a)model = M(‘User’); 創(chuàng)建基類model對(duì)象,但是操作的數(shù)據(jù)表sw_user
查詢數(shù)據(jù)信息
① Model.class.php類本身就存在該方法,例如(where() field() limit() select())
② __call()自動(dòng)調(diào)用方法集成了一些方法,例如(table() order() group())
這些方法可以進(jìn)行連貫操作info=obj -> where()->order()->limit()->select()
1.select() 返回二維數(shù)組
2.find() 返回一維數(shù)組
3.getByXXX(); 根據(jù)指定字段進(jìn)行數(shù)據(jù)查詢
返回一維數(shù)組
getByGoods_price(12000);
getByGoods_name(); 魔術(shù)__call();
4.having() 設(shè)置查詢條件
與where比較類似
select * from sw_goods where goods_price>100;
select * from sw_goods having goods_price >100;
model聚合函數(shù)使用
count() sum() max() avg() min()
執(zhí)行原生sql語(yǔ)句
model?>query()查詢語(yǔ)句(二維數(shù)組返回)model -> execute() 增加、修改、刪除
insert update delete
成功執(zhí)行返回受影響的記錄數(shù)目
添加數(shù)據(jù)add
兩種方式實(shí)現(xiàn)數(shù)據(jù)添加:數(shù)組方式、AR方式
AR規(guī)則:
1.數(shù)據(jù)庫(kù)中的每個(gè)數(shù)據(jù)表都對(duì)應(yīng)一個(gè)類,model
2.數(shù)據(jù)表中的每條記錄都是類的一個(gè)對(duì)象
3.記錄信息的每個(gè)字段都是對(duì)象的屬性
在tp框架中AR模型是假的
數(shù)據(jù)查詢有options屬性匯集各種連貫查詢條件
數(shù)據(jù)添加有data屬性實(shí)現(xiàn)各種信息的收集
通過表單form實(shí)現(xiàn)數(shù)據(jù)添加
function add(){$goods_model = D("Goods");//判斷是否提交表單if(!empty($_POST)){//數(shù)據(jù)添加//foreach($_POST as $k => $v){// $goods_model -> $k = $v;//}$goods_model -> create(); //tp框架本身收集表單數(shù)據(jù)方法$rst = $goods_model -> add();if($rst){$this -> success('添加成功',__URL__."/showlist");}} else {$this -> display();}}修改數(shù)據(jù)
查詢:select() 添加:add()
修改關(guān)鍵字:save() 返回受影響的記錄數(shù)目
添加數(shù)據(jù):數(shù)組 和 AR
修改數(shù)據(jù):數(shù)組 和 AR
注意:實(shí)現(xiàn)數(shù)據(jù)修改必須符合兩個(gè)條件(主鍵id 或 where條件)
具體案例實(shí)現(xiàn)update
以前:http://網(wǎng)址/index.php?m=控制器&a=操作&goods_id=100&goods_price=2300
現(xiàn)在:http://網(wǎng)址/index.php/控制器/操作/參數(shù)1/值/參數(shù)2/值/參數(shù)3/值。。。。。。
tp框架中表單域驗(yàn)證
表單驗(yàn)證:
通過tp框架進(jìn)行表單驗(yàn)證
先決條件:收集表單數(shù)據(jù)必須通過create()收集
create()方法內(nèi)部有集成表單驗(yàn)證規(guī)則
具體使用
//注冊(cè)操作function register(){$user_model = D("User");if(!empty($_POST)){show_bug($_POST);$z = $user_model -> create(); //收集數(shù)據(jù)if($z){//把愛好的數(shù)組變?yōu)樽址?/span>$user_model -> user_hobby = implode(',',$_POST['user_hobby']);$rst = $user_model -> add();if($rst){echo "ok";} else {echo "failure";}} else {//表單域驗(yàn)證有錯(cuò)誤show_bug($user_model -> getError());}}else {}$this -> display();}在create()時(shí)會(huì)發(fā)生驗(yàn)證,驗(yàn)證的代碼寫在model中
<?phpclass UserModel extends Model{//批量錯(cuò)誤信息顯示// 是否批處理驗(yàn)證protected $patchValidate = true;//進(jìn)行表單域驗(yàn)證//protected $_validate = array(); // 自動(dòng)驗(yàn)證定義protected $_validate = array(//array(驗(yàn)證字段,驗(yàn)證規(guī)則,錯(cuò)誤提示,[驗(yàn)證條件,附加規(guī)則,驗(yàn)證時(shí)間])array('username','require','用戶名必須填寫'),//密碼必須填寫array('password','require','密碼必須填寫'),//確認(rèn)密碼必須填寫/與密碼保存一致array('password2','require','確認(rèn)密碼必須填寫'),array('password2','password','兩次密碼必須一致',0,'confirm'),//驗(yàn)證郵箱array('user_email','email','郵箱格式必須正確',2),//驗(yàn)證qq號(hào)碼//全部數(shù)字、長(zhǎng)度5-12位、第一位非0array('user_qq','/^[1-9]\d{4,11}$/','qq格式必須正確'),//手機(jī)號(hào)碼驗(yàn)證,正則驗(yàn)證//學(xué)歷必須選擇一項(xiàng)//value值必須在一個(gè)范圍內(nèi) 2,3,4,5,array('user_xueli',array(2,3,4,5),'學(xué)歷必須選擇一項(xiàng)',0,'in'),//愛好,必須選擇兩個(gè)或以上項(xiàng)目//計(jì)算$_POST['user_hobby']這個(gè)數(shù)組里邊元素的個(gè)數(shù)array('user_hobby','check_hobby','愛好必須選擇兩項(xiàng)以上',1,'callback'),);//驗(yàn)證愛好的方法function check_hobby($hobby){//獲取$_POST['user_hobby']具體信息值//這個(gè)check_hobby被調(diào)用的時(shí)候已經(jīng)把$_POST['user_hobby']//當(dāng)成是參數(shù)給check_hobby了//show_bug($hobby);if(count($hobby) < 2){return false;} else {return true;}}//自定義個(gè)性方法進(jìn)行用戶名和密碼校驗(yàn)function checkNamePassword(){//sljdlsjdlk} }第四個(gè)參數(shù),驗(yàn)證條件
驗(yàn)證條件:(可選)包含下面幾種情況:
Model::EXISTS_VALIDATE 或者0 存在字段就驗(yàn)證(默認(rèn))
Model::MUST_VALIDATE 或者1 必須驗(yàn)證
Model::VALUE_VALIDATE或者2 值不為空的時(shí)候驗(yàn)證
總結(jié)
以上是生活随笔為你收集整理的ThinkPHP入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL流浪记(二)—— MySQL介
- 下一篇: PHP之MVC项目实战(三)