thinkphp的增刪改查

ThinkPHP 添加數據 add 方法



ThinkPHP 內置的 add 方法用于向數據表添加數據,相當于 SQL 中的 INSERT INTO 行為。
ThinkPHP Insert 添加數據

添加數據 add 方法是 CURD(Create,Update,Read,Delete / 創建,修改,讀取,刪除)中的 Create 的實現,ThinkPHP 支持以普通數組方式和面向對象方式將數據寫入數據表。

現在以《PHP MySQL 數據庫教程》中操作 user 表數據的例子(具體參見:MySQL Insert into 添加數據)為例,來演示如何在 ThinkPHP 中實現對數據表的數據添加操作。

例子:

在 IndexAction 控制器(Lib/Action/IndexAction.class.php)里,添加 insert() 操作:
  1. public?function?insert(){?
  2. header("Content-Type:text/html;?charset=utf-8");?
  3. $Dao?=?M("User");?//?實例化模型類?
  4. ?
  5. //?構建寫入的數據數組?
  6. $data["username"]?=?"大部落";?
  7. $data["password"]?=?md5("123456");?
  8. $data["email"]?=?"12345@163.com";?
  9. $data["regdate"]?=?time();?
  10. ?
  11. //?寫入數據?
  12. if($lastInsId?=?$Dao->add($data)){?
  13. echo?"插入數據?id?為:$lastInsId";?
  14. }?else?{?
  15. $this->error('數據寫入錯誤!');?
  16. }?
  17. }
訪問執行該操作:http://127.0.0.1/html/Myapp/index.php/Index/insert
語法解讀

M("User") 用于高效實例化一個數據模型(M 是 new Model 的簡寫,稱為快捷方法),參數為要操作的表名。
接下來構建要保存數據的數組 $data 。
最后是用 add() 方法將數據寫入庫表,由于使用的是 M快捷方法,需要將 $data 數組傳入 add() 方法。
add() 方法如果添加數據記錄成功,返回的是新數據記錄主鍵,可直接得到。

該例子實際運行的 SQL 為:

  1. INSERT?INTO?user(username,password,email,regdate)?VALUES?('大部落','e10adc3949ba59abbe56e057f20f883e',?
  2. '12345@163.com',1283612673)

提示:運行該例子,請確認在配置文件里正確配置了數據庫的相關賬號密碼等信息,具體參見《ThinkPHP 項目配置》
對象方式添加數據

上面的方式是以構造數據數組的方式,然后將數據以參數形式傳入 add 方法寫入數據表。ThinkPHP 也支持以對象的方式將數據寫入數據表,將上面的代碼更改為:
  1. public?function?insert(){?
  2. header("Content-Type:text/html;?charset=utf-8");?
  3. $Dao?=?M("User");?//?實例化模型類?
  4. ?
  5. //?數據對象賦值?
  6. $Dao->username?=?"大部落";?
  7. $Dao->password?=?md5("123456");?
  8. $Dao->email?=?"12345@163.com";?
  9. $Dao->regdate?=?time();?
  10. ?
  11. //?寫入數據?
  12. if($lastInsId?=?$Dao->add()){?
  13. echo?"插入數據?id?為:$lastInsId";?
  14. }?else?{?
  15. $this->error('數據寫入錯誤!');?
  16. }?
  17. }
對象方式除了數據以數據對象方式賦值外,在調用 add 方法寫入數據的時候不需要傳遞參數

ThinkPHP 表單數據智能寫入 create 方法

創建數據對象 create()

除了手動構造入庫的數據集之外,ThinkPHP 還提供了自動創建數據對象的 create() 方法。create() 方法將自動收集提交的表單數據并創建數據對象而無需人工干預,這在表單

數據字段非常多的情況下更具優勢。

將前文寫入表單數據的例子用 create() 來實現:

  1. public?function?insert2(){?
  2. header("Content-Type:text/html;?charset=utf-8");?
  3. $Dao?=?M("User");?
  4. ?
  5. if($Dao->create()){?
  6. $Dao->password?=?md5($_POST["password"]);?
  7. $Dao->regdate?=?time();?
  8. if($lastInsId?=?$Dao->add()){?
  9. echo?"插入數據?id?為:$lastInsId";?
  10. }?else?{?
  11. echo?"數據寫入錯誤!";?
  12. }?
  13. }else{?
  14. exit($Dao->getError().'?[?<a?href="javascript:history.back()">返?回</a>?]');?
  15. }?
  16. }?
