当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP3.1快速入门(2)数据CURD

上一篇中,我们了解了ThinkPHP的基础部分,以及如何创建一个控制器和模板,并知道了M方法的用法,本篇将会讲解下数据的CURD操作,探索下更多的数据操作。CURDCURD是一个数据库技术中的缩写词,一般的项目开发的各...">

上一篇中,我们了解了ThinkPHP的基础部分,以及如何创建一个控制器和模板,并知道了M方法的用法,本篇将会讲解下数据的CURD操作,探索下更多的数据操作。

CURD

CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD。它代表创建(Create)、更新(Update)、读取(Read)和删除(Delete)操作。CURD 定义了用于处理数据的基本原子操作。之所以将CURD 提升到一个技术难题的高度是因为完成一个涉及在多个数据库系统中进行CURD操作的汇总相关的活动,其性能可能会随数据关系的变化而有非常大的差异。
CURD在具体的应用中并非一定使用create、update 、read和delete字样的方法,但是他们完成的功能是一致的。例如,ThinkPHP就是使用add、save、select和delete方法表示模型的CURD操作。

创建数据

大多数情况下,CURD的Create操作通常会通过表单来提交数据,首先,我们在项目的Tpl/Form 目录下面创建一个add.html 模板文件,内容为:

  1.   
  2.     标题:
  3.     内容:
  4.     
  5.   

然后,我们还需要在项目的Action目录下面创建一个FormAction.class.php文件,暂时只需要定义FormAction类,不需要添加任何操作方法,代码如下:

  1. class FormAction extends Action{
  2. }

接下来,访问

  1. http://localhost/app/index.php/Form/add

就可以看到表单页面了,我们并没有在控制器里面定义add操作方法,但是很显然,访问是正常的。因为ThinkPHP在没有找到对应操作方法的情况下,会检查是否存在对应的模板文件,由于我们有对应的add模板文件,所以控制器就直接渲染该模板文件输出了。所以说对于没有任何实际逻辑的操作方法,我们只需要直接定义对应的模板文件就行了。
我们可以看到,在表单中定义了提交地址是到Form模块的insert操作,为了处理表单提交数据,我们需要在FormAction类中添加insert操作方法,如下:

  1. class FormAction extends Action{
  2.     public function insert(){
  3.         $Form   =   D('Form');
  4.         if($Form->create()) {
  5.             $result =   $Form->add();
  6.             if($result) {
  7.                 $this->success('操作成功!');
  8.             }else{
  9.                 $this->error('写入错误!');
  10.             }
  11.         }else{
  12.             $this->error($Form->getError());
  13.         }
  14.     }
  15. }

如果你的主键是自增类型的话,add方法的返回值就是该主键的值。不是自增主键的话,返回值表示插入数据的个数。如果返回false则表示写入出错。

 

模型

