ThinkPHP基础学习系列(2):基本数据库操作

1. 简单的查询一张表:
先在Action中写查询代码:

class IndexAction extends Action{

public function index(){

$Demo = new Model('guestbookinfo'); // 实例化模型类,查询哪张表

$list = $Demo->select(); // 查询数据

$this->assign('list',$list); // 模板变量赋值

//dump($list);这个代码是测试用,如果查出数据就会在页面输出

$this->display(); // 输出模板

}

}

然后设定模板显示方式:

<body>

<foreach name="list" item="v">

{$v.G_ID}<br>

</foreach>

</body>

显示结果如:
4 17 12 13 7 8 14 10 9 15 16

2. 简单的插入数据:
需要先完成model类,如表结构为:
clip_image002的model类写法如下(其实所有实体类的写法都基本一样):

<?php

class AdmininfoModel extends Model

{

}

?>

注意:表名和这里的名字要对应,中间没有大写字母,他会把WhoAreU分解成三个表 who,are ,u ;为了避免误解,我们需要把表名写成小写。

然后写我们的动作,这里为了把管理员业务和普通业务区别开,我们在\Lib\Action目录下再创建一个新类AdminAction.class.php,代码如:

<?php

class AdminAction extends Action{

//插入操作

public function insert()

{

header("Content-Type:text/html; charset=utf-8");//为了提示时不乱码

$admin = D("Admininfo");//获取表结构信息

if($admin->create()) //创建对象

{

$admin->add();//执行插入操作

}

else

{

echo '错误';

}

}

}

?>

接着写模板,在Tpl\default下再创建一个管理员文件夹,名为Admin,在下面创建一个HTML文件AddAdmin.html,代码如:

<html>

<head>

<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<body>

<form action="__URL__/insert" method=post name="admin" >

登录名:<input type="text" name="A_LoginId"><br>

密码:<input type="text" name="A_LoginPwd"><br>

<input type="text" name="A_RoleId"><br>

<input type="submit" value="提交" name="Submit">

</form>

</body>

</html>

注意:这个表单是要插入数据库的,而我们并没有写插入语句,是TP帮我们完成了这个操作,但是他仍然需要知道哪个表单元素的值往哪个字段里面插,所以就要求表单元素的名字和数据库对应起来(数据库信息暴漏了一些啊,可以通过别名来避免的)。

然后我们访问index.php/admin/addadmin地址。就是admin文件夹下的addadmin模板,就会显示页面,注意这个页面是提交给admin动作的insert方法的。这里只体现了3个字段,原因是ID是自增的。点击提交就可以插入成功。

注意:把模板保存成utf-8格式,否则是乱码。

3. 有默认值和调用系统方法的插入:
比如我们上面管理员表的A_RoleId为默认值1,A_LoginPwd字段需要MD5加密,而这些都不可能在界面实现,只能在插入的时候处理,所以我们得打开AdmininfoModel.class.php模型文件,加入自动完成属性,代码如:

protected $_auto = array (

array('A_RoleId','2'), // 新增的时候把A_RoleId字段设置为2

array('A_LoginPwd','md5',1,'function') , // 对A_LoginPwd字段在新增的时候使md5函数处理

);

A_RoleId后面的2意思是这个字段默认为2

A_LoginPwd后面的参数是方法名,再后面的1代表新增的时候发生,最后的function表示调用的是一个方法。这时就算界面会传进参数也会被替代掉的。

我们发现现在的数据库记录变成了,上面的2条记录是原来的,呵呵。

clip_image004

还有一些情况需要调用扩展函数,如获取IP的get_client_ip()函数,一般在模型中的使用方式和上面相似:

/*自动填充设置*/

protected $_auto = array (

array('gip','get_client_ip',3,'function') , // 对gip字段在新增的时候使get_client_ip函数处理

array('gaddtime','time',3,'function'),

);

但是这个函数是不能直接使用的,按照手册需要加载,我们可以在涉及到的操作中加入:Load('extend');把扩展函数给加载进来。

注意:大家一定关注到了'function'前面的 1 2 3了,1表示新增操作时候生效,2表示更新时生效,3全部生效。还有一种写法比较复杂,这里不说。

4. 修改操作
其实修改和新增差不多,不同的有2点: 1. 必须传递主键;2.把原来的add()方法换成save()即可。(需要在模板中提交表单到editgbook)

//修改操作

public function editgbook()

{

header("Content-Type:text/html; charset=utf-8");//为了提示时不乱码

$gbinfo =D('Guestbookinfo');//D("Guestbookinfo");

if($gbinfo->create()) //创建对象

{

if($gbinfo->save())

{

//成功

}

else

{

echo '插入错误'.$gbinfo->getError();

}

echo $gbinfo->getLastSql();//获取SQL语句

}else{

echo '错误'.$gbinfo->getError();

}

}

5.删除操作
删除比较简单,只需要把删除的条件传递进去即可:

//删除操作

public function delgbook()

{

$gbinfo =D('Guestbookinfo');

if($gbinfo->where('gid='.$_POST['gid'])->delete())

{

echo $gbinfo->getLastSql();

//成功

}

else

{

echo '错误'.$gbinfo->getError();

}

}

6. 多表联合查询
手册里面有关联模型,但是那玩意实在不直观,还是自己写SQL语句比较实在

//自定义联合查询

public function manysearch()

{

$Model = new Model(); // 实例化一个 model 对象 没有对应任何数据表

$arr=$Model->query('SELECT * FROM think_replyinfo,think_guestbookinfo,think_admininfo where think_replyinfo.gid=think_guestbookinfo.gid and think_replyinfo.aid=think_admininfo.aid');

$this->assign('list',$arr); // 模板变量赋值

$this->display('manytomany'); // 输出模板

}

当然使用自定义语句执行数据库增加和修改也可以

$Model->execute(“update think_user set name=’thinkPHP’ where status=1″) //用于更新和写入数据的 sql 操作,返回影响的记录数

$User->startTrans() // 启动事务
$User->commit() // 提交事务
$User->rollback() // 事务回滚

posted @ 2010-11-13 15:51  石曼迪  Views(4107)  Comments(0Edit  收藏  举报
瓴域建设-环保事业中心