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类,如表结构为:的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条记录是原来的,呵呵。
还有一些情况需要调用扩展函数,如获取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() // 事务回滚
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端