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. $data["username"] = "大部落";
  6. $data["password"] = md5("123456");
  7. $data["email"] = "12345@163.com";
  8. $data["regdate"] = time();
  9. // 写入数据
  10. if($lastInsId = $Dao->add($data)){
  11. echo "插入数据 id 为:$lastInsId";
  12. } else {
  13. $this->error('数据写入错误!');
  14. }
  15. }

访问执行该操作: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. $Dao->username = "大部落";
  6. $Dao->password = md5("123456");
  7. $Dao->email = "12345@163.com";
  8. $Dao->regdate = time();
  9. // 写入数据
  10. if($lastInsId = $Dao->add()){
  11. echo "插入数据 id 为:$lastInsId";
  12. } else {
  13. $this->error('数据写入错误!');
  14. }
  15. }

对象方式除了数据以数据对象方式赋值外,在调用 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. if($Dao->create()){
  5. $Dao->password = md5($_POST["password"]);
  6. $Dao->regdate = time();
  7. if($lastInsId = $Dao->add()){
  8. echo "插入数据 id 为:$lastInsId";
  9. } else {
  10. echo "数据写入错误!";
  11. }
  12. }else{
  13. exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]');
  14. }
  15. }

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. if($Dao->create()){
  5. if($lastInsId = $Dao->add()){
  6. echo "插入数据 id 为:$lastInsId";
  7. } else {
  8. echo "数据写入错误!";
  9. }
  10. }else{
  11. exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]');
  12. }
  13. }

如果提交的数据不符合验证要求(如用户名存在),则 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. $list = $Dao->select();
  5. //dump($list); // 用 dump() 可以在调试阶段查看数据是否已读取
  6. // 模板变量赋值
  7. $this->assign("list", $list);
  8. // 输出模板
  9. $this->display();
  10. }

假设上面的例子对应的 class 文件为 Lib/Action/IndexAction.class.php ,那么对应的模板文件为

Tpl/default/Index/read.html。
数据显示模板

模板文件用于显示刚才读取的 User 表的数据。在学习阶段,要不想使用模板,也可以直接使用 foreach 语法在

