ca888会员登录:ThinkPHP 学习笔记 ( 三 ) 数据库操作

2019-04-09 11:43栏目:编程程序

  定义代码如下:

代码知识要点:
Model类的$_auto属性由八个填充因子组成的数组,填充因子定义格式:

那儿浏览器输出:

Conf文件夹:项目标周转配置文件config.php将身处这几个文件夹里,(还有路由配置,调节和测试配置等,请先忽略)

 

$Form->create()
使用Model类的Create方法创造叁个Form对象,失利会回来false。

为了幸免前台表单成分与数据库字段名相同而使数据库字段暴光,能够修改前台表单成分的 name,同时在 Model 中动用 _map 属性。代码:

贰在Conf文件夹内,建立一个config.php文件。这几个文件,正是Myapp项指标布署文件。系统会自动加载
config.php文件中的配置是以数组重临格局展开定义,会覆盖TP框架中的common目录下convention.php的私下认可配置。未有安装的计划,就以私下认可为准。配置安装能够选拔C函数动态改变,一时半刻不必理会。
而笔者辈连接受数据库的设置也是在这么些文件中书写。

  那样,大家的 BaseModel 就定义好了,以往项目中的 Model 就不再接续 TP 的 Model 类了,而是继续大家自定义的 BaseModel 了。

CU安德拉D知识之一 C 成立(create)

<?php    class IndexAction extends Action {            public function delete(){            $articleObj = M("Article");          if($articleObj->where("id=".$_GET['id'])->delete()){                $this->success("数据删除成功");          }else{                $this->error("数据删除失败");          }      }  }

复制代码

 

支出进度中,只要容易地定义好与数据表对应的模型类(xxxModel.class.php),就足以拓展对数据操作了。
怎样让这么些模型支撑电动验证,自动填充,自动过滤那么些知识,在上边涉及到时会作相应讲解。

<?php    class IndexAction extends Action {      public function post2(){            $articleObj = M("Article");          $data['id'] = 2;          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['area'] = '河北';          $data['add_time'] = date("Y-m-d H:i:s",time());          if($articleObj->save($data)){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }
  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $array = array();
  5.         $array['name']    =    'thinkphp';
  6.         $array['email']   =    'liu21st@gmail.com';
  7.         $array['phone']   =    '12335678';
  8.         $value  =   'hello,ThinkPHP';
  9.         $this->assign('array',$array);
    1.         $this->assign('name',$value);
    1.         $this->display();
    1.     }
  10. }

  11. ?>

  use 引入的命名空间是 AdminModelBaseModel ,因为咱们定义的 BaseModel 的命名空间是 AdminModel,因为那边的 TrunkModel 和 BaseModel 在3个命名空间下,省去 use 也是可以的。

近些年可比绕有趣味地读书PHP,看完了有的基础语法、学会了选用SMA大切诺基Y模版,继而看了ThinkPHP框架,

ca888会员登录 1ca888会员登录 2

如此那般说应该很领会了,但是别让这么多index给混乱咯,对应URubiconL的结构去驾驭每3个index的函义,同时注意分寸写

  自定义五个 Model,Model 中至少重新 TP 提供的 Model 中的 add、save、delete 和 select 方法。

模型类的非正规命名还足以智能识别驼峰式的表命名,如若我们有个是近似think_new_table那样的表
能够命名称叫NewTableModel.class.php。暗中同意配置便得以智能识别自动对应think_new_table表,因而不要修改配置。

add 动作代码:

代码知识要点(摘自手册:ThinkPHP模板指南,此后的文化要点均出自TP官方手册,不再表明)

  继承的 BaseModel 的措施和一而再 Model 的艺术是千篇一律的,只是使用 use 引进命名空间到当前效应域时的急需修改为我们的命名空间,而不是再去选用 TP 提供的命名空间。代码如下:

上面重要说说function与callback那四个附加规则。

