CodeIgniter中simple_query与增删改查询构造器的底层执行差异问询
好问题!咱们来把这个事儿掰扯得明明白白~
首先先明确simple_query的定位:它就是CodeIgniter里最“朴素”的SQL执行工具,官方文档说得很清楚——它只负责把你传入的SQL字符串直接丢给数据库执行,不会做任何额外操作:不返回结果集、不记录执行时间、不处理参数绑定、也不会把查询存进调试日志里,完全是“执行完拉倒”的极简模式。
而你用查询构造器的insert()、update()、delete()这些方法时,底层虽然最终会调用simple_query来执行生成好的SQL,但在这之前,查询构造器帮你做了一大堆重要的工作,和直接用simple_query有着本质区别:
自动做安全防护:查询构造器会自动帮你对要插入/更新的数据做转义处理,还会用参数绑定的方式生成SQL,从根源上避免SQL注入风险。比如你写
$this->db->insert('users', ['name' => $username]),它会自动把$username转义后再拼接成安全的SQL;但如果用simple_query,你得自己手动调用$this->db->escape()来处理每个值,不然很容易踩注入的坑。支持调试与查询日志:查询构造器会把生成的完整SQL语句记录到查询日志里,你随时可以用
$this->db->last_query()查看刚执行的SQL,方便调试排错;而simple_query不会留下任何查询记录,出问题了连执行的SQL是什么都查不到。统计执行性能:查询构造器会自动给每个查询加上计时器,你可以用
$this->db->get_elapsed_time()获取这条增删改操作的耗时,方便做性能优化;但simple_query完全不做时间统计,没法知道这个查询跑了多久。封装SQL生成,适配多数据库:你不用手写原生SQL,查询构造器会根据你配置的数据库类型(比如MySQL、PostgreSQL)自动生成符合对应语法的SQL语句,兼容性拉满;而
simple_query需要你自己写完整的原生SQL,换个数据库就得改SQL代码。返回更有用的执行信息:虽然增删改本身不会返回结果集,但查询构造器的方法能给你额外的有用数据:比如
insert()执行后,你可以用$this->db->insert_id()拿到刚插入的自增ID;update()和delete()执行后,用$this->db->affected_rows()能获取受影响的行数。而simple_query只会返回一个布尔值,告诉你执行成功还是失败,这些额外信息完全拿不到。
总结一下:查询构造器的增删改操作是基于simple_query做了一层强大的封装,把安全、调试、兼容性、易用性这些问题都帮你解决了,和直接用simple_query的裸执行模式根本不是一个量级的东西。
内容的提问来源于stack exchange,提问作者H.joshi




