一、THINKPHP的CURD方法:
所谓CURD。即对数据库操作的四个基本操作(CURD):C:create(创建)、U:update(更新)、R:read(读取)和D:detele(删除)。
这里篇幅有限,只把手册中我测试过的方法写出来:
在ThinkPHP使用add方法新增数据到数据库。
使用方法如下:
$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->add($data);
或者使用data方法连贯操作
$User->data(array("title" =>"ThinkPHP2.1发布","content" =>"这是内容"))->add();
如果在add之前已经创建数据对象的话(例如使用了create或者data方法),add方法就不需要再传入数据了。
select()和findAll->()相同;
例如:
$User->where(’status=1′)->order(‘create_time’)->limit(10)->select();
注意:在连贯操作中除了select方法必须放到最后一个外,其他的连贯操作的方法调用顺序没有先后,例如,下面的代码和上面的等效:
$User->order(‘create_time’)->where(’status=1′)->limit(10)->select();
注意limit方法的参数,一个参数默认是从索引0开始查找limit(10) 相当于limit('0,10')。而且一个参数的时候可以不加'',当时如果指定了2个参数,必须使用''。所以建议limit的参数都加上单引号(注意单引号的开始结束位置)。
find->()方法,和以上两种方法类似。区别在只返回一条数据。
getField->()获取某个字段值。
$list = $User->getField('id,nickname');
返回的list是一个数组,键名是用户的id, 键值是用户的昵称nickname。
$rs = $Form->limit(2)->page(2)->getField('id,nackname');
SELECT id,title FROM `think_User` LIMIT 2,2
dump出来的结果结构如下:
array(2) {
[3] => string(6) "test"
[4] => string(6) "测试"
}
所以使用getField最好用于获取1个字段(返回一个数组)或2个字段(返回一个数组,键值对的形式)。我认为volist标签处理的都是二维数组,而这里是个键值对形式的一维数组,所以造成了使用getField在页面上输入的结果集是乱码(源码没研究过,只是猜测)。该方法慎用。
一般查询部分字段都采用field方法:
field方法:定义要查询的字段
field方法的参数支持字符串和数组,例如,
$Model->field(‘id,nickname as name’)->select();
$Model->field(array(‘id’,'nickname’=>’name’))->select();
如果不使用field方法指定字段的话,默认和使用field(‘*’)等效。
U更新,C创建:
data,add,save方法:数据对象赋值,添加,保存。例如:
$data['name'] = ‘ThinkPHP’;
$data['email'] = ‘ThinkPHP@gmail.com’;
$Model->data($data)->add();//新增,相当于insert,连贯写法
$Model->add($data); //新增,相当于insert,非连贯写法
$Model->data($data)->where(‘id=3′)->save(); //修改,相当于update
需要注意的是,save方法的话,如果数据没有变化,那么默认返回的操作是FALSE。但是这个save执行是OK的,这个需要注意。
D删除:
delete->()删除数据
$User->where(’status=0′)->order(‘create_time’)->limit(‘5′)->delete();
二、输出内容到模板:
1.在控制器中指定要输出的变量:
eg:
public function index(){
$Form = M('Form');//new Model('Form');
$results = $Form->order("id desc")->limit(6)->select();
$this->assign("result", $results);
$this->display();
}
在模板中使用{$result}的形式接收,result为assign的键。
在页面上使用volist标签可以循环输出$result的值.
eg:
<table>
<tr><td>序号</td><td>标题</td><td>内容</td><td>创建时间</td></tr>
<volist name="result" id="vo">
<tr><td>{$i}.</td><td>{$vo.title}</td><td>{$vo.content}</td><td>{$vo.create_time|date='Y-m-d',###}</td></tr>
</volist>
</table>
或者 只在Action中this->display();
在页面上编码如下:
{~$result=(M('Form')->select())} 可以达到和上面一样的效果,~是不带返回值,:是采用返回值。
$this-display()还支持使用display('模板文件名')的方式以全路径调用模板,
模板输出还可以使用$content=this->fetch(); echo $content;通过变量动态控制输出调用的模板。fetch()用法见手册5.45
这样做可以将一个页面输出到公共的布局页面中,很灵活。
这里拿手册5.46的例子来说明:
<layout name="Public:header" cache="60" />
<layout name="$content" cache="30" />
<layout name="Public:footer" cache="60" />
这是引入公共布局模板的代码,在displa 调用之前,用$content=thisthis->fetch()的方式获得内容快中的html代码,然后this->assgin($content);最后在Action中用this->display('公共模板完全路径')显示这个公告模板。这样就完成了页面的嵌套。
2.数据对象add成功之后,仍可以使用该数据对象操作修改其属性的值,一般用来更改输出到页面的格式,例如一个数据对象存在时间类型的属性,使用自动完成功添加,如果该对象添加完毕后还要显示在页面上,会直接显示时间戳,那么我们就需要在add之后,将该对象的值格式化,重新赋值,在页面上显示。
public function insert(){ $Form = D('Form');//new Model('Form'); $Form->create();//封装表单到form对象中,可手动修改对象的值,eg: $Form->title() = 'xxx'; // if(isset($__POST['title'])){ // $Form->add(); // } //如果表单对象封装成功 if($Form->create()){ if(false !== $Form->add()){ //跳转到添加成功页面 $this->success('添加成功!'); }else{ $this->error('数据写入错误!'); } }else{ header("Content-Type:text/html; charset=utf-8"); exit($Form->getError().' [ <A HREF="javascript:history.back()">返 回</A> ]'); } }
3.变量输出也可以使用函数,例如:
public function index(){ $this->display(); } 在页面上使用{~$result=(M('Form')->select())}的形式调用函数。剩下的工作就是处理$result集合了。
会得到同eg1一样的结果。也就是说在控制器中使用的方法同样可以再模板中使用,就是使用起来稍不大习惯。
可以再页面上直接使用$create_time|date="y-m-d",###}格式化输出时间,关于在页面上输出函数参考手册7.7.2节。这里摘录一部分:
1、执行方法并输出返回值:
格式:{:function(…)}
例如,输出U方法的返回值:
{:U('User/insert')}
编译后的PHP代码是
<?php echo U('User/insert');?>
2、执行方法但不输出:
格式:{~function(…)}
例如,调用say_hello函数:
{~say_hello('ThinkPHP')}
编译后的PHP代码是:
<?php say_hello('ThinkPHP');?>
say_hello需要在Common目录下新建一个common.php 中写。
【Common 公共函数,项目中要用到的自己写的函数,可以在这个文件夹下创建一个名为common.php文件
这些函数可以用在你项目的各个类,同时也可以在模板变量中使用,TP框架会自动加载。】
例如,我们直接输出当前的Public目录下面的menu.html模板文件,使用:
$this->display('./Public/menu.html');
find()找不到返回值为null
thinkphp中,find()方法找不到符合的值返回NULL。
测试:
//数据库中没有该id=1000的数据:
if(M('Form')->where('id=1000')->find()){
echo '找到匹配';
}else{
echo '未找到匹配';
}
//这样做认为find()找不到数据返回的是false,其实代码相当于
if(null){
echo 'null';
}else{
echo 'not null';
}
//永远输出not null。所以要用isset或者empty判断