最近比较绕有兴趣地学习PHP,看完了一些基础语法、学会了使用SMARY模版,继而看了ThinkPHP框架,
此框架的强大超出我的意外,它的ROR真是强,还有内置的CRUD,比JAVA的框架更智能。
方便记忆性的学习转载了一些以下文章
CURD知识之一 C 创建(create)
名词解析:
1 CURD:代表数据库四个基本操作:创建:create,更新:update,读取:read,删除:delete
2 模型对象:即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数据表存在一种映射关系。TP约定了命名要遵循一定的规范,如果不符合,则需要根据情况进行额外的相应设置。例如Model类的tableName属性
在第三节时,曾略为提到Model类文件命名,现在再回顾一下这部分的内容:
我们之前在数据库中,已建立了一个think_form数据库表,并且在配置文件config.php中,我们定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:
不包括前缀的数据库表表名并且首字母大写+Model.class.php
所以之前我们为think_form数据表在Myapp/Lib/Model目录下建立一个文件FormModel.class.php
模型类的特殊命名还可以智能识别驼峰式的表命名,假设我们有个是类似think_new_table这样的表
可以命名为NewTableModel.class.php。默认配置便可以智能识别自动对应think_new_table表,因此不必修改配置。
开发过程中,只要简单地定义好与数据表对应的模型类(xxxModel.class.php),就可以进行对数据操作了。
如何让这个模型支持自动验证,自动填充,自动过滤这些知识,在下面涉及到时会作相应讲解。
一般来说,在表中添加数据都是通过表单来建立,为了更直观地学习CURD中的C,我们接下来建立个表单来进行添加数据的操作。
之前我们已在Myapp/Lib/Model/下建立好FormModel.class.php类----模型(M)
同时也在Myapp/Lib/Action/下添加了一个Index应用模块和写下了一个index操作----控制器(C)
并且在Tpl目录下建立了与之对应的模板目录Index及index.html模板文件 -------视图(V)
MVC模式的开发已体现了出来。
tdweb曾简明扼要地概括了TP中这三者的关系,
C的作用,就是从M中取得数据到V,
使用TP以表单提交数据到库,流程和你所了解的表单提交没有什么区别,只是TP简化了数据操作的处理过程。
我们在实际操作中体会一下。
先来看看我们所定义的数据表form的字段:
- 'id',//自动编号
- 'title',//标题
- 'content',//内容
- 'create_time',//创建时间
- 'update_time'//更新时间
- 'email',//邮箱
- 'status',//状态
其中的create_time字段是为了记录数据插入的时间,我们可以利用TP的数据自动填充来处理。
在Model类定义 $_auto 属性,可以完成数据自动处理功能,用来处理默认值和其他系统写入字段。
注意1:该自动填充可能会覆盖表单提交项目。其目的是为了防止表单非法提交字段。
注意2:要使用Model类的create方法创建数据对象的时候才会自动进行表单数据处理。
1 打开Myapp/Lib/Model/FormModel.class.php文件,更改代码为
- <?php
- class FormModel extends Model {
- // 自动填充设置
- protected $_auto = array(
- array('status','1','ADD'),
- array('create_time','time','ADD','function'),
- );
- }
- ?>
代码知识要点:
Model类的$_auto属性由多个填充因子组成的数组,填充因子定义格式:
array(填充字段,填充内容,填充条件,附加规则)
填充字段:就是需要进行处理的表单字段,这个字段并不一定要是数据库表中的字段,对于表单内的辅助检测字段比如重复密码和验证码也可以处理。
填充条件:ADD | UPDATE | ALL(注意,此是1.5版本说明,1.6已改为1 2 3,后续教程有说明)
当为ADD时,会在新增数据时自动填充,这是默认的处理方式
当为UPDATE时,在更新数据的时候会自动填充
当为ALL时,所有情况下都会进行自动填充
附加规则:附加规则是针对填充内容而言,表示该内容填充的方式,包括function,callback,field,string
对于field使用其它字段进行填充和string直接标示字符串作为值进行填充很好理解。例如上面
- array('status','1','ADD'),
就是将状态status字段的值直接以1填充.
下面主要说说function与callback这两个附加规则。
- protected $_auto = array(
- array('create_time','time','ADD','function'),
- );
上面create_time代表了要处理的字段,填充内容是time,附加规则是function使用函数,填充条件是ADD新增时处理,那么整行代码表示对create_time字段在新增的时候使time函数作为该字段的值进行自动填充。
再看一个function作为附加规则的例子
- protected $_auto = array(
- array('password','md5','ADD','function'),
- );
当使用function作为附加规则时,第二个填充内容就代表了这个因子是一个函数名称,该函数的参数就是代表填充字段的值,比如password的值是123456,则上面的代码会先将这个值使用函数md5('123456'),这样处理后再插入到数据表中去。
对于function(函数)和callback(回调方法)理论是一样的,只不过一个是表示填充内容所写的是函数名,另一个是表示填充内容是类中的方法名。函数可以是PHP5内置函数或你自己所写的函数。而callback是当前模型类所能调用的一个方法。
有关数据填充方面的详细资料,请参看官方使用手册 《ThinkPHP数据操作指南》
2 打开Myapp/Tpl/default/Index/index.html文件,我们修改代码将form写进去
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <html>
- <head>
- <title>{$title}</title>
- </head>
- <body>
- <form action="__URL__/add" method="post" name="formname" id="formname">
- <p>
- <label for="title">标题:</label>
- <input name="title" type="text" id="title" />
- </p>
- <p>
- <label for="email">邮箱:</label>
- <input name="email" type="text" id="email" />
- </p>
- <p><label for="content">内容:</label></p>
- <p>
- <textarea name="content" rows="5" cols="25" id="content" class="textarea" ></textarea>
- </p>
- <p><input type="submit" value="提交" /></p>
- </form>
</body>
</html>
在上面代码中,我们简单地建了一个form表单,并将标题统一使用一个模板变量{$title}。
action提交到的处理地址是__URL__/add,其中__URL__是一个常量定义,表示当前模块地址,TP模板引擎会自动将这句解释为/index.php/Index/add,常见的模板使用的常量有
__ROOT__ 网站根目录地址
__APP__ 当前项目(入口文件)地址
__URL__ 当前模块地址
__ACTION__ 当前操作地址
__SELF__ 当前 URL 地址
3 设置模板变量 {$title} ,增加add操作方法
打开Myapp/Lib/Action/IndexAction.class.php文件,修改代码如下
- <?php
- class IndexAction extends Action{
- public function index() {
- $this->assign('title','添加数据');//这里设置了模板变量{$title}
- $this->display();
- }
- // 处理表单数据的方法
- function add() {
- $Form = D("Form");
- if($Form->create()) {
- $Form->add();
- $this->redirect();
- }else{
- header("Content-Type:text/html; charset=utf-8");
- exit($Form->getError().' [ <A HREF="javascript:history.back()">返 回</A> ]');
- }
- }
- }//类定义 end
- ?>
代码知识要点:
模板变量赋值前面的章节已介绍过。这里就不啰嗦了。
我们来看看add方法的代码。
$Form = D("Form");
这里使用了TP的特色单字母函数D,是操作数据库时最常用的TP函数,表示实例化Form对象,
即$Form = new FormModel();
D函数的具体代码可以查看ThinkPHP目录内的common/function.php中的片段,
它会自动引入Model类,并判断之前如果实例化过这个Model,就不再实例化,若然该Model不存在,就会抛出异常错误,另外,D可以跨项目访问Model,暂且忽略。
$Form->create()
使用Model类的Create方法创建一个Form对象,失败会返回false。
$Form->add(); //add方法会将表单数据进行写入
$this->redirect(); //执行跳转
就这么简单几行代码,便完成了对数据插入的处理。