create() 創建數據對象后,將自動收集提交過來的表單數據。而表單數據可能需要經過一定加工(例如將密碼加密)才能寫入數據表,所以可以對數據對象的成員屬性值根據進行修改或添加去除等。
提示:create() 創建的數據對象存放于內存,在執行入庫動作(add() 或 save())之前,都可以進行修改。
在上面的例子里,create()方法 的行為和 date()方法 是一致。但 date() 方法只是簡單的創建數據對象,但 create() 方法還具備:
令牌驗證
數據自動驗證
字段映射支持
字段類型檢查
數據自動完成
等各種高級的數據功能,要完成這些高級數據模型功能,需要使用 D方法 實例化數據模型。

在 LibModel 目錄下創建 UserModel.class.php 文件(User 為創建的模型對象,也對應 前綴_user 表),加入自動驗證和自動填充規則:
  1. class?UserModel?extends?Model{?
  2. //?自動驗證設置?
  3. protected?$_validate?=?array(?
  4. array('username','require','用戶名必須填寫!',1),?
  5. array('email','email','郵箱格式錯誤!',2),?
  6. array('username','','用戶名已經存在!',0,'unique',1),?
  7. );?
  8. //自動填充設置?
  9. protected?$_auto?=?array(?
  10. array('regdate','time',self::MODEL_INSERT,'function'),?
  11. array('password','md5',self::MODEL_INSERT,'function'),?
  12. );?
  13. }

將 insert2 操作更改為:

  1. public?function?insert2(){?
  2. header("Content-Type:text/html;?charset=utf-8");?
  3. $Dao?=?D("User");?
  4. ?
  5. if($Dao->create()){?
  6. if($lastInsId?=?$Dao->add()){?
  7. echo?"插入數據?id?為:$lastInsId";?
  8. }?else?{?
  9. echo?"數據寫入錯誤!";?
  10. }?
  11. }else{?
  12. exit($Dao->getError().'?[?<a?href="javascript:history.back()">返?回</a>?]');?
  13. }?
  14. }

如果提交的數據不符合驗證要求(如用戶名存在),則 create() 創建數據對象失敗(返回 FALSE ),$Dao->getError() 會打印出自動驗證設置規則里面設置的提示信息:用戶名已經存在!
如果驗證規則通過后,系統會進行自動填充設置,將表單密碼進行 MD5 加密以及取得當前的時間戳填充入 create() 的數據對象。
所以 D方法 配合 create() 是非常智能而強大的,恰當運用可以達到事半功倍快速開發的目的。
提示
D 方法配合 create() 由于其功能強大,也就損失了一定的效率,在業務邏輯不復雜的情況下推薦 M方法+data() 模式create() 默認接受 POST 數據,若要接受其他類型數據,只需在參數內指定即可,如接受 GET 數據:create($_GET)

ThinkPHP 查詢數據?方法




ThinkPHP 查詢數據主要提供以下幾類查詢:

select:普通查詢,同 findAll() 方法
find:取得符合查詢條件的一條記錄
getBy動態查詢:根據某個字段取得符合查詢條件的一條記錄
getField:獲取某個字段的值或多個字段的索引數組
區間查詢:取得符合查詢條件的區間記錄
統計查詢:取得符合查詢條件的統計數據
定位查詢:取得符合查詢條件的一條或多條記錄
原生SQL查詢:支持以原生 SQL 進行查詢或執行操作

select()

select() 是 ThinkPHP 中最常用的普通查詢方法,得到的是一個二維數組。findAll() 為 select() 方法的別名

,并建議使用 select()

讀取操作

下面的例子將 user 表的所有數據讀取出來并顯示:

  1. public?function?read(){?
  2. $Dao?=?M("User");?
  3. ?
  4. //?查詢數據?
  5. $list?=?$Dao->select();?
  6. //dump($list);?//?用?dump()?可以在調試階段查看數據是否已讀取?
  7. ?
  8. //?模板變量賦值?
  9. $this->assign("list",?$list);?
  10. //?輸出模板?
  11. $this->display();?
  12. }?

假設上面的例子對應的 class 文件為 Lib/Action/IndexAction.class.php ,那么對應的模板文件為

Tpl/default/Index/read.html。
數據顯示模板

模板文件用于顯示剛才讀取的 User 表的數據。在學習階段,要不想使用模板,也可以直接使用 foreach 語法在

