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. }
访问执行该操作: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. }
对象方式除了数据以数据对象方式赋值外,在调用 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. }else
  13. exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]'); 
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. }else
  11. exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]'); 
  12. }

如果提交的数据不符合验证要求(如用户名存在),则 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(); 

假设上面的例子对应的 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. }

对于 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. }

如果查询比较复杂或一些特殊的数据操作不能通过 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.mzph.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》…