真XX项目 TP连贯操作总结

真XX项目 TP连贯操作总结

field方法的用法

参考链接:CURD方法盘点:field方法

用于查询

  • 在查询操作中field方法是使用最频繁的。

    eg1:$Model
        ->field('id,title,content')
        ->select();
    

    复制代码这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于:
    SELECT id,title,content FROM table

  • 可以as取别名

    eg2: $Select
            ->field('id as role_id,role_name,role_type')
            ->select();
    
  • 数组方式的定义可以为某些字段定义别名

    eg:$Model
            ->field(array('id','title'=>'name','content'))
            ->select();
    
  • 与while()和find()查询

    M('User')
        ->where('id='.$userid)
        ->field('id as userid,user_role,follow,fans,love,head as photo,city,nickname,sex,age,message')
        ->find();
    

ps:while提供查询条件,find只查询一条即系统自动加上了 LIMIT 1 限制

find参考链接:ThinkPHP find方法 查询一条数据记录

  • 表取别名 分页 查询

    $Follow
        ->alias('c')   
            //给表去别名。alias用于设置当前数据表的别名
            便于使用其他的连贯操作例如join方法等。
        ->join('__USER__ u ON c.c_bei= u.id')
            //JOIN方法是连贯操作中唯一可以多次调用的方法
        ->where("c.c_zhu='{$userid}'")
        ->field('c.c_bei,u.id as accountid,u.sex,u.nickname,u.head as photo,u.message')
        ->limit($page,$number)
            //分页查询
        ->select();
            //返回一个二维数组的查询结果
    
  • table多表进行操作

    $Model
        ->table('zca_blacklist bl,zca_user user')
            //多表查询并取别名
        ->where("bl.user='{$userid}' AND bl.blacklister = user.id")
        ->field('user.id,user.nickname,user.head as photo,user.sex,user.message')
        ->limit($page,$number)
        ->select();
    

    ps:CURD方法盘点:table方法

  • 排序

    $Photo
        ->field('url')
        ->where("album='{$albumid}'")
        ->order('add_time asc')
        ->find()['url'];
    

    ps:order方法

用于写入

  • 除了查询操作之外,field方法还有一个非常重要的安全功能–字段合法性检测(注意:该功能3.1版本开始才能支持)。field方法结合create方法使用就可以完成表单提交的字段合法性检测:

    $Model
        ->field('title,email,content')
        ->create();
            //表单中的合法字段只有title,email和content字段
              无论用户通过什么手段更改或者添加了浏览器的提交字段
              都会直接屏蔽
    

ps:create方法


where方法的用法

参考链接:CURD方法盘点:where方法

字符串条件

  • 使用字符串条件直接查询和操作

    $User
        ->where('type=1 AND status=1')
        ->select(); 
    

    最后生成的SQL语句是:SELECT * FROM think_user WHERE type=1 AND status=1

  • 如果使用3.1以上版本的话,使用字符串条件的时候,建议配合预处理机制,确保更加安全

    $Model
        ->where("id=%d and username='%s' andxx='%f'",array($id,$username,$xx))
        ->select();
    

    或者使用:

        $Model
            ->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)
            ->select();
    

    ps:如果$id变量来自用户提交或者URL地址的话,如果传入的是非数字类型,则会强制格式化为数字格式后进行查询操作。
    字符串预处理格式类型支持指定数字、字符串等,具体可以参考vsprintf方法的参数说明。

    参考链接:PHP vsprintf() 函数


数组条件

  • 普通查询

    $User = M("User");
         // 实例化User对象
    $map['name'] = 'thinkphp';
    $map['status'] = 1;
        // 把查询条件传入查询方法
    $User->where($map)->select(); 
    

    最后生成:SELECT * FROM think_user WHERE name=’thinkphp’ AND status=1

  • 表达式查询

    $map['字段1']  = array('表达式','查询条件1');
    $map['字段2']  = array('表达式','查询条件2');
    $Model->where($map)->select(); 
    

    表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:

    表达式 含义
    EQ 等于(=)
    NEQ 不等于(<>)
    GT 大于(>)
    EGT 大于等于(>=)
    LT 小于(<)
    ELT 小于等于(<=)
    LIKE 模糊查询
    [NOT] BETWEEN (不在)区间查询
    [NOT] IN (不在)IN 查询
    EXP 表达式查询,支持SQL语法

