thinkPHP如果要对数据库操作,一般来说首先要做的是在配置文件中链接数据库,然后用M方法实例化一张表,然后就是对表的操作了

可以开启调试功能查看程序执行的sql语句:

1.开启调试功能(默认是已经开启过的)

define('APP_DEBUG',true)

2.设置配置文件,开启页面trace(注意:如果没有在控制器里输出模板,不会出现调试小图标,即要写:$this->display();)

'SHOW_PAGE_TRACE'=>TRACE

查询操作:例如:

(1)基本的where语句查询

$User = M("User"); // 实例化User对象

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

(2)使用字符串条件的时候,建议配合预处理机制,确保更加安全

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

或:

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

(3)数组查询---数组条件的where用法是ThinkPHP推荐的用法

$User = M("User"); // 实例化User对象

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

$map['status'] = 1;

// 把查询条件传入查询方法

$User->where($map)->select();

最后生成的SQL语句是:SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

(4)表达式查询

达式含义

表达式

含义

EQ

等于(=)

NEQ

不等于(<>)

GT

大于(>)

EGT

大于等于

(>=)LT

小于

(

小于等于

(<=)LIKE

模糊查询

[NOT] BETWEEN

(不在)区间查询

[NOT] IN

(不在)IN 查询

EXP表达式查询

支持SQL语法

使用格式:

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

例如:$map['name'] = array('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')

区间查询:(例如:想查询id<4或id>10的数据)

$data['id'] = array(array('lt',4),array('gt',10),'or');   // 最后一个参数不写,默认的是and操作

字段的多种查询:

例如:$data['name'] = array(array('like','%2%'),array('like','%小明%'));

如果希望是or关系就在最后一个参数后面添加一个参数'or';

between运算符:

$map['id'] = array('between','1,8');和$map['id'] = array('between',array('1','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); // 根据条件保存修改的数据

如果使用or关系,需要添加数组值

例如:$data['sex']=0;

$data['username']='gege';

$data['_logic']='or';//对数组添加_logic赋值为or(或者)关系,默认的是and

sql语句直接操作:

a.query方法,主要数据处理读取数据的

b.execute用于更新,写入操作

例如:可以实例化一个空的model

a.例如:查询数据

$m = M();

$result = $m->query("select * from tp_user where id>5");  //记得加表前缀,表名写错返回false,没有查到数据返回empty

//上式返回一个结果集

b.例如:增添数据

$m->execute("insert into tp_user('username') values('zzz')");

返回结果是影响的行数

对于查询操作: select()获取所有符合条件的数据

find()获取一条数据,如果没有条件,默认的是选择id=1的数据

(5)连贯操作

table方法也属于模型类的连贯操作方法之一,主要用于指定操作的数据表。

例如:可以在table方法中指定数据库

$Model->table('db_name.think_user')->where('status>1')->select();

table方法指定的数据表需要完整的表名,但可以采用下面的方式简化数据表前缀的传入,例如:

$Model->table('__USER__')->where('status>1')->select();

会自动获取当前模型对应的数据表前缀来生成 think_user 数据表名称。

alias方法用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。

例如:$Model =M('User');

$Model->alias('a')->join('__DEPT__ b ON b.user_id= a.id')->select();

data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值

field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作。

例如:$Model->field('id,title,content')->select();相当于:$Model->field(array('id','title','content'))->select();

可以给某个字段设置别名:例如:

$Model->field('id,nickname as name')->select();

可以在field方法中直接使用函数,例如:

$Model->field('id,SUM(score)')->select();

数组方式的定义可以为某些字段定义别名,例如:

$Model->field(array('id','nickname'=>'name'))->select();

对于一些更复杂的字段要求,数组的优势则更加明显,例如:

$Model->field(array('id','concat(name,'-',id)'=>'truename','LEFT(title,7)'=>'sub_title'))->select();

执行的SQL相当于:SELECT id,concat(name,'-',id) as truename,LEFT(title,7) as sub_title FROM table

$Model->field('*')->select();或$Model->field()->select();或$Model->select();

但是这并不是我说的获取所有字段,我希望显式的调用所有字段(对于对性能要求比较高的系统,这个要求并不过分,起码是一个比较好的习惯),那么OK,仍然很简单,下面的用法可以完成预期的作用:$Model->field(true)->select();field(true)的用法会显式的获取数据表的所有字段列表

如果希望获取排除数据表中的content字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能

$Model->field('content',true)->select();

若想获取除了content之外的所有字段,要排除更多的字段也可以:

$Model->field('user_id,content',true)->select();

//或者用

$Model->field(array('user_id','content'),true)->select();

field方法还有一个非常重要的安全功能--字段合法性检测,具体的请参考thinkPHP手册

order方法属于模型的连贯操作方法之一,用于对操作的结果排序。

例如:$Model->where('status=1')->order('id desc')->limit(5)->select();

支持对多个字段的排序,例如:$Model->where('status=1')->order('id desc,status')->limit(5)->select();

如果没有指定desc或者asc排序规则的话,默认为asc。

desc是从大到小排序,是倒叙,asc是从小到大排序

还可以:$Model->where('status=1')->order(array('order','id'=>'desc'))->limit(5)->select();

limit方法主要用于指定查询和操作的数量

例如:表示查询文章数据,从第10行开始的25条数据

$Article =M('Article');

$Article->limit('10,25')->select();

如果limit里面只有一个参数25,表示选择前25条数据

利用扩展类库中的分页类Page可以自动计算出每个分页的limit参数

$Article =M('Article');

$Article->page('1,10')->select();// 查询第一页数据

$Article->page('2,10')->select();// 查询第二页数据

GROUP方法也是连贯操作方法之一,通常用于结合合计函数,根据一个或多个列对结果集进行分组 。

HAVING方法也是连贯操作之一,用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。

$this->field('username,max(score)')->group('user_id')->having('count(test_time)>3')->select();

JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据

指定的数据表必须是全称

$Model =M('Artist');

$Model->join('think_work ON think_artist.id = think_work.artist_id')

->join('think_card ON think_artist.card_id = think_card.id')

->select();

或:

$Model->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id')

->join('__CARD__ ON __ARTIST__.card_id = __CARD__.id')

->select();

__WORK__和 __CARD__在最终解析的时候会转换为 think_work和 think_card。

默认采用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成

$Model->join('RIGHT JOIN __WORK__ ON __ARTIST__.id = __WORK__.artist_id')->select();

或:

$Model->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT')->select();

使用数组方式的情况下,第二个参数无效。因此必须在字符串中显式定义join类型,例如:

join(array(' LEFT JOIN __WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT JOIN __CARD__ ON __ARTIST__.card_id = __CARD__.id'))

UNION操作用于合并两个或多个 SELECT 语句的结果集。注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同

DISTINCT 方法用于返回唯一不同的值 。

例如:$Model->distinct(true)->field('name')->select();

distinct方法的参数是一个布尔值。

Lock方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:lock(true);

数据库类型要是InnoDB,其次,加锁必须跟事务同时使用,还有,查询的时候都必须带锁,比如: $user_mod->lock(true)->where('id=1')->select();这个地方用锁查询,其次地方如果查询这个user对象需要防止同时操作的话也要进行加锁,就是也要用lock(true)这种方式查询:

代码示例如下:(参考于http://www.thinkphp.cn/topic/9964.html)

M()->startTrans();//开启事务

$map['userid']='test';//查询条件

$user = M('User')->lock(true)->where($map)->find();//加锁查询

if($user)

{

//执行你想进行的操作, 最后返回操作结果 result

$result = true;

if(!$result)

{

M()->rollback();//回滚

$this->error('错误提示');

}

}

M()->commit();//事务提交

$this->success('成功提示');

COMMENT方法 用于在生成的SQL语句中添加注释内容,例如:

fetchSql是3.2.3新增的连贯操作方法,用于直接返回SQL而不是执行查询。

例如:$result =M('User')->fetchSql(true)->find(1);

(6)CUED操作

数据创建:$data['name']='ThinkPHP';

$data['email']='ThinkPHP@gmail.com';

$User->create($data);

// 创建完成数据对象后可以直接读取数据

echo $User->name;

echo $User->email;

// 也可以直接修改创建完成的数据

$User->name ='onethink';// 修改name字段数据

$User->status =1;// 增加新的字段数据

Create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add或者save方法才会真正写入数据库。

如果在create方法之前调用field方法,则表示只允许创建指定的字段数据,其他非法字段将会被过滤,例如:

$data['name']='thinkphp';

$data['email']='thinkphp@gmail.com';

$data['status']=1;

$data['test']='test';

$User =M('User');

$data =$User->field('name,email')->create($data);

dump($data);

输出:

array (size=2)

'name'=>string'thinkphp'(length=8)

'email'=>string'thinkphp@gmail.com'(length=18)

数据写入:

如果写入了数据表中不存在的字段数据,则会被直接过滤,例如:

$data['name']='thinkphp';

$data['email']='thinkphp@gmail.com';

$data['test']='test';

$User =M('User');

$User->data($data)->add();    //其中test字段是不存在的,所以写入数据的时候会自动过滤掉。在3.2.2版本以上,如果开启调试模式的话,则会抛出异常

或写:  $User->add($data);

通过filter方法可以对数据的值进行过滤处理,例如:

$data['name'] = 'thinkphp';

$data['email'] = 'thinkphp@gmail.com';

$User = M('User');

$User->data($data)->filter('strip_tags')->add();

写入数据库的时候会把name字段的值转化为thinkphp。

filter方法的参数是一个回调类型,支持函数或者闭包定义。

批量写入:该功能需要3.2.3以上版本,3.2.3以下版本仅对mysql数据库支持

// 批量添加数据

$dataList[] = array('name'=>'thinkphp','email'=>'thinkphp@gamil.com');

$dataList[] = array('name'=>'onethink','email'=>'onethink@gamil.com');

$User->addAll($dataList);

数据的读取:

读取数据是指读取数据表中的一行数据(或者关联数据),主要通过find方法完成

如果查询出错,find方法返回false,如果查询结果为空返回NULL,查询成功则返回一个关联数组(键值是字段名或者别名)

select方法查询返回一二维数组

返回一整列的数组:$User->getField('id',true);// 获取id数组

getField方法还可以支持限制数量:例如:$this->getField('id,name',5);// 限制返回5条记录

数据的更新:

数据的更新用save方法

$User = M("User"); // 实例化User对象

// 要修改的数据对象属性赋值

$User->name = 'ThinkPHP';

$User->email = 'ThinkPHP@gmail.com';

$User->where('id=5')->save(); // 根据条件更新记录

数据的删除:

$User =M("User");// 实例化User对象

$User->where('id=5')->delete();// 删除id为5的用户数据

$User->delete('1,2,5');// 删除主键为1,2和5的用户数据

thinkphp mysql操作数据库_thinkPHP数据库操作相关推荐

  1. thinkphp项目mysql类关系_ThinkPHP数据库与模型

    数据库连接器与查询构造器 总结:同之前版本相比,ThinkPHP5的数据库操作对底层进行优化设计,对各种操作进行了高级封装.既可以直接使用连接器进行高效的原声查询,也可以使用封装好的查询构造器进行直观 ...

  2. thinkphp mysql 更新_THINKPHP5修改数据库数据出现“缺少更新条件”的错误

    查询数据库的数据分配显示在页面山 修改后的数据准备传递到第三章图里 接收数据,然后修改到数据 问题出现的环境背景及自己尝试过哪些方法 相关代码 // 请把代码文本粘贴到下方(请勿用图片代替代码) 第一 ...

  3. thinkphp mysql分表_数据库分表和分库的原理及基于thinkPHP的实现方法

    为什么要分表,分库: 当我们的数据表数据量,访问量很大,或者是使用频繁的时候,一个数据表已经不能承受如此大的数据访问和存储,所以,为了减轻数据库的负担,加快数据的存储,就需要将一张表分成多张,及将一类 ...

  4. thinkphp mysql limit_limit方法 - ThinkPHP5数据库实例详解 - php中文网手册

    limit方法 1.功能:限制查询结果集输出的数量limit方法常用在分页显示用,对于记录较多的数据表,限制每次输出数量,很有必要 2.源码:直接贴上,不再附图/** * 指定查询数量 * @acce ...

  5. thinkphp mysql 密码加密_thinkphp框架实现mysql读写分离

    基于thinkphp3.2.3,官方手册:http://www.kancloud.cn/manual/thinkphp/1733 注意事项: 1.首先得配置好mysql主从,可以多主多从 2.在读写分 ...

  6. thinkphp mysql json数据类型_ThinkPHP:JSON字段类型的使用(ORM)

    ThinkPHP5.1版本正式发布已经有一段时间了,我会陆续给大家介绍其中的新特性.今天要给大家介绍的是一个可能很多用户还不了解的一个特性:JSON字段数据支持.不过首先注意一点,本篇内容中描述的JS ...

  7. thinkphp mysql md5加密_thinkphp会员登录密码验证md5问题。

    会员注册的时候密码md5加密存到数据库了,现在会员登录要md5密码之后去数据库查询应该怎么写?我获取表单md5后去数据库查询为什么不一样了,我的代码是 class AdminAction extend ...

  8. thinkphp mysql 中文 问号_thinkphp分页中文参数乱码解决

    今天发现分页有中文参数会出现乱码,以前都是查询字符串或数字没有问题,所以没发现.URL在Apache上是/不会有问题,但是在IIS上用/会乱码,必须用?=这种格式才行. 在某个问题下的回答,终于把分页 ...

  9. thinkphp mysql 密码加密_thinkphp微信开发(消息加密解密)

    使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录. 分析问题: 解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和Wec ...

最新文章

  1. Django模型(三)
  2. python opencv立体测距 立体匹配BM算法
  3. OO第三次博客作业——规格
  4. python 进程 线程 协程
  5. 怎样在SQL Server上部署SSIS包 2
  6. [转]iOS设备唯一标识探讨
  7. linux 文件编码格式转换-转
  8. 学python要什么基础-要学Python编程,需要什么样的基础呢?想找这方面工作
  9. 脚本升级openssh
  10. 上学的时候写的文本分割器
  11. IDE,SCSI,SATA硬盘接口比较
  12. 2017 MongoDB中国用户大会部分嘉宾访谈集萃
  13. response的响应头,下载文件
  14. 如何:创建 C# 控制台应用程序
  15. Servlet 3.0之Part对象(文件上传)
  16. 遗臭万年的“经典”臭诗(转)
  17. 饥荒服务器票据哪里是最新的,饥荒TGP版洞穴服务器搭建图文教程
  18. 如何在linux编写perl脚本,关于linux:如何在perl脚本中插入awk命令?
  19. 【WOT】听2015年北京WOT互联网运维与开发者大会随记
  20. 遗传算法之旅行家问题(TSP)

热门文章

  1. 微软流媒体服务器直播,流媒体服务器Flussonic Media Server对直播流进行录制
  2. Android-NuPlayer音视频同步之安卓Q新功能
  3. 【Django下载文件-Kml文件下载】
  4. # IE浏览器打不开网页,google浏览器能打开
  5. 动态调整div大小 html,如何动态的根据用户屏幕的分辨率改变div的大小?
  6. 随机生成数字字母组合
  7. STM32F103C8T6在Arduino框架下驱动SH1106 1.3“ IIC OLED显示
  8. JAVA 数组降序排列思路
  9. Golang.Go语言基础
  10. windows消息分类PostMessage、SendMessage