ThinkPHP查询数据与CURD
一、创建连接
在配置文件中使用如下配置:
/* 数据库设置 */
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'lian1', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '101213', // 密码
'DB_PORT' => '3306', // 端口
'DB_PREFIX' => '', // 数据库表前缀
'DB_PARAMS' => array(), // 数据库连接参数
'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志
'DB_FIELDS_CACHE' => true, // 启用字段缓存
'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效
'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量
'DB_SLAVE_NO' => '', // 指定从服务器序号
注意在ThinkPHP3.2.3,默认所有数据库都是基于PDO实现的,所以DB_TYPE不再支持PDO设置,必须采用实际的数据库类型设置。
*为了在调试时可以显示SQL语句,这里可以加上以下配置
//页面Trace
'SHOW_PAGE_TRACE' => true,
二、创建控制器并创建相应方法。
三、创建数据库连接类。一种是通过基类Model创建,一种是创建自定义模块。
通过基类Model创建:
//Model基类
$user = new Model();
$user = new Model("user");
$user = M();//等同于new Model();
$user = M("user");//等同于new Model("user")
$user = new Model("user","","mysql://root:@localhost/test");//第一个参数为表名,第二个参数为表名前缀
通过自定义模块
$user = new \Home\Model\UserModel();
$user = D("User");
*自定义模块时,若要使用不同的表,可在模块中定义以下属性:
//修改前缀
protected $tablePrefix = "tp_"
//修改表名
protected $tableName = "abc";
//一起修改
protected $trueTableName = "tp_abc";
//修改数据库名
protected $dbName = "aaa";
四、查询数据
1、基本查询的三种方式:
//select全部显示,find显示一条
$user = M('User');
//-------字符串方式
var_dump($user->where('id=1 AND user="蜡笔小新"')->select());
//-------数组索引方式 默认是AND(高效)
$condition['id'] = 2;
$condition['username'] = 'llicat';
//改变AND为OR
$condition['_logic'] = 'OR';
//-------对象条件查询 PHP内置类在根目录下找 '\'
$condition = new \stdClass();
$condition->id = 1;
$condition->username='admin';
$condition->_logic ='or';
var_dump($user->where($condition)->select());
2、表达式查询:eq,neq,gt等
$user = M('user');
$map['id']= array('eq','1,3');//eq,neq,gt,egt,lt...具体看手册 eq等于 等于1和2?再加一个数组的形式不能用 用逗号 !1,3
$map['username']=array('like','%l%');//notlike 不用空格
$map['username']=array('like',array('%l%','%a%'),'and');//最后一个参数不写默认是OR
//区间查询
$map['id']=array('between','2,4');
$map['id']=array('between',array('1','3'));//或者这样 not between 需要空格
$map['id']=array('in','2,4');//array也行 not in空格
//EXP:自定义
$map['id'] = array('exp','=1 AND username="llicat"');
$map['id'] = array('exp','in (1,2,3)');
$map['username'] = array('exp','="123"');
$map['_logic']='OR';
var_dump($user->where($map)->select());
3、快捷查询:
$user = M('user');
$map['username|password'] = 'llicat';// 相同查询条件|:or &:and
$map['username&password'] = array('llicat','123456','_multi'=>TRUE);//multi设置一一对应,不然username会对应多个
$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);//和表大会组合 并且可以多个
var_dump($user->where($map)->select());
4、区间查询
$user = M('user');
$map['id'] = array(array('gt',1),array('lt',3));//用AND:不加第三个参数。 用OR:第三个参数 'OR'
var_dump($user->where($map)->select());
5、组合查询(索引数组的扩展)
//字符串查询(_string) 复合查询(_complex) 请求字符串查询(_query)
$user = M('user');
//-------------字符串查询扩展
$map['id'] = array('eq',1);
$map['_string'] = 'username="llicat" AND password="123456"';//这种方式不太安全,生成的SQL语句中字段名没反单引号
$map['_logic'] = 'OR';//OR
//-------------请求字符串查询扩展
$map['id'] = array('eq',1);
$map['_query'] = 'username=llicat&password=123456';//有反单引号,较安全,推荐,也可以加_logic
//-------------复合查询扩展
$map['id'] = array('eq',1);
$where['id'] = 2;
$map['_complex'] = $where;
$map['_logic'] ='OR';
var_dump($user->where($map)->select());
6、统计查询:用于统计sum、avg、min、max、count等
var_dump($user->count());//括号里写'email'这种选择某个字段,如果该字段可为空,且有空,则不计算空
var_dump($user->min('id'));//sum、avg等等
7、动态查询
var_dump($user->getByUsername('llicat'));
var_dump($user->getFieldByUsername('llicat',id));//根据username找相对应id
8、SQL查询:原生SQL查询,query读取,execute写入
var_dump($user->query('SELECT * FROM user'));//根据username找相对应id
var_dump($user->execute("UPDATE user SET username='admin' WHERE id='2'"));//根据username找相对应id
9、连贯操作,更多操作可以查看ThinkPHP手册
$user = M('User');
var_dump($user->where('id>1')->order('id ASC')->limit(2)->select());
//用数组方式或者参数方式更好更安全
var_dump($user->select(array('where'=>array('id'=>array('neq',1)),'order'=>'id DESC,username DESC','limit'=>2)));//支持多字段排序
var_dump($user->field('id,username')->select());//只返回指定字段可以用于查询、写入//列名重命名需要as,且field中可以使用SQL函数,数组参数
//分页 limit\page
var_dump($user->limit(0,2)->select());//从0开始显示前两等同于page(1,2)
var_dump($user->page(2,2)->select());//每页显示俩,显示第二页,等同于limit(2,2)
//alias表别名, group having,commentSQL语句注释,join默认内连接 A表 on B表 第二个参数'RIGHT'可以设置左右连接,union合并多个结果集
//distinct去重,cache(true)利用缓存
10、table方法:切换数据表、多表查询
var_dump($user->table('user')->select());//可以用简化表名"__USER__"简化表名不用带前缀,table需要带
var_dump($user->table('__DOC__')->select());
var_dump($user->field('a.id,a.neirong,b.id,b.username')->table('__DOC__ a,__USER__ b')->select());//列名重命名需要as
var_dump($user->field('a.id,a.neirong,b.id,b.username')->table(array("user"=>b,"doc"=>a))->select());
11、命名范围
在模型中定义$_scope:
//SQL命名范围,必须写$_scope,有下划线:属性
//不设置default,默认是显示所有数据
protected $_scope = array(
'sql1'=>array(
'where'=>array('id'=>1),
),
'sql2'=>array(
'order'=>array('id'=>DESC),
'limit'=>2,
),
'default'=>array(
'where'=>array('id'=>2),
),
);
在控制器中调用:
//$user = D("User");
//没下划线:方法
//scope支持多个调用
var_dump($user->scope('sql1')->scope('sql2')->select());//或者scope('sql1,sql2')
var_dump($user->scope('sql2',array('limit'=>4))->select());//也可以不指定哪个sql,直接覆盖所有
var_dump($user->sql2()->select());//直接调用
五、create方法
#create创建数据对象,并没有添加数据或者添加表,结果就是提交过来的键值对
#创建完成后的数据可以直接读取或者修改利用$user->username
#保存在内存中,并没有实际写入到数据库中,直到使用add 或者save 方法才会真正写入数据库。
$user = M('User');
//--------直接create空,显示提交过来表单的数据,且默认为POST,接收get,create($_GET)但是create只获取数据库表与表单对应的信息,POST获取所有
var_dump($user->create());
//--------数据覆盖
$data['username']='llicat';
$data['password']='123456';
var_dump($user->create($data));
//--------直接用_POST接收
$data['username']=$_POST['username'];
$data['password']=$_POST['password'];
$data['date']=date('Y-md H:i:s');
var_dump($user->create($data));
//--------手工获取数据,从对象创建新的数据对象
$data = new \stdClass();
$data->username = $_POST['username'];
$data->password = $_POST['password'];
$data->date = date('Y-md H:i:s');
var_dump($user->create($data));
//--------create俩个参数,第一个参数必须制定POST或者GET,第二个为操作,insert或者update
//没指定第二个参数时,根据数据源是否包含主键判断修改或者新增,类似merge into
var_dump($user->create($_GET));
var_dump($user->create($_POST, \Think\Model::MODEL_INSERT));
//--------支持连贯操作field过滤、validate数据自动验证、auto数据自动完成、token令牌验证,与域有关
//限制字段
var_dump($user->field('username')->create());//只显示username
//在模型中限制
$user = D('User');
var_dump($user->create());
限制字段,需要在模型中限制时,可以在模型中设置如下属性:
//限制create
protected $insertFields = 'user';
protected $updateFields = 'user';
六、数据写入,add
//=================================数据写入=================================
$user = M('User');
$data['username']='heiheihei';
$data['password']='xixixi';
$user->add($data);
//----------------------结合create
$user = M("User");
//接收表单数据+创建的数据
$data = $user->create();
$data['date']=date('Y-m-d H:i:s');
$user->add($data);
//----------------------连贯操作data,可以用于写入多个对象
$user->data($data)->add();
//或者可以用url格式
$data ='username=heiheihei&password=xixixi';
$user->data($data)->add();
七、数据查询,select
$user=M('user');
//显示所有
var_dump($user->select());
//显示第一条
var_dump($user->find());
//得到指定字段,且只显示一个
var_dump($user->getField('username'));
//显示该字段的所有,不只显示一个
var_dump($user->getField('username',true));
//显示多个字段,直接会显示所有,重复的会被屏蔽!
var_dump($user->getField('username,password'));
//指定分割符号,第二个参数
var_dump($user->getField('id,username,password',':'));
//限制limit 第二个参数
var_dump($user->getField('id,username,password',2));
八、更新数据,save
$user=M('user');
$data['username'] = 'oooooooooooo';
$data['password'] = 'xxxxxxxxxxxx';
$map['id']=4;
$user->where($map)->save($data);
//默认主键为条件
$data['id']=5;
$data['username'] = 'tttttt';
$data['password'] = 'qqqqqq';
$user->save($data);
//结合create,id也表单传过来时
$user->create();
$user->save();//返回值0:没修改,1:返回成功
//修改某一个字段值
$map['id']=1;
$user->where($map)->setField('username','heihei');
//统计累加累减 count是一个为int的字段名
$map['id']=1;
$user->where($map)->setInc('count',1);//累加
$user->where($map)->setDec('count',1);//累减
九、删除数据,delete
$user=M('user');
//默认根据主键删除
$user->delete(6);
//----------
$map['id']=6;
$user->where($map)->delete();
//批量删除多个,根据主键要加引号
$user->delete('1,2,3');
//删除多个条件的
$map['count']=0;
$user->where($map)->order(array('id'=>'DESC'))->limit(1)->delete();
//删除所有数据,谨慎 1或者true?回头可以试试
echo $user->where('1')->delete();//成功返回1 ,没删返回0
十、ActiveRecord模式,对象化的操作方式
$user=M('user');
//---------------添加
$user->username = 'llicat';
$user->password ='xixixi';
$user->add();
//结合create 处理表达
$user->create();
$user->date =date('Y-md H:i:s');
$user->add();
//----------------查找
//find找到主键为4的值
var_dump($user->find(4));
//找到username=llicat的记录
var_dump($user->getByUsername('llicat'));
//输出
$user->getByUsername('llicat');
echo $user->username;
//通过主键查询多个
var_dump($user->select('1,2,3'));
//-----------------修改
//产生了两条sql,第一条找到数据,第二条修改,且元数据都取出了,效率不高
$user->find(1);
$user->username='xingxing';
$user->save();
//-----------------删除
//产生两条sql
$user->find(5);
$user->delete();
//根据主键
$user->delete('1,2');
十一、字段映射:表单名和数据库的字段名不对称,用create不能直接获取,需要用模块做处理
模块中:
//字段映射
protected $_map = array(
'yonghuming'=>'username',
'mima'=>'password',
);
控制器中:
//需要用模块处理
$user = D('user');
var_dump($user->create());
by llicat
##转载请注明出处http://www.cnblogs.com/llicat/
ThinkPHP查询数据与CURD的更多相关文章
- ThinkPHP查询数据的时候toArray()报错解决办法
当查找不到数据时toArray()会报错,如图 解决办法:先查找数据,然后加个判断,如果有数据再转化为数组,如果没有数据就给个空值,不想代码继续往下执行就return false;
- laravel中通过查询构造器,实现数据的curd
//查询构造器: public function query1(){ //利用查询构造器,插入数据: /*$num=DB::table('student')->insert( ['name'=& ...
- 一例基于thinkphp,jquery和bootstrap渲染的查询数据分页器
对于某些查询记录很多的结果,web页面不得不采用分页器,现在奉上一例代码,其主要逻辑是:由页面的dom 节点发起ajax请求,返回的查询结果根据页面布局需要进行切片:并根据总记录数和页面展现的条数算出 ...
- thinkphp查询,3.X 5.0 亲试可行
[php] view plain copy print? 一.介绍 ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取.更新和删除等操作,主要涉及到wher ...
- ThinkPHP 删除数据
ThinkPHP删除数据使用delete方法,例如: 直线电机价格 $Form = M('Form'); $Form->delete(5); 表示删除主键为5的数据,delete方法可以删除单个 ...
- ThinkPHP 读取数据
在ThinkPHP中读取数据的方式很多,通常分为读取数据.读取数据集和读取字段值. 步进电机和伺服电机 数据查询方法支持的连贯操作方法有: 连贯操作 作用 支持的参数类型 where 用于查询或者更新 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- Web jquery表格组件 JQGrid 的使用 - 7.查询数据、编辑数据、删除数据
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- AC中保存数据与查询数据
//保存数据 hui.ajax(function (ret, err) { }, url, {values: {t:"test",m:"Search",c:&q ...
随机推荐
- DHV 平常语言对话 一次聚会离场
一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...
- vc++编译libtiff4.0.4
目录 第1章简介 1 第2章命令行编译 2 2.1 编译 2 2.1.1 使用VC++2010编译 2 2.1.2 使用VC++6编译 4 2.2 生成的文件 5 ...
- Qt之资源系统
简述 Qt 的资源系统用于存储应用程序的可执行二进制文件,它采用平台无关的机制.当你的程序总需要这样的一系列文件(图标.翻译文件等)并且不想冒丢失某些文件的风险时,这就显得十分有用. 资源系统基于 q ...
- 笔记11:GDI 制作数字验证码
大二学长让我学下GDI绘制验证码,然后自己就试了试了.找了点视频看了下. 现在会画直线,矩形,字符串,制作验证码 一.绘制一条直线 private void button1_Click(object ...
- NSException
NSException是什么? 最熟悉的陌生人,这是我对NSException的概述,为什么这么说呢?其实很多开发者接触到NSException的频率非常频繁,但很多人都不知道什么是NSExcepti ...
- 《JavaScript权威指南》读书笔记(二)
日期:2015-12-04 js 的原型::闭包:闭包这是个相当复杂的东西...现在初步理解: http://segmentfault.com/a/1190000000652891 闭包有 ...
- org.hibernate.LazyInitializationException: could not initialize proxy - no Session
原因:在延迟加载的状态下,使用某个属性时,但session已经关闭. 解决方法: 1.把load改成get,直接加载所有属性. 2.获取对象进行一次判断,如果对象没有初始化,就进行一次初始化. if ...
- 5 echo展开
一.(字符)展开 1.echo在标准输出中打印出他的文本 echo this is a test 输出 this is a test 2.输出通配符时,比如*代表匹配文件名的任何字符 echo * 输 ...
- linux下git的安装和使用(转)
转自:http://www.cnblogs.com/sunada2005/archive/2013/06/06/3121098.html 最近在使用github,感觉不错.在windows下,可使用g ...
- BZOJ2280 [Poi2011]Plot
恩..这题真是sxbk 我们先二分答案,然后判断答案是否满足要求 判断方法是二分当前段的长度一直做到底,当然我们可以用倍增这样快一点,直接随机增量就可以了 然后就是卡常..... 然后就是卡精度QAQ ...