入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

thinkphp的增删改查

创建时间:2013-10-30 投稿人: 浏览次数:17879


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 方法写入数据的时候不需要传递参数 创建数据对象 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 查询数据主要提供以下几类查询:

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 连贯操作 可以很方便的对数据查询使用
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。