ThinkPHP数据操作方法总结
本文实例总结了ThinkPHP数据操作方法。分享给大家供大家参考。具体如下:
一、ThinkPHPInsert添加数据
ThinkPHP内置的add方法用于向数据表添加数据,相当于SQL中的INSERTINTO行为。
添加数据add方法是CURD(Create,Update,Read,Delete/创建,修改,读取,删除)中的Create的实现,ThinkPHP支持以普通数组方式和面向对象方式将数据写入数据表。
现在以《PHPMySQL数据库教程》中操作user表数据的例子(具体参见:PHP+MySQL之InsertInto数据插入用法分析)为例,来演示如何在ThinkPHP中实现对数据表的数据添加操作。
例子:
在IndexAction控制器(Lib/Action/IndexAction.class.php)里,添加insert()操作:
publicfunctioninsert() { header("Content-Type:text/html;charset=utf-8"); $Dao=M("User");//实例化模型类//构建写入的数据数组 $data["username"]="小王"; $data["password"]=md5("123456"); $data["email"]=12345@163.com; $data["regdate"]=time();//写入数据 if($lastInsId=$Dao->add($data)) { echo"插入数据id为:$lastInsId"; } else{ $this->error('数据写入错误!'); } }
访问执行该操作:http://127.0.0.1/html/Myapp/index.php/Index/insert
语法解读
M("User")用于高效实例化一个数据模型(M是newModel的简写,称为快捷方法),参数为要操作的表名。
接下来构建要保存数据的数组$data。
最后是用add()方法将数据写入库表,由于使用的是M快捷方法,需要将$data数组传入add()方法。
add()方法如果添加数据记录成功,返回的是新数据记录主键,可直接得到。
该例子实际运行的SQL为:
INSERTINTOuser (username,password,email,regdate) VALUES ('小王','e10adc3949ba59abbe56e057f20f883e','12345@163.com',1283612673)
提示:运行该例子,请确认在配置文件里正确配置了数据库的相关账号密码等信息,具体参见《ThinkPHP公共配置文件与各自项目中配置文件组合的方法》
对象方式添加数据
上面的方式是以构造数据数组的方式,然后将数据以参数形式传入add方法写入数据表。ThinkPHP也支持以对象的方式将数据写入数据表,将上面的代码更改为:
publicfunctioninsert() { header("Content-Type:text/html;charset=utf-8"); $Dao=M("User");//实例化模型类//数据对象赋值 $Dao->username="小王"; $Dao->password=md5("123456"); $Dao->email=12345@163.com; $Dao->regdate=time();//写入数据 if($lastInsId=$Dao->add()){echo"插入数据id为:$lastInsId"; } else{ $this->error('数据写入错误!'); } }
对象方式除了数据以数据对象方式赋值外,在调用add方法写入数据的时候不需要传递参数。
二、ThinkPHP更新数据save方法
save()
ThinkPHP中使用save()方法来更新数据库,并且也支持连贯操作的使用。
例子:
publicfunctionupdate(){ header("Content-Type:text/html;charset=utf-8"); $Dao=M("User");//需要更新的数据 $data['email']='Jack@163.com'; //更新的条件$condition['username']='Jack'; $result=$Dao->where($condition)->save($data); //或者:$result=$Dao->where($condition)->data($data)->save(); if($result!==false){echo'数据更新成功!'; } else{ echo'数据更新失败!'; } }
上面例子执行的SQL语句为:
UPDATEuserSETemail='Jack@163.com'WHEREusername='Jack'
提示
为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。
因此要使用save()方法更新数据,必须指定更新条件或者更新的数据中包含主键字段。
使用主键的例子:
publicfunctionupdate(){ header("Content-Type:text/html;charset=utf-8"); $Dao=M("User");//需要更新的数据 $data['email']='Jack@163.com';$data['uid']=2; $result=$Dao->save($data); if($result!==false) { echo'数据更新成功!'; }else{ echo'数据更新失败!'; } }
如果需要更新的数据里面包含主键,那么ThinkPHP会自动把主键的值作为条件来更新。
上面的例子跟下面的效果相同:
//需要更新的数据$data['email']='Jack@163.com';
//更新的条件$condition['uid']=2;$result=$Dao->where($condition)->save($data);
如果是表单数据,还可以使用create()方法创建数据对象来更新数据:
publicfunctionupdate(){ 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()); } }
如果更新的数据需要做逻辑处理,可以在操作类以对象的方式处理或者在模型内处理,具体可参考《ThinkPHP表单数据智能写入create方法》。
注意:以create()方法创建数据对象来更新数据,表单中必须包含一个以主键为名称的隐藏域,才能完成保存操作。
三、ThinkPHP查询数据select(findAll)方法
ThinkPHP查询数据主要提供以下几类查询:
select:普通查询,同findAll()方法
find:取得符合查询条件的一条记录
getBy动态查询:根据某个字段取得符合查询条件的一条记录
getField:获取某个字段的值或多个字段的索引数组
区间查询:取得符合查询条件的区间记录
统计查询:取得符合查询条件的统计数据
定位查询:取得符合查询条件的一条或多条记录
原生SQL查询:支持以原生SQL进行查询或执行操作
select()
select()是ThinkPHP中最常用的普通查询方法,得到的是一个二维数组。findAll()为select()方法的别名,并建议使用select()。
读取操作
下面的例子将user表的所有数据读取出来并显示:
publicfunctionread() { $Dao=M("User");//查询数据 $list=$Dao->select(); //dump($list); //用dump()可以在调试阶段查看数据是否已读取 //模板变量赋值$this->assign("list",$list); //输出模板$this->display(); }
假设上面的例子对应的class文件为Lib/Action/IndexAction.class.php,那么对应的模板文件为Tpl/default/Index/read.html。
数据显示模板
模板文件用于显示刚才读取的User表的数据。在学习阶段,要不想使用模板,也可以直接使用foreach语法在read()操作内直接显示读取的数据。下面是模板相应的代码片段,我们将读取的数据在一个表格中显示出来:
<tableborder="1"> <tr> <thwidth="10%">ID</th> <thwidth="30%">用户名</th> <thwidth="30%">电子邮件</th> <th>注册时间</th> </tr> <volistname="list"id="vo"> <tr> <tdalign="center">{$vo['uid']}</td> <td>{$vo['username']}</td> <td>{$vo['email']}</td> <td>{$vo['regdate']|date='Y-m-dH:i',###}</td> </tr> </volist> </table>
要了解更多关于ThinkPHP模板的知识,请参阅:《ThinkPHP模板》。
field()查询指定字段
select()方法默认是查询所有字段的数据,如果要查询某个或某些字段,就需要使用filed()方法。
filed()是属于ThinkPHP连贯操作中的一个方法,如在上面的例子中,只查询用户名和电子邮件地址,则查询方法对应更改为:
$list=$Dao->field('username,email')->select();
使用查询条件
使用ThinkPHP连贯操作可以很方便的对数据查询使用查询条件。下面是一些简单的查询条件的例子。
where()条件
……//构造查询条件$condition['username']='Admin';//查询数据$list=$Dao->where($condition)->select();……
上述查询的就是username='Admin'这个条件的数据。关于ThinkPHPwhere条件更详细资料,请参阅《ThinkPHPWhere条件》。
ORDERBY排序
在查询中使用ORDERBY对数据进行排序:
……//查询数据$list=$Dao->order('uidDESC')->select();……
这个例子就是数据按照ORDERBYuidDESC进行查询,而order()方法中的参数意义跟SQL语句中的意义完全一致。
LIMIT限制
在查询中使用LIMIT限定数据返回的记录数:
……//查询数据$list=$Dao->limit('4,5')->select();……
这个例子就是将第5-10条记录取出,limit()方法内的参数意义跟SQL语句中的LIMIT完全一致。
连贯操作
ThinkPHP中允许将数据对象中的各个方法写在一起操作,如:
$list=$Dao->order('uidDESC')->limit('4,5')->select();
这就是连贯操作,关于连贯操作更详细的介绍,参见《ThinkPHP连贯操作》。
四、ThinkPHP删除数据记录delete方法
ThinkPHP中使用delete()方法来删除数据库中的数据记录,并且也支持连贯操作的使用。delete()方法执行成功返回操作影响(删除)的记录数。
例子:
publicfunctiondel(){ header("Content-Type:text/html;charset=utf-8"); $Dao=M("User");//删除uid=5的数据记录 $result=$Dao->where('uid=5')->delete(); if($result!==false){ echo'删除',$result,'条数据。'; }else{ echo'删除数据失败!'; } }
上面例子执行的SQL为:
DELETEFROMuserWHEREuid=5
delete()方法可以用于删除单个或者多个数据,主要取决于where()删除条件。另外也可以配合连贯操作中的其他方法如order()、limit()等构造出更符合需要的删除条件:
$Dao=M("User"); $result=$Dao->where('status=0')->order('regdateASC')->limit('5')->delete();
上面例子根据用户注册时间降序排列,删除5条status=0的用户记录。
希望本文所述对大家基于ThinkPHP框架的php程序设计有所帮助。