多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > ThinkPHP > ThinkPHP3.1快速入門(2)數(shù)據(jù)CURD

ThinkPHP3.1快速入門(2)數(shù)據(jù)CURD

來源:程序員人生   發(fā)布時(shí)間:2013-12-02 04:02:05 閱讀次數(shù):3529次
上一篇中,我們了解了ThinkPHP的基礎(chǔ)部分,以及如何創(chuàng)建一個(gè)控制器和模板,并知道了M方法的用法,本篇將會(huì)講解下數(shù)據(jù)的CURD操作,探索下更多的數(shù)據(jù)操作。

CURD

CURD是一個(gè)數(shù)據(jù)庫技術(shù)中的縮寫詞,一般的項(xiàng)目開發(fā)的各種參數(shù)的基本功能都是CURD。它代表創(chuàng)建(Create)、更新(Update)、讀取(Read)和刪除(Delete)操作。CURD 定義了用于處理數(shù)據(jù)的基本原子操作。之所以將CURD 提升到一個(gè)技術(shù)難題的高度是因?yàn)橥瓿梢粋€(gè)涉及在多個(gè)數(shù)據(jù)庫系統(tǒng)中進(jìn)行CURD操作的匯總相關(guān)的活動(dòng),其性能可能會(huì)隨數(shù)據(jù)關(guān)系的變化而有非常大的差異。
CURD在具體的應(yīng)用中并非一定使用create、update 、read和delete字樣的方法,但是他們完成的功能是一致的。例如,ThinkPHP就是使用add、save、select和delete方法表示模型的CURD操作。

創(chuàng)建數(shù)據(jù)

大多數(shù)情況下,CURD的Create操作通常會(huì)通過表單來提交數(shù)據(jù),首先,我們在項(xiàng)目的Tpl/Form 目錄下面創(chuàng)建一個(gè)add.html 模板文件,內(nèi)容為:
<FORM method="post" action="__URL__/insert">
標(biāo)題:<INPUT type="text" name="title"><br/>
內(nèi)容:<TEXTAREA name="content" rows="5" cols="45"></TEXTAREA><br/>
<INPUT type="submit" value="提交">
</FORM>
然后,我們還需要在項(xiàng)目的Action目錄下面創(chuàng)建一個(gè)FormAction.class.php文件,暫時(shí)只需要定義FormAction類,不需要添加任何操作方法,代碼如下:
class FormAction extends Action{
}
接下來,訪問
http://localhost/app/index.php/Form/add
就可以看到表單頁面了,我們并沒有在控制器里面定義add操作方法,但是很顯然,訪問是正常的。因?yàn)門hinkPHP在沒有找到對應(yīng)操作方法的情況下,會(huì)檢查是否存在對應(yīng)的模板文件,由于我們有對應(yīng)的add模板文件,所以控制器就直接渲染該模板文件輸出了。所以說對于沒有任何實(shí)際邏輯的操作方法,我們只需要直接定義對應(yīng)的模板文件就行了。
我們可以看到,在表單中定義了提交地址是到Form模塊的insert操作,為了處理表單提交數(shù)據(jù),我們需要在FormAction類中添加insert操作方法,如下:
class FormAction extends Action{
    public function insert(){
        $Form   =   D('Form');
        if($Form->create()) {
            $result =   $Form->add();
            if($result) {
                $this->success('操作成功!');
            }else{
                $this->error('寫入錯(cuò)誤!');
            }
        }else{
            $this->error($Form->getError());
        }
    }
}
如果你的主鍵是自增類型的話,add方法的返回值就是該主鍵的值。不是自增主鍵的話,返回值表示插入數(shù)據(jù)的個(gè)數(shù)。如果返回false則表示寫入出錯(cuò)。

模型