示例如下:

  • EQ :等于(=)

            $map['id']  = array('eq',100);
    

    和下面的查询等效

            $map['id']  = 100;
    

    表示的查询条件就是 id = 100

  • NEQ: 不等于(<>)

    $map['id']  = array('neq',100);
    

    表示的查询条件就是 id <> 100

  • GT:大于(>)

    $map['id']  = array('gt',100);
    

    表示的查询条件就是 id > 100

  • EGT:大于等于(>=)

    $map['id']  = array('egt',100);
    

    表示的查询条件就是 id >= 100

  • LT:小于(<)

    $map['id']  = array('lt',100);
    

    表示的查询条件就是 id < 100

  • ELT: 小于等于(<=)

    $map['id']  = array('elt',100);
    

    表示的查询条件就是 id <= 100

  • [NOT] LIKE: 同sql的LIKE

    $map['name'] = array('like','thinkphp%');
    

    查询条件就变成 name like ‘thinkphp%’
    如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。
    例如设置了:

        'DB_LIKE_FIELDS'=>'title|content'
    

    的话,使用

    $map['title'] = 'thinkphp';
    

    查询条件就会变成 name like ‘%thinkphp%’

    支持数组方式,例如

    $map['a'] =array('like',array('%thinkphp%','%tp'),'OR');
    $map['b'] =array('notlike',array('%thinkphp%','%tp'),'AND');
    
    生成的查询条件就是:
    (a like '%thinkphp%' OR a like '%tp') AND (b not like '%thinkphp%' AND b not like '%tp')
    
  • [NOT] BETWEEN :同sql的[not] between, 查询条件支持字符串或者数组

    例如:

    $map['id']  = array('between','1,8');
    

    和下面的等效:

        $map['id']  = array('between',array('1','8'));
    

    查询条件就变成 id BETWEEN 1 AND 8

  • [NOT] IN: 同sql的[not] in ,查询条件支持字符串或者数组
    例如:

    $map['id']  = array('not in','1,5,8');
    

    和下面的等效:

    $map['id']  = array('not in',array('1','5','8'));
    

    查询条件就变成 id NOT IN (1,5, 8)

  • EXP:表达式,支持更复杂的查询情况
    例如:

    $map['id']  = array('in','1,3,8');
    

    可以改成:

    $map['id']  = array('exp',' IN (1,3,8) ');
    

    exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。

    查询表达式不仅可用于查询条件,也可以用于数据更新

    例如:

    $User = M("User"); // 实例化User对象
        // 要修改的数据对象属性赋值
    $data['name'] = 'ThinkPHP';
    $data['score'] = array('exp','score+1');
        // 用户的积分加1
    
    $User
        ->where('id=5')
        ->save($data);
         // 根据条件保存修改的数据
    


快捷查询

    $User = M("User"); // 实例化User对象
    $map['name|title'] = 'thinkphp';
        // 把查询条件传入查询方法
    $User
        ->where($map)
        ->select(); 

查询条件就变成

    name= 'thinkphp' OR title = 'thinkphp


User=M(User);//User map[‘status&title’] =array(‘1’,’thinkphp’,’_multi’=>true);
// 把查询条件传入查询方法
User>where( map)
->select();

‘_multi’=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = ‘thinkphp’ ,查询字段支持更多的,

例如:

$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);

查询条件就变成

 status= 1 AND score >0 AND title = 'thinkphp'

注意:快捷查询方式中“|”和“&”不能同时使用。


区间查询

where方法支持对某个字段的区间查询,

例如:

  • AND

    $map['id'] = array(array('gt',1),array('lt',10)) ;
    

    得到的查询条件是:

    (`id` > 1) AND (`id` < 10)
    


  • OR

    $map['id'] = array(array('gt',3),array('lt',10), 'or') ;
    

    得到的查询条件是:

        (`id` > 3) OR (`id` < 10)
    


  • AND

    $map['id']  = array(array('neq',6),array('gt',3),'and'); 
    

    得到的查询条件是:

        (`id` != 6) AND (`id` > 3)
    

    最后一个可以是AND、 OR或者 XOR运算符,如果不写,默认是AND运算。
    区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起