read() 操作內直接顯示讀取的數據。下面是模板相應的代碼片段,我們將讀取的數據在一個表格中顯示出來:

  1. "1">?
  2. ?
  3. 注冊時間?
  4. ?
  5. "list"?id="vo">?
  6. ?
  7. {$vo['username']}?
  8. {$vo['email']}?
  9. {$vo['regdate']|date='Y-m-d?H:i',###}?
  10. ?
  11. ?
  12. ?
"10%">ID?
  1. "1">?
  2. ?
  3. 注冊時間?
  4. ?
  5. "list"?id="vo">?
  6. ?
  7. {$vo['username']}?
  8. {$vo['email']}?
  9. {$vo['regdate']|date='Y-m-d?H:i',###}?
  10. ?
  11. ?
  12. ?
"30%">用戶名?
  1. "1">?
  2. ?
  3. 注冊時間?
  4. ?
  5. "list"?id="vo">?
  6. ?
  7. {$vo['username']}?
  8. {$vo['email']}?
  9. {$vo['regdate']|date='Y-m-d?H:i',###}?
  10. ?
  11. ?
  12. ?
"30%">電子郵件?
  1. "1">?
  2. ?
  3. 注冊時間?
  4. ?
  5. "list"?id="vo">?
  6. ?
  7. {$vo['username']}?
  8. {$vo['email']}?
  9. {$vo['regdate']|date='Y-m-d?H:i',###}?
  10. ?
  11. ?
  12. ?
  1. "1">?
  2. ?
  3. 注冊時間?
  4. ?
  5. "list"?id="vo">?
  6. ?
  7. {$vo['username']}?
  8. {$vo['email']}?
  9. {$vo['regdate']|date='Y-m-d?H:i',###}?
  10. ?
  11. ?
  12. ?

要了解更多關于 ThinkPHP模板 的知識,請參閱:《ThinkPHP 模板》。
field() 查詢指定字段

select() 方法默認是查詢所有字段的數據,如果要查詢某個或某些字段,就需要使用 filed() 方法。

filed() 是屬于 ThinkPHP 連貫操作 中的一個方法,如在上面的例子中,只查詢用戶名和電子郵件地址,則查詢

方法對應更改為:

$list = $Dao->field('username,email')->select();

使用查詢條件

使用 ThinkPHP 連貫操作 可以很方便的對數據查詢使用查詢條件。下面是一些簡單的查詢條件的例子。
where() 條件

  1. ?//?構造查詢條件?
  2. $condition['username']?=?'Admin';?
  3. //?查詢數據?
  4. $list?=?$Dao->where($condition)->select();

上述查詢的就是 username='Admin' 這個條件的數據。關于 ThinkPHP where 條件更詳細資料,請參閱

《ThinkPHP Where 條件》。
ORDER BY 排序

在查詢中使用 ORDER BY 對數據進行排序:

  1. //?查詢數據?
  2. list?=?$Dao->order('uid?DESC')->select();

這個例子就是數據按照 ORDER BY uid DESC 進行查詢,而 order() 方法中的參數意義跟 SQL 語句中的意義完全

一致。
LIMIT 限制

在查詢中使用 LIMIT 限定數據返回的記錄數:

  1. //?查詢數據?
  2. $list?=?$Dao->limit('4,5')->select();

這個例子就是將第 5-10 條記錄取出,limit() 方法內的參數意義跟 SQL 語句中的 LIMIT 完全一致。
連貫操作

ThinkPHP 中允許將數據對象中的各個方法寫在一起操作,如:

  1. $list?=?$Dao->order('uid?DESC')->limit('4,5')->select();

這就是連貫操作,關于連貫操作更詳細的介紹,參見《ThinkPHP 連貫操作》。
原生SQL查詢有 query() 和 execute() 兩個方法:

query():用于 SQL 查詢操作,并返回符合查詢條件的數據集
execute():更新和寫入數據的 SQL 操作,返回影響的記錄數

query()

query() 方法是用于 SQL 查詢操作,和select()方法一樣返回符合查詢條件的數據集。

例子:

  1. public?function?read(){?
  2. //?實例化一個空模型,沒有對應任何數據表?
  3. $Dao?=?M();?
  4. //或者使用?$Dao?=?new?Model();?
  5. ?
  6. $list?=?$Dao->query("select?*?from?user?where?uid<5");?
  7. if($list){?
  8. $this->assign('list',?$list?);?
  9. $this->display();?
  10. }?else?{?
  11. $this->error($Dao->getError());?
  12. }?
  13. }

對于 query() 方法返回的數據集,跟 select() 一樣,可以在模板里直接循環輸出。
execute()

execute() 方法用于更新和寫入數據的 SQL 操作(注:非查詢操作,無返回數據集),返回影響的記錄數。

例子:

  1. public?function?read(){?
  2. header("Content-Type:text/html;?charset=utf-8");?
  3. //?實例化一個空模型,沒有對應任何數據表?
  4. $Dao?=?M();?
  5. //或者使用?$Dao?=?new?Model();?
  6. ?
  7. $num?=?$Dao->execute("update?user?set?email?=?'12345@xxx.com'?where?uid=3");?
  8. if($num){?
  9. echo?'更新?',$num,'?條記錄。';?
  10. }else{?
  11. echo?'無記錄更新';?
  12. }?
  13. }

如果查詢比較復雜或一些特殊的數據操作不能通過 ThinkPHP 內置的 ORM 和 ActiveRecord 模式實現時,就可以通過直接使用原生 SQL 查詢來實現。

注意:以上都是 user 沒有表前綴的例子,在查詢語句中,查詢的表應該寫實際的表名字(包括前綴)。
小技巧

原生 SQL 查詢需要在查詢語句中寫上對應的表名,如果表名有改動的時候,就需要逐行去更改 SQL 語句中的表名字,這樣不免麻煩。ThinkPHP 提供了一個小技巧來幫助解決這個問題。

在 SQL 語句中,以 __TABLE__ 來替代真實的表名,而在實例化模型時,仍以表名為參數,如:

  1. public?function?read(){?
  2. $Dao?=?M("User");?
  3. $list?=?$Dao->query("select?__TABLE__?from?user?where?uid<5");?
  4. ?
  5. }

系統在解析的時候會自動替換成當前模型對應的表名,這樣就可以做到即使表名有所變化,只需修改實例化對應的表名即可而不用修改原生的 SQL 語句。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444911.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode115 不同的子序列

給定一個字符串 S 和一個字符串 T&#xff0c;計算在 S 的子序列中 T 出現的個數。 一個字符串的一個子序列是指&#xff0c;通過刪除一些&#xff08;也可以不刪除&#xff09;字符且不干擾剩余字符相對位置所組成的新字符串。&#xff08;例如&#xff0c;"ACE" 是…

ThinkPHP 模板循環輸出 Volist 標簽

volist 標簽用于在模板中循環輸出數據集或者多維數組。volist 標簽在模塊操作中&#xff0c;select() 方法返回的是一個二維數組&#xff0c;可以用 volist 直接輸出&#xff1a;<volist name"list" id"vo"> 用 戶 名&#xff1a;{$vo[username]}&l…

MachineLearning(9)-最大似然、最小KL散度、交叉熵損失函數三者的關系

最大似然-最小KL散度-最小化交叉熵損失-三者的關系問題緣起&#xff1a;給定一組數據(x1,x2,...,xm)(x^1,x^2,...,x^m)(x1,x2,...,xm),希望找到這組數據服從的分布。此種情況下&#xff0c;分布規律用概率密度p(x)表征。 問題歸處&#xff1a;如果能夠建模/近似建模p(x)&#…

ThinkPHP redirect 頁面重定向使用詳解與實例

ThinkPHP redirect 方法ThinkPHP redirect 方法可以實現頁面的重定向&#xff08;跳轉&#xff09;功能。redirect 方法語法如下&#xff1a;$this->redirect(string url, array params, int delay, string msg) 參數說明&#xff1a;url 必須&#xff0c;重定向的 URL 表達…

PaperNotes(9)-Learning deep energy model: contrastive divergence vs. Amortized MLE

Learning deep energy model: contrastive divergence vs. Amortized MLEabstract1 Introduction2 Background2.1 stein variational gradient descent2.2 learning energy model**contrastive Divergence**abstract 受SVGD算法的啟發,本文提出兩個算法用于從數據中學習深度能…

windows下的gvim配置

首要任務是下載安裝Gvim7.3 。 安裝完后&#xff0c;gvim菜單中文出現亂碼&#xff0c;在_vimrcset文件中增加&#xff1a; " 配置多語言環境,解決中文亂碼問題 if has("multi_byte") " UTF-8 編碼 set encodingutf-8 set termencodingutf…

leetcode104 二叉樹的最大深度

給定一個二叉樹&#xff0c;找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 / \ 15 7 返回它的最大深度…

C++的安全類型轉換的討論

關于強制類型轉換的問題,很多書都討論過,寫的最詳細的是C++ 之父的《C++的設計和演化》。最好的解決方法就是不要使用C風格的強制類型轉換,而是使用標準C++的類型轉換符:static_cast, dynamic_cast。標準C++中有四個類型轉換符:static_cast、dynamic_cast、reinterpret_ca…

PaperNotes(10)-Maximum Entropy Generators for Energy-Based Models

Maximum Entropy Generators for Energy-Based ModelsAbstract1 Introduction2 Background3 Maximum Entropy Generators for Energy-Based Models4 Experiments5 Related Work6 Conclusion7 AcknowledgementsAbstract 由于對數似然梯度的難以計算&#xff0c;能量模型的最大似…

leetcode105 前序中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重復的元素。 例如&#xff0c;給出 前序遍歷 preorder [3,9,20,15,7] 中序遍歷 inorder [9,3,15,20,7] 返回如下的二叉樹&#xff1a; 3 / \ 9 20 / \ 15 7 思路&#xff1a; 1、…

c++的虛擬繼承 的一些思考吧

虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。如:類D繼承自類B1、B2,而類B1、B2都繼承自類A,因此在類D中兩次出現類A中的變量和函數。為了節省內存空間,可以將B1、B2對A的繼承定義為虛擬繼承,而A就成了虛擬基類。實現的代碼如下: class A class …

對于linux socket與epoll配合相關的一些心得記錄

對于linux socket與epoll配合相關的一些心得記錄 沒有多少高深的東西&#xff0c;全當記錄&#xff0c;雖然簡單&#xff0c;但是沒有做過測試還是挺容易讓人糊涂的int nRecvBuf32*1024;//設置為32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int))…

leetcode144 二叉樹的前序遍歷

給定一個二叉樹&#xff0c;返回它的 前序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,2,3] 進階: 遞歸算法很簡單&#xff0c;你可以通過迭代算法完成嗎&#xff1f; 思路&#xff1a;模仿遞歸的思路壓棧即可。 /*** Definition for a bi…

AJAX大總結

1、AJAX概述 1.1 什么是AJAX AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻譯成中文就是“異步Javascript和XML”。即使用Javascript語言與服務器進行異步交互&#xff0c;傳輸的數據為XML&#xff08;當然&#xff0c;傳輸的數據不只是XML&#xff09;。 …

我對STL的一些看法(一)初步認識STL

后面一段時間我將會給大家分享我自己學到STL以及應用的時候遇到的問題還有他的一些精髓,可能開始的邏輯會有些亂吧,不過后面還會不斷的整理和優化,讓自己看明白也讓更多的讀者看的清楚。 最近剛閑下來,先說說什么是STL: 不知道你是否有過這樣的經歷。在大學,你準備著手完…

PaperNotes(12)-Autoregressive Quantile networks for generative modeling

Autoregressive Quantile networks for generative modeling3 autoregressive implicit quantiles3 autoregressive implicit quantiles autoregressive&#xff1a;自身做回歸變量&#xff0c;用之前若干時刻的隨機變量 來建模 之后某些時刻 隨機變量的模型。 N維隨機變量的…

我對STL的一些看法(二)認識vector容器

先說vector吧。 C++ Vector(向量容器) 是一個線性順序結構。相當于數組,但其大小可以不預先指定,并且自動擴展。它可以像數組一樣被操作,由于它的特性我們完全可以將vector 看作動態數組。 vector 的數據安排以及操作方式,與 array 非常像似。兩者的唯一差別在于空間的…

git大總結

git init 在本地新建一個repo,進入一個項目目錄,執行git init,會初始化一個repo,并在當前文件夾下創建一個.git文件夾. git clone 獲取一個url對應的遠程Git repo, 創建一個local copy. 一般的格式是git clone [url]. clone下來的repo會以url最后一個斜線后面的名稱命名,創…

我對STL的一些看法(三)認識list容器

C++ List(雙向鏈表) 是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,并且由指針將有序的元素鏈接起來。由于…

C++(4)--初識變量、數據類型

C變量1.C 命名規則2.C 命名規范3.C 數據類型sizeof ()4.聲明和使用變量4.1使用整型變量4.2使用單精度浮點型變量4.3使用雙精度浮點型變量5.附送-cout 設置寬度&#xff0c;對齊方式6.算術運算符和表達式6.1除法、取余6.2自加、自減7.強制類型轉換《老九學堂C課程》《C primer》…