為了方便測試,我們首先在數(shù)據(jù)庫中創(chuàng)建一個(gè)think_form表:
CREATE TABLE IF NOT EXISTS `think_form` (
  `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` varchar(255) NOT NULL,
  `create_time` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
我們在insert操作方法中用了D函數(shù),和M函數(shù)不同,D函數(shù)需要有對應(yīng)的模型類,下面我們就來創(chuàng)建模型類。模型類的定義規(guī)范是:
模型名+Model.class.php (模型名的定義采用駝峰法并且首字母大寫)
我們在項(xiàng)目的Lib/Model 目錄下面創(chuàng)建FormModel.class.php文件,添加代碼如下:
class FormModel extends Model {
    // 定義自動(dòng)驗(yàn)證
    protected $_validate    =   array(
        array('title','require','標(biāo)題必須'),
        );
    // 定義自動(dòng)完成
    protected $_auto    =   array(
        array('create_time','time',1,'function'),
        );
}
主要是用于表單的自動(dòng)驗(yàn)證和自動(dòng)完成,具體用法我們會(huì)用另外的篇幅單獨(dú)講述,這里暫時(shí)先略過。我們只要了解的是,如果使用D函數(shù)實(shí)例化模型類,一般需要對應(yīng)一個(gè)數(shù)據(jù)模型類,而且create方法會(huì)自動(dòng)把表單提交的數(shù)據(jù)進(jìn)行自動(dòng)驗(yàn)證和自動(dòng)完成(如果有定義的話),如果自動(dòng)驗(yàn)證失敗,就可以通過模型的getError方法獲取驗(yàn)證提示信息,如果驗(yàn)證通過,就表示數(shù)據(jù)對象已經(jīng)成功創(chuàng)建,但目前只是保存在內(nèi)存中,直到我們調(diào)用add方法寫入數(shù)據(jù)到數(shù)據(jù)庫。這樣就完成了一個(gè)完整的Create操作,所以可以看到ThinkPHP在創(chuàng)建數(shù)據(jù)的過程中使用了兩步:
第一步,create方法創(chuàng)建數(shù)據(jù)對象,
第二步,使用add方法把當(dāng)前的數(shù)據(jù)對象寫入數(shù)據(jù)庫。
當(dāng)然,你完全可以跨過第一步,直接進(jìn)行第二步,但是這樣的預(yù)處理有幾個(gè)優(yōu)勢:
1、無論表單有多復(fù)雜,create方法都可以用一行代碼輕松創(chuàng)建數(shù)據(jù)對象;
2、在寫入數(shù)據(jù)之前,可以對數(shù)據(jù)進(jìn)行驗(yàn)證和補(bǔ)充;
其實(shí)create方法還有很多的功能操作,目的只有一個(gè),確保寫入數(shù)據(jù)庫的數(shù)據(jù)安全和有效。
我們來驗(yàn)證下表單提交的效果,當(dāng)我們不輸入標(biāo)題就直接提交表單的話,系統(tǒng)會(huì)給出標(biāo)題必須這樣的提示信息。

當(dāng)我們順利提交表單后,會(huì)看到寫入數(shù)據(jù)表的數(shù)據(jù)中的create_time字段已經(jīng)有值了,這就是通過模型的自動(dòng)完成寫入的。

如果你的數(shù)據(jù)完全是內(nèi)部操作寫入而不是通過表單的話(也就是說可以充分信任數(shù)據(jù)的安全),那么可以直接使用add方法,如:
$Form   =   D('Form');
$data['title']  =   'ThinkPHP';
$data['content']    =   '表單內(nèi)容';
$Form->add($data);
也可以支持對象方式操作:
$Form   =   D('Form');
$Form->title  =   'ThinkPHP';
$Form->content    =   '表單內(nèi)容';
$Form->add();
對象方式操作的時(shí)候,add方法無需傳入數(shù)據(jù),會(huì)自動(dòng)識別當(dāng)前的數(shù)據(jù)對象賦值。

讀取數(shù)據(jù)

當(dāng)我們成功寫入數(shù)據(jù)后,就可以進(jìn)行數(shù)據(jù)讀取操作了。在前面一篇中,我們已經(jīng)知道可以用select方法獲取數(shù)據(jù)集,這里我們來通過find方法獲取一個(gè)單一數(shù)據(jù),定義read操作方法如下:
public function read($id=0){
    $Form   =   M('Form');
    // 讀取數(shù)據(jù)
    $data =   $Form->find($id);
    if($data) {
        $this->data =   $data;// 模板變量賦值
    }else{
        $this->error('數(shù)據(jù)錯(cuò)誤');
    }
    $this->display();
}
read操作方法有一個(gè)參數(shù)$id,表示我們可以接受URL里面的id變量(后面我們會(huì)在變量章節(jié)詳細(xì)描述。這里之所以用M方法而沒有用D方法,是因?yàn)閒ind方法是基礎(chǔ)模型類Model中的方法,所以沒有必要浪費(fèi)開銷去實(shí)例化FormModel類(即使已經(jīng)定義了FormModel類)。我們通常采用find方法讀取某個(gè)數(shù)據(jù),這里使用了AR模式來操作,所以沒有傳入查詢條件,find($id) 表示讀取主鍵為$id值的數(shù)據(jù),find方法的返回值是一個(gè)如下格式的數(shù)組:
array(
    'id'        =>  5,
    'title'     =>  '測試標(biāo)題',
    'content'   =>  '測試內(nèi)容',
    'status'    =>  1,
)
然后我們可以在模板中輸出數(shù)據(jù),添加一個(gè)read模板文件,
<table>
<tr>
    <td>id:</td>
    <td>{$data.id}</td>
</tr>
<tr>
    <td>標(biāo)題:</td>
    <td>{$data.title}</td>
</tr>
<tr>
    <td>內(nèi)容:</td>
    <td>{$data.content}</td>
</tr>
</table>
完成后,我們就可以訪問
http://localhost/app/index.php/Form/read/id/1
來查看了。
如果你只需要查詢某個(gè)字段的值,還可以使用getField方法,例如:
$Form = M("Form"); 
// 獲取標(biāo)題 
$title = $Form->where('id=3')->getField('title');
上面的用法表示獲取id值為3的數(shù)據(jù)的title字段值。其實(shí)getField方法有很多用法,但是獲取某個(gè)字段的值是getField方法最常規(guī)的用法。
查詢操作是最常用的操作,尤其是涉及到復(fù)雜的查詢條件,我們會(huì)在查詢語言一章對查詢進(jìn)行更加詳細(xì)的講解。

更新數(shù)據(jù)

在成功寫入并讀取數(shù)據(jù)之后,我們就可以對數(shù)據(jù)進(jìn)行編輯操作了,首先我們添加一個(gè)編輯表單的模板文件edit.html,如下:
  <FORM method="post" action="__URL__/update">
    標(biāo)題:<INPUT type="text" name="title" value="{$vo.title}"><br/>
    內(nèi)容:<TEXTAREA name="content" rows="5" cols="45">{$vo.content}</TEXTAREA><br/>
    <INPUT type="hidden" name="id" value="{$vo.id}">
    <INPUT type="submit" value="提交">
  </FORM>
編輯模板不同于新增表單,需要對模板進(jìn)行變量賦值,所以,我們這次需要在FormAction類添加兩個(gè)操作方法:
public function edit($id=0){
    $Form   =   M('Form');
    $this->vo   =   $Form->find($id);
    $this->display();
}
public function update(){
    $Form   =   D('Form');
    if($Form->create()) {
        $result =   $Form->save();
        if($result) {
            $this->success('操作成功!');
        }else{
            $this->error('寫入錯(cuò)誤!');
        }
    }else{
        $this->error($Form->getError());
    }
}
完成后,我們就可以訪問
http://localhost/app/index.php/Form/edit/id/1

數(shù)據(jù)的更新操作在ThinkPHP使用save方法,可以看到,我們同樣可以使用create方法創(chuàng)建表單提交的數(shù)據(jù),而save方法則會(huì)自動(dòng)把當(dāng)前的數(shù)據(jù)對象更新到數(shù)據(jù)庫,而更新的條件其實(shí)就是表的主鍵,這就是我們在編輯頁面要把主鍵的值作為隱藏字段一起提交的原因。
如果更新操作不依賴表單的提交的話,就可以寫成:
$Form = M("Form"); 
// 要修改的數(shù)據(jù)對象屬性賦值
$data['id'] = 5;
$data['title'] = 'ThinkPHP';
$data['content'] = 'ThinkPHP3.1版本發(fā)布';
$Form->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)
save方法會(huì)自動(dòng)識別數(shù)據(jù)對象中的主鍵字段,并作為更新條件。當(dāng)然,你也可以顯式的傳入更新條件:
$Form = M("Form"); 
// 要修改的數(shù)據(jù)對象屬性賦值
$data['title'] = 'ThinkPHP';
$data['content'] = 'ThinkPHP3.1版本發(fā)布';
$Form->where('id=5')->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)
也可以改成對象方式來操作:
$Form = M("Form"); 
// 要修改的數(shù)據(jù)對象屬性賦值
$Form->title = 'ThinkPHP';
$Form->content = 'ThinkPHP3.1版本發(fā)布';
$Form->where('id=5')->save(); // 根據(jù)條件保存修改的數(shù)據(jù)
數(shù)據(jù)對象賦值的方式,save方法無需傳入數(shù)據(jù),會(huì)自動(dòng)識別。
save方法的返回值是影響的記錄數(shù),如果返回false則表示更新出錯(cuò)。