read() 操作内直接显示读取的数据。下面是模板相应的代码片段,我们将读取的数据在一个表格中显示出来:

  1. "1">
  2. 注册时间

  3. "list" id="vo">
  4. {$vo['username']}

  5. {$vo['email']}
  6. {$vo['regdate']|date='Y-m-d H:i',###}

"10%">ID

  1. "1">
  2. 注册时间

  3. "list" id="vo">
  4. {$vo['username']}

  5. {$vo['email']}
  6. {$vo['regdate']|date='Y-m-d H:i',###}
"30%">用户名

  1. "1">
  2. 注册时间

  3. "list" id="vo">
  4. {$vo['username']}

  5. {$vo['email']}
  6. {$vo['regdate']|date='Y-m-d H:i',###}
"30%">电子邮件

  1. "1">
  2. 注册时间

  3. "list" id="vo">
  4. {$vo['username']}

  5. {$vo['email']}
  6. {$vo['regdate']|date='Y-m-d H:i',###}
  1. "1">
  2. 注册时间

  3. "list" id="vo">
  4. {$vo['username']}

  5. {$vo['email']}
  6. {$vo['regdate']|date='Y-m-d H:i',###}

要了解更多关于 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. $list = $Dao->query("select * from user where uid<5");
  6. if($list){
  7. $this->assign('list', $list );
  8. $this->display();
  9. } else {
  10. $this->error($Dao->getError());
  11. }
  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. $num = $Dao->execute("update user set email = '12345@xxx.com' where uid=3");
  7. if($num){
  8. echo '更新 ',$num,' 条记录。';
  9. }else{
  10. echo '无记录更新';
  11. }
  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. }

系统在解析的时候会自动替换成当前模型对应的表名,这样就可以做到即使表名有所变化,只需修改实例化对应的表名即可而不用修改原生的 SQL 语句。

thinkphp的增删改查相关推荐

  1. php跟html增删改查,EasyUIDataGrid结合ThinkPHP实现增删改查操作初学者_html/css_WEB-ITnose...

    EasyUI是基于jQuery的用户界面插件集合:DataGrid是数据表格: ThinkPHP是快速.简单的基于MVC和面向对象的轻量级PHP开发框架. 使用的集成开发环境是 WAMPSever,( ...

  2. thinkPHP增删改查的方法案例

    thinkphp对数据库增删改查进行了封装操作,使得使用更加方便,但是不一定灵活. 可以用封装的用,需要写sql,可以执行sql. 1.原始的 $Model = new Model(); // 实例化 ...

  3. thinkphp连mysql增删改查_ThinkPHP5.1框架数据库链接和增删改查操作示例

    本文实例讲述了ThinkPHP5.1框架数据库链接和增删改查操作.分享给大家供大家参考,具体如 本文实例讲述了ThinkPHP5.1框架数据库链接和增删改查操作.分享给大家供大家参考,具体如下: 一. ...

  4. java map 输入 查询 修改_Mybatis增删改查mapper文件写法详解

    1. 插入 INSERT sql命令(命令里通过#{}获取对象属性) EG: INSERT INTO PRAC_PERSON(p_NAME,P_PASSWORD) VALUES(#{name},#{p ...

  5. resultset mysql_MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ [正文] 一.ResultSet接口的介绍: 对数据库的查询操作,一般需要返回查询结果,在程序中,JDBC为我们提供了ResultSet接口来专门处理查 ...

  6. 带头节点单链表的增删改查

    单链表有很多结构循环单链表,有头节点的单链表,无头节点的单链表,双节点单链表,以下源码是以有一个头节点的单链表为例写的增删改查的各种功能,就是下图 然后各个注释也在函数后面写着,这玩意确实还挺难,源码 ...

  7. vs连接mysql建一个表并增删查改_VS连接SQL Server数据库,增删改查详细教程(C#代码)...

    工具: 1.Visual Studio (我使用的是vs2013) 2.SQL Server  (我使用的是sql server2008) 操作: 1.打开SQL Server,打开后会看到数据库的初 ...

  8. MySQL数据库(五)使用pymysql对数据库进行增删改查

    折腾好半天的数据库连接,由于之前未安装 pip ,而且自己用的python 版本为3.6. 只能用 pymysql 来连接数据库,(如果有和我一样未安装 pip 的朋友请 点这里http://blog ...

  9. 易买网的一些增删改查

    正如题目所说的一样,今天就来说说易买网中的一些增删改查,主要的功能有注册.用户管理以及商品分类等! 1.注册 1.1 注册涉及到了一个ajax远端技术,主要是用来控制注册用户在数据库中是否存在: &l ...

最新文章

  1. 2021年春季学期-信号与系统-第三次作业参考答案
  2. 设置固定长度_厂房及仓库常规消防系统设置!
  3. oracle 多行合并成一行
  4. 背包问题之我的思考一
  5. java final static_Java基础之final、static关键字
  6. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解
  7. C++/C学习笔记(九)
  8. Mybatis3 源码解析系列
  9. Java Servlet系列之Servlet入门
  10. Docker安装与入门
  11. Deep Learning Tutorial - Multilayer perceptron
  12. 数据结构与计算机网络参考书,2019计算机考研:数据结构参考书及复习重点
  13. 计算机软件税负率,2015最新增值税税负对照表
  14. html查看器缩字数,在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数-使用帮助-字的区别...
  15. oracle加减乘除怎么写,加减乘除怎么写-加减乘除的名称怎么写-加减乘除的笔画怎么写...
  16. GIS(地理信息系统/地理信息科学)怎么评职称?
  17. python绘图报错
  18. 文法俱乐部 第三章 动词时态
  19. 京东商品关联版式,如何设置手机和电脑都显示?
  20. 【面向对象】Java面向对象内容

热门文章

  1. TI Sitara AM335x系统之AM335x uboot spl分析
  2. SIP应答消息状态码与功能
  3. php protobuf 二进制,PHP环境中使用ProtoBuf数据格式
  4. php中拼接html代码,如何利用ajax给html动态拼接代码
  5. SharePoint 2016文档库所在数据库表的说明(文档库数据库)
  6. C#sharp 必须扩展的知识点
  7. ORA-01114: 将块写入文件 35 时出现 IO 错误
  8. linux打包启动这着的文件,linux – 打开一个RPM文件并重新打包它
  9. angular8 设置延时时间
  10. 中位数及带权中位数问题(转)