<?php  class ArticleModel extends Model{        //使用_map属性(字段映射)将表单元素映射为相应表字段      protected $_map = array(                    "subject"=>"title",          "textEdit"=>"content"      );    }

Tpl文件夹:模板文件目录,内有一个default文件夹,也正是暗许的风格。
花色转移的目录结构就先不难介绍到那里,下一步大家要简明地对品种进展最基本的布署。

继续大家定义的基类

就算将情状status字段的值间接以壹填充.

IndexAction.class.php:

  1.     <IfModule mod_rewrite.c>
  2.     RewriteEngine on
  3.     RewriteCond %{REQUEST_FILENAME} !-d
  4.     RewriteCond %{REQUEST_FILENAME} !-f
  5.     RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
  6.     </IfModule>
1 <?php
2 namespace AdminModel;
3 use AdminModelBaseModel;
4 
5 class TrunkModel extends BaseModel {

二 打开Myapp/Tpl/default/Index/index.html文件,大家修改代码将form写进去

开辟浏览器,输入ca888会员登录,

无聊的需求

复制代码

3.create 方法

二尝试对应U奥德赛L结构,来访问那几个test操作,假使能打响看到echo的文字。则这节大家又学会了多或多或少文化。

  在接纳 Java 的开源项目 JeeSite 时,养成了一个倒霉的习惯,习惯给每张表都增添create_by、create_date、update_by、update_date、remarks 和 del_flag 这么多少个字段。要是每张表都有那多少个字段,那么对每张表实行 insert 时都会对上述的字段实行安装,对每张表举行 update 时都会对当中部分字段举行更新,对每条记下实行 delete 时都其实是对 del_flag 字段实行置位。重复操作很多,1些操作方法被改动。那么,那个时候就要自定义二个要好的 Model 来作为项目标 基类 了,那一个 Model 就担负干下面作者说的那个事情了。

复制代码

例:使用 select() 输出 tpk_article 表的数据 ( select() 方法用于列出全部符合条件的数据 ) :

Data文件夹:TP会把品种的数据库表字段生成到那里,其余。。。那多少个先不用理会。

 1 <?php
 2 namespace AdminModel;
 3 use ThinkModel;
 4 
 5 /**
 6  * 项目中其他 Model 类的基类
 7  * 该类继承自 TP 提供的基类 Model
 8  */
 9 class BaseModel extends Model {
10     
11     /**
12      * 继承基类 Model 的 add 方法
13      * 自动插入 id create_by create_date update_by update_date del_flag
14      */
15     public function add($data='',$options=array(),$replace=false) {
16         
17         $data["id"]          = $this->getUuid();
18         $data["create_by"]   = "";
19         $data["create_date"] = date("Y-m-d H:i:s");
20         $data["update_by"]   = "";
21         $data["update_date"] = date("Y-m-d H:i:s");
22         $data["del_flag"]    = '0';
23         
24         return parent::add($data, $options, $replace);
25     }
26     
27     /**
28      * 获得 未删除 的所有数据
29      * 记录是否被删除通过 del_flag 字段来进行确定
30      */
31     public function select($options=array()) {
32         $map["del_flag"] = 0;
33         $this->where($map);
34         
35         return parent::select($options);
36     }
37     
38     /**
39      * 获取 全部 的所有数据
40      */
41     public function selectAll($options=array()) {
42         return parent::select($options);
43     }
44     
45     /**
46      * 更新数据
47      * 更新数据时,要更新 update_by update_date 两个字段
48      */
49     public function save($data='',$options=array()) {
50         $data["update_by"]   = "";
51         $data["update_date"] = date("Y-m-d H:i:s");
52         
53         return parent::save($data, $options);
54     }
55     
56     /**
57      * 删除也是更新
58      * 设置 删除 标志位即可
59      */
60     public function delete($data='',$options=array()) {
61         $data["del_flag"] = 1;
62         
63         return parent::save($data, $options);
64     }

所以前边我们为think_form数据表在Myapp/Lib/Model目录下建立三个文件FormModel.class.php

附:数据表 tpk_article 的表结构为:

第陆节早先领会URL怎样访问模块操作

 

我们来探望add方法的代码。
$Form = D("Form");
此处运用了TP的特色单字母函数D,是操作数据库时最常用的TP函数,表示实例化Form对象,
即$Form = new FormModel();
D函数的有血有肉代码能够查看ThinkPHP目录内的common/function.php中的片段,
它会活动引进Model类,并判断在此以前如果实例化过那些Model,就不再实例化,若然该Model不存在,就会抛出尤其错误,其它,D能够跨类别访问Model,一时忽略。

cerate() 的数据源由 POST 表单提供,比如表单中有 username 表单成分,则该因素会被电动映射为多少表中的 username 字段。数据对象创造成功未来,对象被存放在于内存中。

在Action类里面使用 assign方法对模板变量赋值,无论何种变量类型都统1行使assign赋值。

  那样,在我们用 D 方法实例化 TrunkModel 的靶子后,使用 add 方法插入数据时,就会先调用 BaseModel 中的 add 方法了,那样我们每张表都有的 create_by 等一名目繁多字段就都会活动获取了。

  1. protected $_auto  =  array(
  2. array('create_time','time','ADD','function'),
  3. );

壹.连贯操作

就那样定义1个类名就行了。该类继承了Model类。至于自动验证,自动过滤,自动填写这一个,近日不理会。

 

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>{$title}</title>
  5. </head>
  6. <body>
  7. <form action="__URL__/add" method="post" name="formname" id="formname">
  8.     <p>
  9.            <label for="title">标题:</label>
  10.            <input name="title" type="text" id="title" />
  11.     </p>
  12.     <p>
  13.            <label for="email">邮箱:</label>
  14.           <input name="email" type="text" id="email" />
  15.     </p>
  16.     <p><label for="content">内容:</label></p>
  17.     <p>
  18.         <textarea name="content" rows="5" cols="25" id="content" ></textarea>
  19.     </p>
  20.     <p><input type="submit" value="提交" /></p>
  21. </form>
    </body>
    </html>
<?php  class IndexAction extends Action {        $obj=D("Article");      $rows=$obj->article();      $this->assign("list",$rows);      $this->display();
  1. <?php
  2.     // 定义ThinkPHP路径
  3.     define('THINK_PATH','./ThinkPHP');
  4.     // 定义项目名称
  5.     define('APP_NAME','Myapp');
  6.     // 定义项目路线
  7.     define('APP_PATH','./Myapp');
  8.     // 加载入口文件
  9.     require(THINK_PATH.'/ThinkPHP.php');
    1.     // 实例化这几个体系
    1.     $App = new App();
    1.     // 执行初阶化
    1.     $App->run();
  10. ?>

自定义三个 Model

在第3节时,曾略为涉及Model类文件命名,今后再回首一下那有个别的剧情:
大家事先在数据库中,已成立了三个think_form数据库表,并且在布局文件config.php中,我们定义了数据表的前缀是think_,
模型类(Model)文件的命名规则是:


Action:模块控制器类,你一时半刻能够知道为1个Action文件表示着一个用到模块,Action文件中的每五个方法(function)代表着叁个操作,操作分为有出口到模板的操作和只具执行不须要输出的操作。对于有出口的操作,则代表了您的类型中三个出示给用户使用的web页面。(注意:那不是标准的术语解释)

   ThinkPHP 提供了一个 Model 类,供别的的 Model 举行持续。Model 类中是 MVC 中的模型类,它是调用 持久层 的上层类。感觉那样描述难点多多,可是有如何艺术吧?不过,那个 Model 有时不可能满意我们的一些急需,因而大家须要自定义七个 Model 类出来,可是自定义的 Model 同样要持续 TP 提供的 Model 类,而把咱们自定义的 Model 类作为我们项目中的 Model 基类。我怎么觉得自个儿在说绕口令,等等...笔者有点晕。

三 设置模板变量 {$title} ,增加add操作方法

<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="title" placeholder="标题"><br><br>          <textarea name="content" id="content" placeholder="内容"></textarea><br><br>          <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

五 在www根目录下,创设多少个PHP文件,起名index.php,那正是进口文件

选用TP以表单提交数据到库,流程和你所领会的表单提交未有何样界别,只是TP简化了数量操作的处理进度。
大家在实操中体会一下。
先来探视大家所定义的数额表form的字段:

四.模子属性( Model )

4 与ThinkPHP同级新建3个文书夹,起名字为 Myapp,也正是项目名称


ca888会员登录 3ca888会员登录 4

// 模板变量赋值后就必要调用模板文件来输出相关的变量,模板调用通过display方法来兑现

  1. 'id',//自动编号
  2. 'title',//标题
  3. 'content',//内容
  4. 'create_time',//创设时间
  5. 'update_time'//更新时间
  6. 'email',//邮箱
  7. 'status',//状态

 

3 将那么些数组循环输出

填充字段:便是急需进行处理的表单字段,那一个字段并不一定如若数据库表中的字段,对于表单内的相助检验字段比如重复密码和验证码也足以处理。
填充条件:ADD | UPDATE | ALL(注意,此是一.伍版本表明,一.6已改为1 贰三,后续教程有证实)
当为ADD时,会在新增多少时自动填充,那是暗许的处理格局
当为UPDATE时,在更新数据的时候会活动填写
当为ALL时,全部意况下都会议及展览开自动填写

<?php  class IndexAction extends Action {        public function add(){            //表单处理          $articleObj = M('Article');          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }  }

入口文件index.php代码:

在地点代码中,大家简要地建了一个form表单,并将题目统一选择三个模板变量{$title}。
action提交到的拍卖地点是__URL__/add,其中__URL__是一个常量定义,表示最近模块地址,TP模板引擎会自行将那句解释为/index.php/Index/add,常见的模版使用的常量有

object(Model)#5 (20) {    ["_extModel:private"] => NULL    ["db:protected"] => object(DbMysql)#7 (18) {      ["dbType:protected"] => string(5) "MYSQL"      ["autoFree:protected"] => bool(false)      ["model:protected"] => string(7) "_think_"      ["pconnect:protected"] => bool(false)      ["queryStr:protected"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      ["modelSql:protected"] => array(1) {        ["user"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      }      ["lastInsID:protected"] => NULL      ["numRows:protected"] => int(2)      ["numCols:protected"] => int(0)      ["transTimes:protected"] => int(0)      ["error:protected"] => string(0) ""      ["linkID:protected"] => array(1) {        [0] => resource(27) of type (mysql link)      }      ["_linkID:protected"] => resource(27) of type (mysql link)      ["queryID:protected"] => resource(28) of type (mysql result)      ["connected:protected"] => bool(true)      ["comparison:protected"] => array(10) {        ["eq"] => string(1) "="        ["neq"] => string(2) "<>"        ["gt"] => string(1) ">"        ["egt"] => string(2) ">="        ["lt"] => string(1) "<"        ["elt"] => string(2) "<="        ["notlike"] => string(8) "NOT LIKE"        ["like"] => string(4) "LIKE"        ["in"] => string(2) "IN"        ["notin"] => string(6) "NOT IN"      }      ["selectSql:protected"] => string(96) "SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%"      ["bind:protected"] => array(0) {      }    }    ["pk:protected"] => string(2) "id"    ["tablePrefix:protected"] => string(4) "tpk_"    ["name:protected"] => string(4) "user"    ["dbName:protected"] => string(0) ""    ["connection:protected"] => string(0) ""    ["tableName:protected"] => string(0) ""    ["trueTableName:protected"] => string(8) "tpk_user"    ["error:protected"] => string(0) ""    ["fields:protected"] => array(5) {      [0] => string(2) "id"      [1] => string(8) "username"      ["_autoinc"] => bool(true)      ["_pk"] => string(2) "id"      ["_type"] => array(2) {        ["id"] => string(7) "int(11)"        ["username"] => string(11) "varchar(20)"      }    }    ["data:protected"] => array(0) {    }    ["options:protected"] => array(0) {    }    ["_validate:protected"] => array(0) {    }    ["_auto:protected"] => array(0) {    }    ["_map:protected"] => array(0) {    }    ["_scope:protected"] => array(0) {    }    ["autoCheckFields:protected"] => bool(true)    ["patchValidate:protected"] => bool(false)    ["methods:protected"] => array(13) {      [0] => string(5) "table"      [1] => string(5) "order"      [2] => string(5) "alias"      [3] => string(6) "having"      [4] => string(5) "group"      [5] => string(4) "lock"      [6] => string(8) "distinct"      [7] => string(4) "auto"      [8] => string(6) "filter"      [9] => string(8) "validate"      [10] => string(6) "result"      [11] => string(4) "bind"      [12] => string(5) "token"    }  }

第5节不难询问TP的模版输出
上一章节大家聊到到,

上面create_time代表了要拍卖的字段,填充内容是time,附加规则是function使用函数,填充条件是ADD新增时处理,那么整行代码表示对create_time字段在增产的时候使time函数作为该字段的值实行活动填写。
再看2个function作为附加规则的例子

<?php    class IndexAction extends Action {        public function post3(){            $articleObj = M("Article");          if($articleObj->where("id=3")->setField("content","{$_POST['subject']}")){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }
  1. ^_^ Hello,欢迎使用ThinkPHP!

其中的create_time字段是为了记录数据插入的日子,大家能够运用TP的数额自动填充来处理。

__URL__/add 表示方今控制器的 add 动作。

在意:以下的步子,仅仅是TP灵活的安插方式之中1种,实际支付中得以依照本身的事态去重新设定。
有关为何那么做,大家会在结尾再作总括,笔者以为先实际操作然后再开始展览求证比较易于掌握。以下不再重复解释。

当使用function作为附加规则时,第三个填充内容就象征了那一个因子是3个函数名称,该函数的参数就是意味填充字段的值,比如password的值是12345陆,则上边的代码会先将这些值使用函数md5('12345六'),那样处理后再插入到数据表中去。
对于function(函数)和callback(回调方法)理论是均等的,只然而一个是意味填充内容所写的是函数名,另三个是表示填充内容是类中的方法名。函数能够是PHP伍内置函数或你自身所写的函数。而callback是近期模型类所能调用的2个艺术。 有关数据填充方面包车型大巴详细资料,请参见官方使用手册 《ThinkPHP数据操作指南》

例:

解释一下上边文字中所译的URubiconL结构,
缘何appname项目名称笔者将它译成了入口文件地点:平日意况下,我们的输入文件index.php都以身处根目录中,那时项目名称就会被进口文件index.php所替代。在前几节里,大家已清楚,一个Action文件便是一个使用模块,而选择模块中的每一个方法(function)正是二个具体操作。由此,假使要拜访我们实例中的Index模块下的index操作。地址应该是

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index() {
  4.            $this->assign('title','添加数据');//那里设置了模版变量{$title}
  5.            $this->display();
  6.     }
  7.     // 处理表单数据的办法
  8.     function add()  {
  9.           $Form = D("Form");
  10.           if($Form->create()) {
  11.                    $Form->add();
  12.                    $this->redirect();
  13.           }else{
  14.                    header("Content-Type:text/html; charset=utf-8");
  15.                    exit($Form->getError().' [ <A >返 回</A> ]');
  16.          }
  17.     }
  18. }//类定义 end
  19. ?>

3 读取数据 select 和 getFiled

复制代码

array(填充字段,填充内容,填充条件,附加规则)

事例截至。

复制代码

不包涵前缀的数据库表表名还要首字母大写 Model.class.php

ca888会员登录 5

$Form->add(); //add方法会将表单数据举行写入
$this->redirect(); //执行跳转
就那样简单几行代码,便成功了对数据插入的处理。

控制器:IndexAction.class.php:

TP: ThinkPHP框架的简称

  1. array('status','1','ADD'),

视图:Tpl/Index/add_article.html:

  1. $this->name = $value ;

壹 打开Myapp/Lib/Model/FormModel.class.php文件,更改代码为

<!DOCTYPE html>  <html>  <body>    <volist name="list" id="vo">      <li><{$vo.title}> - <{$vo.area}> - <{$vo.content}></li>  </volist>    </body>  </html>

复制代码

__ROOT__    网站根目录地址
__APP__         当前项目(入口文件)地址
__URL__         当前模块地址
__ACTION__   当前操作地址
__SELF__       当前 URL 地址

<?php  class IndexAction extends Action {        Public function add_article(){            $this->display();      }  }

// 上面包车型客车写法是一致的

2  模型对象:即数据对象,你项目里每多个Model类文件都会对应着一个数据表(或然视图),模型与数码表存在1种炫耀关系。TP约定了命名要安份守己一定的正式,假设不合乎,则须要依照气象展开额外的附和设置。例如Model类的tableName属性

TP 对数码的插入和更新都做了冲天封装:提供了 create() 方法用于创制数量对象。

1 下载TP1.5正式版

名词解析:
1  CURD:意味着数据库五个基本操作:创建:create,更新:update,读取:read,删除:delete

贯穿方法除了 select() 方法外,别的的贯通方法不区分前后相继。

出于岁月涉及,此种类联合学习课程更新的速度会相比慢些,请多担待,上一章节的剧情请看这里。

在Model类定义 $_auto 属性,能够完结多少自动处理作用,用来处理默许值和别的 onclick="tagshow(event)">系统写入字段。
注意一:该机关填写只怕会覆盖表单提交项目。其目标是为着防备表单违法提交字段。
瞩目2:要选取Model类的create方法成立数量对象的时候才会活动进行表单数据处理。

1 创制数量 add()

名词解释:

  1. protected $_auto  =  array(
  2. array('password','md5','ADD','function'),
  3. );

 

二简单认识项目里的一一文件夹

叠加规则:外加规则是本着填充内容而言,表示该内容填充的方法,包蕴function,callback,田野,string
对此田野使用别的字段实行填空和string直接标示字符串作为值实行填空很好驾驭。例如地方

 

[教程] 一步一步遵纪守法学习TP③(新手篇)

貌似的话,在表中添加多少都以透过表单来树立,为了越来越直观地上学CUSportageD中的C,大家接下去建立个表单来拓展添加数据的操作。
前边我们已在Myapp/Lib/Model/下创立好FormModel.class.php类----模型(M)
并且也在Myapp/Lib/Action/下添加了二个Index应用模块和写下了三个index操作----控制器(C)
还要在Tpl目录下树立了与之相应的模板目录Index及index.html模板文件 -------视图(V)
MVC方式的开发已反映了出去。
tdweb曾简单地包含了TP中这三者的关系,

 

  1. <?php
  2. class IndexAction extends Action{
  3.     public function index(){
  4.         $form = D('Form')->findall();
  5.         dump ( $form );
  6.         exit;
  7.     }
  8. }
  9. ?>
  1. <?php
  2. class FormModel extends Model {
  3. // 自动填写设置
  4. protected $_auto  =  array(
  5.   array('status','1','ADD'),
  6.         array('create_time','time','ADD','function'),
  7. );
  8. }
  9. ?>

 

============================================

版权声明:本文由ca888发布于编程程序,转载请注明出处:ca888会员登录:ThinkPHP 学习笔记 ( 三 ) 数据库操作