有些時(shí)候,我們只需要修改某個(gè)字段的值,就可以使用setField方法,而不需要每次都調(diào)用save方法。
$Form = M("Form"); 
// 更改title值
$Form->where('id=5')->setField('title','ThinkPHP');
對于統(tǒng)計(jì)字段,系統(tǒng)還提供了更加方便的setInc和setDec方法。
例如:
    $User = M("User"); // 實(shí)例化User對象
    $User->where('id=5')->setInc('score',3); // 用戶的積分加3
    $User->where('id=5')->setInc('score'); // 用戶的積分加1
    $User->where('id=5')->setDec('score',5); // 用戶的積分減5
    $User->where('id=5')->setDec('score'); // 用戶的積分減1

刪除數(shù)據(jù)

刪除數(shù)據(jù)很簡單,只需要調(diào)用delete方法,例如:
$Form = M('Form');
$Form->delete(5);
表示刪除主鍵為5的數(shù)據(jù),delete方法可以刪除單個(gè)數(shù)據(jù),也可以刪除多個(gè)數(shù)據(jù),這取決于刪除條件,例如:
$User = M("User"); // 實(shí)例化User對象
$User->where('id=5')->delete(); // 刪除id為5的用戶數(shù)據(jù)
$User->delete('1,2,5'); // 刪除主鍵為1,2和5的用戶數(shù)據(jù)
$User->where('status=0')->delete(); // 刪除所有狀態(tài)為0的用戶數(shù)據(jù)
delete方法的返回值是刪除的記錄數(shù),如果返回值是false則表示SQL出錯(cuò),返回值如果為0表示沒有刪除任何數(shù)據(jù)。