为了方便测试,我们首先在数据库中创建一个think_form表:

  1. CREATE TABLE IF NOT EXISTS `think_form` (
  2.   `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
  3.   `title` varchar(255) NOT NULL,
  4.   `content` varchar(255) NOT NULL,
  5.   `create_time` int(11) unsigned NOT NULL,
  6.   PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

我们在insert操作方法中用了D函数,和M函数不同,D函数需要有对应的模型类,下面我们就来创建模型类。模型类的定义规范是:模型名+Model.class.php (模型名的定义采用驼峰法并且首字母大写)
我们在项目的Lib/Model 目录下面创建FormModel.class.php文件,添加代码如下:

  1. class FormModel extends Model {
  2.     // 定义自动验证
  3.     protected $_validate    =   array(
  4.         array('title','require','标题必须'),
  5.         );
  6.     // 定义自动完成
  7.     protected $_auto    =   array(
  8.         array('create_time','time',1,'function'),
  9.         );
  10. }

主要是用于表单的自动验证和自动完成,具体用法我们会用另外的篇幅单独讲述,这里暂时先略过。我们只要了解的是,如果使用D函数实例化模型类,一般需要对应一个数据模型类,而且create方法会自动把表单提交的数据进行自动验证和自动完成(如果有定义的话),如果自动验证失败,就可以通过模型的getError方法获取验证提示信息,如果验证通过,就表示数据对象已经成功创建,但目前只是保存在内存中,直到我们调用add方法写入数据到数据库。这样就完成了一个完整的Create操作,所以可以看到ThinkPHP在创建数据的过程中使用了两步:
第一步,create方法创建数据对象,
第二步,使用add方法把当前的数据对象写入数据库。
当然,你完全可以跨过第一步,直接进行第二步,但是这样的预处理有几个优势:
1、无论表单有多复杂,create方法都可以用一行代码轻松创建数据对象;
2、在写入数据之前,可以对数据进行验证和补充;
其实create方法还有很多的功能操作,目的只有一个,确保写入数据库的数据安全和有效。
我们来验证下表单提交的效果,当我们不输入标题就直接提交表单的话,系统会给出标题必须这样的提示信息。当我们顺利提交表单后,会看到写入数据表的数据中的create_time字段已经有值了,这就是通过模型的自动完成写入的。如果你的数据完全是内部操作写入而不是通过表单的话(也就是说可以充分信任数据的安全),那么可以直接使用add方法,如:

  1. $Form   =   D('Form');
  2. $data['title']  =   'ThinkPHP';
  3. $data['content']    =   '表单内容';
  4. $Form->add($data);

也可以支持对象方式操作:

  1. $Form   =   D('Form');
  2. $Form->title  =   'ThinkPHP';
  3. $Form->content    =   '表单内容';
  4. $Form->add();

对象方式操作的时候,add方法无需传入数据,会自动识别当前的数据对象赋值。

 

读取数据

当我们成功写入数据后,就可以进行数据读取操作了。在前面一篇中,我们已经知道可以用select方法获取数据集,这里我们来通过find方法获取一个单一数据,定义read操作方法如下:

  1. public function read($id=0){
  2.     $Form   =   M('Form');
  3.     // 读取数据
  4.     $data =   $Form->find($id);
  5.     if($data) {
  6.         $this->data =   $data;// 模板变量赋值
  7.     }else{
  8.         $this->error('数据错误');
  9.     }
  10.     $this->display();
  11. }

read操作方法有一个参数$id,表示我们可以接受URL里面的id变量(后面我们会在变量章节详细描述。这里之所以用M方法而没有用D方法,是因为find方法是基础模型类Model中的方法,所以没有必要浪费开销去实例化FormModel类(即使已经定义了FormModel类)。我们通常采用find方法读取某个数据,这里使用了AR模式来操作,所以没有传入查询条件,find($id) 表示读取主键为$id值的数据,find方法的返回值是一个如下格式的数组:

  1. array(
  2.     'id'        =>  5,
  3.     'title'     =>  '测试标题',
  4.     'content'   =>  '测试内容',
  5.     'status'    =>  1,
  6. )

然后我们可以在模板中输出数据,添加一个read模板文件,

  1.     
  2.     
  3.     
  4.     
  5.     
  6.     
  7. id: {$data.id}
    标题: {$data.title}
    内容: {$data.content}

完成后,我们就可以访问

  1. http://localhost/app/index.php/Form/read/id/1

来查看了。
如果你只需要查询某个字段的值,还可以使用getField方法,例如:

  1. $Form = M("Form"); 
  2. // 获取标题 
  3. $title = $Form->where('id=3')->getField('title');

上面的用法表示获取id值为3的数据的title字段值。其实getField方法有很多用法,但是获取某个字段的值是getField方法最常规的用法。
查询操作是最常用的操作,尤其是涉及到复杂的查询条件,我们会在查询语言一章对查询进行更加详细的讲解。

 

更新数据

在成功写入并读取数据之后,我们就可以对数据进行编辑操作了,首先我们添加一个编辑表单的模板文件edit.html,如下:

  1.   
  2.     标题:
  3.     内容:{$vo.content}
  4.     
  5.     
  6.   

编辑模板不同于新增表单,需要对模板进行变量赋值,所以,我们这次需要在FormAction类添加两个操作方法:

  1. public function edit($id=0){
  2.     $Form   =   M('Form');
  3.     $this->vo   =   $Form->find($id);
  4.     $this->display();
  5. }
  6. public function update(){
  7.     $Form   =   D('Form');
  8.     if($Form->create()) {
  9.         $result =   $Form->save();
  10.         if($result) {
  11.             $this->success('操作成功!');
  12.         }else{
  13.             $this->error('写入错误!');
  14.         }
  15.     }else{
  16.         $this->error($Form->getError());
  17.     }
  18. }

完成后,我们就可以访问

  1. http://localhost/app/index.php/Form/edit/id/1

数据的更新操作在ThinkPHP使用save方法,可以看到,我们同样可以使用create方法创建表单提交的数据,而save方法则会自动把当前的数据对象更新到数据库,而更新的条件其实就是表的主键,这就是我们在编辑页面要把主键的值作为隐藏字段一起提交的原因。
如果更新操作不依赖表单的提交的话,就可以写成:

  1. $Form = M("Form"); 
  2. // 要修改的数据对象属性赋值
  3. $data['id'] = 5;
  4. $data['title'] = 'ThinkPHP';
  5. $data['content'] = 'ThinkPHP3.1版本发布';
  6. $Form->save($data); // 根据条件保存修改的数据

save方法会自动识别数据对象中的主键字段,并作为更新条件。当然,你也可以显式的传入更新条件:

  1. $Form = M("Form"); 
  2. // 要修改的数据对象属性赋值
  3. $data['title'] = 'ThinkPHP';
  4. $data['content'] = 'ThinkPHP3.1版本发布';
  5. $Form->where('id=5')->save($data); // 根据条件保存修改的数据

也可以改成对象方式来操作:

  1. $Form = M("Form"); 
  2. // 要修改的数据对象属性赋值
  3. $Form->title = 'ThinkPHP';
  4. $Form->content = 'ThinkPHP3.1版本发布';
  5. $Form->where('id=5')->save(); // 根据条件保存修改的数据

数据对象赋值的方式,save方法无需传入数据,会自动识别。
save方法的返回值是影响的记录数,如果返回false则表示更新出错。

有些时候,我们只需要修改某个字段的值,就可以使用setField方法,而不需要每次都调用save方法。

  1. $Form = M("Form"); 
  2. // 更改title值
  3. $Form->where('id=5')->setField('title','ThinkPHP');

对于统计字段,系统还提供了更加方便的setInc和setDec方法。
例如:

  1.     $User = M("User"); // 实例化User对象
  2.     $User->where('id=5')->setInc('score',3); // 用户的积分加3
  3.     $User->where('id=5')->setInc('score'); // 用户的积分加1
  4.     $User->where('id=5')->setDec('score',5); // 用户的积分减5
  5.     $User->where('id=5')->setDec('score'); // 用户的积分减1

 

删除数据

删除数据很简单,只需要调用delete方法,例如:

  1. $Form = M('Form');
  2. $Form->delete(5);

表示删除主键为5的数据,delete方法可以删除单个数据,也可以删除多个数据,这取决于删除条件,例如:

  1. $User = M("User"); // 实例化User对象
  2. $User->where('id=5')->delete(); // 删除id为5的用户数据
  3. $User->delete('1,2,5'); // 删除主键为1,2和5的用户数据
  4. $User->where('status=0')->delete(); // 删除所有状态为0的用户数据

delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。

 

总结

现在,你已经基本掌握了ThinkPHP的CURD操作了,并且学会了使用ThinkPHP的create、add、save和delete方法,还有两个对字段操作的getField和setField方法。下一篇,我们会更深入的了解下如何使用ThinkPHP提供的查询语言。


推荐阅读
  • 本文详细介绍了在PHP中如何创建新文件以及如何使自定义函数在整个项目中全局可用的方法,包括最新的实践技巧。 ... [详细]
  • 解决phpMyAdmin运行错误:mysqli_init(): 属性访问尚未允许
    本文探讨了在使用phpMyAdmin过程中遇到的mysqli_init()函数错误,并提供了有效的解决方案。 ... [详细]
  • 本文探讨了在执行SQL查询时遇到的因字符集不同而导致查询结果差异的问题,特别是涉及中文字符时。文章分析了在不同字符集设置下,SQL查询结果的变化,并提供了详细的解决方案。 ... [详细]
  • 本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ... [详细]
  • 一、数据更新操作DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据、修改数据、删除数据。其中这些操作是离不开查询的。1、增加数据语法:INSERTINTO表名称[(字 ... [详细]
  • SQL注入实验:SqliLabs第38至45关解析
    本文深入探讨了SqliLabs项目中的第38至45关,重点讲解了堆叠注入(Stacked Queries)的应用技巧及防御策略。通过实际案例分析,帮助读者理解如何利用和防范此类SQL注入攻击。 ... [详细]
  • Linux 文件系统结构详解
    本文详细介绍了Linux操作系统的文件系统结构,包括其独特的树状目录体系、根目录的作用、目录与磁盘分区的关系等,并对各主要目录的功能进行了深入解析。 ... [详细]
  • KKCMS代码审计初探
    本文主要介绍了KKCMS的安装过程及其基本功能,重点分析了该系统中存在的验证码重用、SQL注入及XSS等安全问题。适合初学者作为入门指南。 ... [详细]
  • 本文详细记录了《PHP与MySQL Web开发》第一章的学习心得,特别关注了PHP的基本构成元素、标记风格、编程注意事项及表单处理技巧等内容。 ... [详细]
  • 本文介绍了如何在Oracle数据库中创建和使用触发器,包括一个具体的触发器实例,用于在插入新员工记录时自动为员工编号赋值。 ... [详细]
  • 本文详细介绍了MySQL中的存储程序概念及其分类,包括存储过程、存储函数、触发器和事件等,每种类型的特点及应用场景,并提供了创建、调用、删除和查看的方法。此外,还对比了存储过程与存储函数的主要区别,帮助读者更好地理解和应用这些数据库特性。 ... [详细]
  • 本文详细介绍了 SQL 中的 CHECK 约束,包括其作用、如何在创建表和修改表时应用 CHECK 约束,以及如何删除 CHECK 约束。CHECK 约束用于确保数据库中的数据符合预定义的条件,从而提高数据的完整性和可靠性。 ... [详细]
  • 本文介绍了在一卡通项目中设计加密管理方案时,证书服务器的配置步骤及其在用户权限控制中的应用。首先概述了证书服务器的基本设置,包括操作系统的选择和证书服务的安装,随后详细描述了服务器证书及客户端证书的创建过程。 ... [详细]
  • 本文详细介绍ThinkPHP框架中的cache方法,涵盖其功能、参数配置及使用场景,特别指出从3.1.2版本起,cache方法已被S方法取代。 ... [详细]
  • CGroups: 资源管理和控制
    CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ... [详细]
author-avatar
rvu2352314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有