例如:

    $map['name']  = 
        array(array('like','%a%'), 
        array('like','%b%'), 
        array('like','%c%'), 
        'ThinkPHP','or'); 


最后的查询条件是:

    (`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')


组合查询

组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。

  • 字符串模式查询

    • _string

      数组条件还可以和字符串条件混合使用

      例如:

      $User = M("User"); // 实例化User对象
      $map['id'] = array('neq',1);
      $map['name'] = 'ok';
      $map['_string'] = 'status=1 AND score>10';
      $User->where($map)->select(); 
      

      最后得到的查询条件就成了:

      ( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
      
  • 请求字符串查询方式

    • _query

      请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。

      $map['id'] = array('gt','100');
      $map['_query'] = 'status=1&score=100&_logic=or';
      

      得到的查询条件是:

      `id`>100 AND (`status` = '1' OR `score` = '100')
      


复合查询

  • 复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。

    • _complex
      例如:

      $where['name']  = array('like', '%thinkphp%');
      $where['title']  = array('like','%thinkphp%');
      $where['_logic'] = 'or';
      $map['_complex'] = $where;
      $map['id']  = array('gt',1);
      

      查询条件是

          ( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
      

      复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。

      很多查询方式可以相互转换,例如上面的查询条件可以改成:

      $where['id'] = array('gt',1);
      $where['_string'] = ' (name like "%thinkphp%")  OR ( title like "%thinkphp") ';
      

      最后生成的SQL语句是一致的。


多次调用

  • 3.1.3版本开始,where方法支持多次调用,但字符串条件只能出现一次

    例如:

    $map['a'] = array('gt',1);
    $where['b'] = 1;
    $Model
        ->where($map)
        ->where($where)
        ->where('status=1')
        ->select();
    

    多次的数组条件表达式会最终合并,但字符串条件则只支持一次。




where()补充
  • 与count()统计

    M('User')
        ->where('phone='.$phone)
        ->count();
    
    • count():统计数据行数
    • max():统计某个字段最大数据
    • min():统计某个字段最小数据
    • avg():统计某个字段平均数据
    • sum():统计某个字段数据之和

    参考资料:统计查询

  • 与find()只查询一条

    $User
        ->where('phone='.$data['phone'])
        ->find();
    
  • 与setInc()字段跟新

     if($User->add($data)){
        M('Role')
            ->where("role_type")
            ->setInc('role_num');
        }
    

    ps:
    必须配合连贯操作where一起使用

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

    3.0的这setInc、setDec方法有了新的升级,在增加会员积分,和登录次数的时候,非常中用。

    参考链接:thinkphp3.0增加setInc、setDec方法

  • 与seve()更新数据

    where("id='{$userid}'")
        ->save($data);
    

    注意:使用 save() 方法更新数据,必须指定更新条件或者更新的数据中包含主键字段。

    参考资料ThinkPHP 更新数据 save方法

  • 与setField()更新个别字段的值

    $User
        ->where("id='{$userid}'")
        ->setField('online','0');
    

    参考资料:setField 方法更新个别字段的值

  • 与find()以及field()指定查询字段

     $store
        ->where('userid='.$userid)
        ->field('id,certification')
        ->find();
    
  • 多表查询

    • join

      $Follow
      ->alias(‘c’)
      ->join(‘USER u ON c.c_bei= u.id’)
      ->where(“c.c_zhu=’{userid}’”)  
          ->field(‘c.c_bei,u.id as accountid,u.sex,u.nickname,u.head as photo,u.message’)  
          ->limit(
      page,$number)
      ->select();

    • table

      Model  
            ->table(‘zca_user user,zca_ol ol’)  
            ->where(“ol.ol_num = {
      live_id} AND ol.ol_man = user.id AND ol.status = ‘1’”)
      ->count();

    1、原生查询示例:

    $Model = new Model();
    $sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.','.$p->listRows;
    $voList = $Model->query($sql);
    

    2、join()方法示例:

    $Model
        ->join('work ON artist.id = work.artist_id')
        ->join('card ON artist.card_id = card.id')
        ->select(); 
    

    3、table()方法示例:

    $list = $user
            ->table('user_status stats, user_profile profile')
            ->where('stats.id = profile.typeid')
            ->field('stats.id as id, stats.display as display, profile.title as title,profile.content as content')
            ->order('stats.id desc' )->select();
    

    参考资料:ThinkPHP的多表查询

  • 用AND直接写入条件

    M('System')
       ->where("`userid`={$userid} AND `acceptid`={$user_author['prd_author']} AND `worksid` = {$got} AND `type`= '1'")
       ->count();
    
  • 删除

    $Praise
        ->where($map)
        ->delete();
    
  • 排序

    $Photo
        ->field('url')
        ->where("album='{$albumid}'")
        ->order('add_time asc')
        ->find()['url']; 
    

2017/1/14 22:43:24


统计查询

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、学生的平均成绩等等,ThinkPHP 为这些统计操作提供了一系列的内置方法:

    count():统计数据行数

    max():统计某个字段最大数据

    min():统计某个字段最小数据

    avg():统计某个字段平均数据

    sum():统计某个字段数据之和

    上述统计查询方法都是独立的方法且支持连贯操作。

  • count()

    count() 方法用于统计数据行数。

    例子:

        public function read(){
         $Dao = M('User');
        // 获取用户数:
         $userCount = $Dao
                    ->count();
        //SELECT COUNT(*) AS tp_count FROM user LIMIT 1         
    
        // 添加条件:
         $userCount2 = $Dao
                    ->where('uid > 10')
                    ->count();
        //SELECT COUNT(*) AS tp_count FROM user WHERE uid > 10 LIMIT 1
    
         $Model
            ->table('pre_user user,pre_ol ol')
            ->where("ol.ol_num = {$live_id} AND ol.ol_man = user.id AND ol.status = '1'")
            ->count();
    
            $this->assign('userCount', $userCount);
            //  可以在模板中直接输出得到的统计数据:
            //  共有用户 {$userCount} 人。
            $this->display();          
    
    
        }
    
  • max()

    max() 方法用于统计某个字段最大数据。

    统计用户最大积分例子:

    $maxScore = $Dao->max('score');
    

    实际执行的 SQL 为:

    SELECT MAX(score) AS tp_max FROM user LIMIT 1 
    
  • min()

    min() 统计某个字段最小数据。

    获取积分大于 0 的用户的最小积分例子:

    $minScore = $Dao->where('score>0')->min('score');
    

    实际执行的 SQL 为:

    SELECT MIN(score) AS tp_min FROM user WHERE score>0 LIMIT 1
    
  • avg()

    avg() 统计某个字段平均数据。

    获取用户的平均积分例子:

    $avgScore = $Dao->avg('score');
    

    实际执行的 SQL 为:

    SELECT AVG(score) AS tp_avg FROM user LIMIT 1
    
  • sum()

    sum() 统计某个字段数据之和。

    统计积分排名前 10 名用户的积分之和:

    $sumScore = $Dao->order('score DESC')->limit('10')->sum('score');
    

    实际执行的 SQL 为:

    SELECT SUM(score) AS tp_sum FROM user ORDER BY score DESC LIMIT 10 
    

    所有的统计查询如 select() 方法一样。均支持连贯操作的使用,根据实际情况添加不同的查询条件。








add方法新增数据

  • 使用add方法新增数据到数据库。

    $User = M("User"); // 实例化User对象
    $data['name'] = 'username';
    $data['email'] = '[email protected]';
    $User->add($data);
    

    或者使用data方法连贯操作

    $User->data($data)->add();
    
  • 字符串方式

    字符串方式用法如下:

    $Model = M('User');
    $data = 'name=zy2333&[email protected]';
    $Model->data($data)->add();
    

参考资料:data方法







addall批量插入

  • add()和addAll()的区别

    • add()是记录单条插入

      $User = M("User"); // 实例化User对象
      $data['name'] = 'ThinkPHP';
      $data['email'] = '[email protected]';
      $User->add($data);
      
    • addAll()是记录批量插入

      $dataList[] = array('name'=>'thinkphp','email'=>'[email protected]');
      $dataList[] = array('name'=>'onethink','email'=>'[email protected]');
      $User->addAll($dataList);
      

      注意:下标为0,否则可能失败

      mysql:

      INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
      

      数据量很多情况下尽量选择批量插入而不是循环逐条插入,否则你的数据库会吃不住挂掉。
      不过如果你想当然的将所有数据全部存入一个数组并进行addAll也同样会面临挂掉的情况,这是为什么呢?
      原因就是mysql中max_allowed_packet变量的配置限制了上传sql语句的长度,在mysql配置中将他配置大一点就行了

      max_allowed_packet = 100M
      

      同时在插入数据时也做好批量插入的长度限制,毕竟你不知道什么时候数据会变成百万级别的。

    -addAll实例

               //上传相册图片 (多)
               public function prd_photo()
               {
                    $upload = new \Think\Upload();// 实例化上传类
                    $upload->maxSize   =     3145728 ;// 设置附件上传大小
                    $upload->exts      =     array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
                    $upload->savePath  =      './Public/Uploads/'; // 设置附件上传目录// 上传文件
                    $info   =   $upload->upload();
                    if(!$upload->rootPath){
                        mkdir($upload->rootPath,0777,true);
                    }
                    if(!$info) {
                        $rest['status'] = false;
                        $rest['message'] = '上传失败';
                        $rest['error'] = $this->error($upload->getError());
    
                        echo json_encode($rest,JSON_UNESCAPED_UNICODE);exit;
                    }else{
                        $dataList = [];
                        foreach($info as $file){
                            $dataList[] = [
                                'author' => $_REQUEST['userid'],
                                'album' => $_REQUEST['album'],
                                'url' => '/Uploads/photo/'.$file['savepath'].$file['savename'],
                                'add_time' => time(),
                            ];
                        }
                        $Photo=M('Photo');
    
                     $Arr = $Photo->addAll($dataList);
    
                        if($Arr){
                         $rest['status'] = true;
                         $rest['message'] = '上传成功';
                        echo json_encode($rest,JSON_UNESCAPED_UNICODE);exit;
                        }
                    }
             }
    


  • addAll方法中不能出现null值,否则其他数据会自动向前移动,导致添加失败。举例:

            [
                {
                     "appId": 1,
                     "serviceId": 2,
                    "createUser":null,
                    "status": 1,
                     "priority": 2
                 }
            ]
    

其中,createUser字段为null,插入时的sql语句会变成insert into va_problem (appId, serviceId, createUser, status, priority)values (1, 2, 1, 2)。null值没了,导致插入失败,这应该是ThinkPHP3.2.3的一个bug。

参考资料小心使用ThinkPHP中的addAll方法,关于addAll()失败的问题








更新数据 save方法

  • 使用 save() 方法来更新数据库

    $User->where("id='{$userid}'")->save($data);
    

    提示:

    为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。

    因此要使用 save() 方法更新数据,必须指定更新条件或者更新的数据中包含主键字段。

  • 如果是表单数据,还可以使用 create() 方法创建数据对象来更新数据:

    public function update(){
    header("Content-Type:text/html; charset=utf-8");
    $Dao = D("User");
    
    if($vo = $Dao->create()) {
            $result = $Dao->save();
            if($result !== false){
                echo '数据更新成功!';
            }else{
                echo '数据更新失败!';
            }
        }else{
           $this->error($Form->getError());
        }
    }
    

参考资料:create()方法








create()方法

  • create() 创建数据对象后,将自动收集提交过来的表单数据。而表单数据可能需要经过一定加工(例如将密码加密)才能写入数据表,所以可以对数据对象的成员属性值根据进行修改或添加去除等。

    提示:

    create() 创建的数据对象存放于内存,在执行入库动作(add() 或 save())之前,都可以进行修改。
    在上面的例子里,create()方法 的行为和 date()方法 是一致。但 date() 方法只是简单的创建数据对象,但 create() 方法还具备:

    步骤 说明 返回
    1 获取数据源(默认是POST数组)  
    2 验证数据源合法性(非数组或者对象会过滤) 失败则返回false
    3 检查字段映射  
    4 判断提交状态(新增或者编辑  根据主键自动判断)  
    5 数据自动验证 失败则返回false
    6 表单令牌验证 失败则返回false
    7 表单数据赋值(过滤非法字段和字符串处理)  
    8 数据自动完成  
    9 生成数据对象(保存在内存)  
    • 在执行入库动作(add() 或 save())之前,进行修改

      User=M(User); User->create(); //创建User数据对象
      User>status=1;// User->create_time = time(); // 设置用户的创建时间
      $User->add(); // 把用户对象写入数据库

    • 自动验证与自动填充

    在将表单写入数据表之前,常常会有一些对数据的检测(提交的用户名是否符合要求)与处理(如例子中的密码加密以及取得当前时间戳)。create() 方法就支持数据的自动验证与自动完成。

    在 LibModel 目录下创建 UserModel.class.php 文件(User 为创建的模型对象,也对应 前缀_user 表),加入自动验证和自动填充规则:

    class UserModel extends Model{
        // 自动验证设置
        protected $_validate = array(
        array('username','require','用户名必须填写!',1),
        array('email','email','邮箱格式错误!',2),
        array('username','','用户名已经存在!',0,'unique',1),
        );
        //自动填充设置
        protected $_auto = 
        array(
            array('regdate','time',self::MODEL_INSERT,'function'),
            array('password','md5',self::MODEL_INSERT,'function'),
        );
    }
    

    将 insert2 操作更改为:

    public function insert2(){
    header("Content-Type:text/html; charset=utf-8");
        $Dao = D("User");
    
        if($Dao->create()){
            if($lastInsId = $Dao->add()){
                echo "插入数据 id 为:$lastInsId";
            } else {
                echo "数据写入错误!";
            }
        }else{
            exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]');
        }
    }
    

    如果提交的数据不符合验证要求(如用户名存在),则 create() 创建数据对象失败(返回 FALSE ),$Dao->getError() 会打印出自动验证设置规则里面设置的提示信息:用户名已经存在!

    如果验证规则通过后,系统会进行自动填充设置,将表单密码进行 MD5 加密以及取得当前的时间戳填充入 create() 的数据对象。
    所以 D方法 配合 create() 是非常智能而强大的,恰当运用可以达到事半功倍快速开发的目的。

    提示
    D 方法配合 create() 由于其功能强大,也就损失了一定的效率,在业务逻辑不复杂的情况下推荐 M方法+data() 模式
    create() 默认接受 POST 数据,若要接受其他类型数据,只需在参数内指定即可,如接受 GET 数据:create($_GET)

    create方法如果没有传值,默认取$_POST数据,如果用户提交的变量内容,含有可执行的html代码,请进行手工过滤。

    $_POST['title'] = "<script>alert(1);</script>";
    

    非法html代码可以使用htmlspecialchars进行编码,以防止用户提交的html代码在展示时被执行,以下是两种安全处理方法。

    $_POST['title'] = htmlspecialchars($_POST['title']);
    M('User')->create();
    $data['title'] = $this->_post('title', 'htmlspecialchars');
    M('User')->create($data);
    

    参考资料:create()方法创建数据,表单数据智能写入 create 方法,ThinkPHP3.1快速入门(16)安全








data方法

  • 写操作

    通常情况下我们都是通过create方法或者赋值的方式生成数据对象,然后写入数据库,例如:

     $Model = D('User');
     $Model->create();
    // 这里略过具体的自动生成和验证判断
     $Model->add();
    

    又或者直接对数据对象赋值,例如:

    $Model = M('User');
    $Model->name = 'zy';
    $Model->email = '[email protected]';
    $Model->add();
    

    那么data方法则是直接生成要操作的数据对象,例如:

    $Model = M('User');
    $data['name'] = 'zy';
    $data['email'] = '[email protected]';
    $Model->data($data)->add();
    

    注意:如果我们同时使用create方法和data创建数据对象的话,则后调用的方法有效。

    data方法支持数组、对象和字符串,对象方式如下:

     $Model = M('User');
     $obj = new stdClass;
     $obj->name = 'zy';
     $obj->email = '[email protected]';
     $Model->data($obj)->add();
    

    字符串方式用法如下:

      $Model = M('User');
      $data = 'name=zy&[email protected]';
      $Model->data($data)->add();
    

    也可以直接在add方法中传入数据对象来新增数据,例如:

      $Model = M('User');
      $data['name'] = 'zy';
      $data['email'] = '[email protected]';
      $Model->add($data);
    

    但是这种方式data参数只能使用数组。

    当然data方法也可以用于更新数据,例如:

     $Model = M('User');
     $data['id'] = 8;
     $data['name'] = 'zy';
     $data['email'] = '[email protected]';
     $Model->data($data)->save();
    

    当然我们也可以直接这样用:

     $Model = M('User');
     $data['id'] = 8;
     $data['name'] = 'zy';
     $data['email'] = '[email protected]';
     $Model->save($data);
    

    同样,此时data参数只能传入数组。

    在调用save方法更新数据的时候 会自动判断当前的数据对象里面是否有主键值存在,如果有的话会 自动作为更新条件。也就是说,下面的用法和上面等效:

     $Model = M('User');
     $data['name'] = 'zy';
     $data['email'] = '[email protected]';
      $Model->data($data)->where('id=8')->save();
    
  • 读操作

    除了写操作外,data方法还可以用于读取当前的数据对象,例如:

     $User = M('User');
     $map['name'] = 'zy';
     $User->where($map)->find();
     // 读取当前数据对象
     $data = $User->data();
    





2017/1/15 21:28:15





find方法 查询一条数据记录

  • find() 方法是和 select() 用法类似的一个方法,不同之处 find() 查询出来的始终只有一条数据,即系统自动加上了 LIMIT 1 限制。

    当确认查询的数据记录只能是一条记录时,建议使用 find() 方法查询,如用户登录账号检测:

    public function chekUser(){
        header("Content-Type:text/html; charset=utf-8");
         $Dao = M("User");
    
        // 构造查询条件
        $condition['username'] = 'Admin';
        $condition['password'] = MD5('123456');
        // 查询数据
        $list = $Dao->where($condition)->find();
    
        if($list){
        echo '账号正确';
        }else{
        echo '账号/密码错误';
        }
    }
    

    与 select() 的另一个不同之处在于,find() 返回的是一个一维数组,可以在模板里直接输出数组单元的值而无需使用 volist 等标签循环输出:

    {$list['username']}
    
  • find() 主键查询

    当 find() 查询的条件参数为表主键时,可以直接将参数写入方法内,如:

    $Dao = M("User");
    $list = $Dao->find(1);
    

    user 表主键为 uid,该例子将查询 uid=1 的数据,这是 ActiveRecords 模式实现之一,简洁直观。

setField 方法更新个别字段的值

  • setField() 方法用于更新个别字段的值。

    例子:

    public function update(){
        header("Content-Type:text/html; charset=utf-8");
        $Dao = M("User");
    
        $result = $Dao->where('uid = 2')->setField('email','[email protected]');
    
        if($result !== false){
         echo '数据更新成功!';
     }else{
            echo '没更新任何数据!';
        }
    }
    

    上面例子执行的 SQL 语句为:

    UPDATE user SET email='[email protected]' WHERE uid = 2
    
  • 更新多个字段

    setField() 方法支持同时更新多个字段,只需要传入数组参数即可:

    public function update(){
     header("Content-Type:text/html; charset=utf-8");
        $Dao = M("User");
    
        $result = $Dao->where('uid = 28')->setField(array('username','email'),array('zy2333','[email protected]'));
    
        if($result !== false){
            echo '数据更新成功!';
        }else{
            echo '没更新任何数据!';
        }
    }
    
    • setField() 方法的语法为:

      setField(fields, value, condition='')
      

    因此 setField() 不可以像 save() 方法一样,以构造数据数组的方式传入 setField(),而需要将需要更新的字段与值分别传入 setField() 方法中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章