總結(jié)

現(xiàn)在,你已經(jīng)基本掌握了ThinkPHP的CURD操作了,并且學(xué)會(huì)了使用ThinkPHP的create、add、save和delete方法,還有兩個(gè)對字段操作的getField和setField方法。下一篇,我們會(huì)更深入的了解下如何使用ThinkPHP提供的查詢語言。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 伊人久久中文大香线蕉综合 | 欧美日韩视频一区二区三区 | 亚洲精品午夜久久aaa级久久久 | 最近中文字幕高清mv免费 | chinese农村videoxxxx实拍 | 日韩欧美国产一区二区三区四区 | 亚洲视色 | 欧美成人精品不卡视频在线观看 | 高清欧美色欧美综合网站 | 日韩亚洲国产综合久久久 | 日本久久精品免视看国产成人 | 中文字幕亚洲综合久久2 | 波多野结衣一区二区三区 | 黄网站大全免费 | 免费国产一区二区三区四区 | 欧美一区二区日韩一区二区 | 日本中文字幕网 | 一个色综合久久 | 国产成人精品亚洲一区 | 亚洲精品456人成在线 | 色狠狠婷婷97 | 亚洲 欧美 校园 | 国产日韩精品视频一区二区三区 | 91av福利| 亚洲春色另类 | 欧美亚洲国产精品久久 | 亚洲 校园 春色 另类 激情 | 最近中文字幕视频国语中文字幕 | 精品在线免费观看 | 久久精品视频一区二区三区 | 日韩大片免费观看 | 婷婷在线成人免费观看搜索 | 国产一级淫片a免费播放口 国产一级淫片a免费播放口欧美 | 尤物福利在线 | xxfree性欧美hd | 欧美一级乱妇老太婆特黄 | 激情欧美日韩一区二区 | 欧美日韩在线观看视频 | 69国产成人精品视频软件 | 成人在线视频网站 | 日本三级午夜理伦三级三 |