链接MySQL命令与原始查询


Chaining MySQL commands Vs. Raw queries

我过去使用自己的cms/框架构建了很多网站,并开发了一种执行查询的简单方法。最近,我开始使用其他框架,比如代码点火器。他们提供原始查询输入,如…

$this->db->query(“SELECT * FROM news WHERE newsId=1;”);

但它们也通过PHP方法提供MySQL命令的链接。

$this->db->select("*")->from("news")->where("newsId=?");

问题是;每种选择的主要区别和好处是什么。

我知道后一种选项可以防止MySQL注入,但老实说,使用$this->db->escape()也可以做到这一点。

所以最后,从我所看到的情况来看,后一种选择只会让你在键盘上使用更多的字母,你会认为这会让你慢下来。

我认为在codeigniter中实现activerecord适合小而简单的查询。当您需要具有大量联接的复杂查询时,更清楚的是只编写查询本身。

如果您在SQL方面有一定的技能,我不认为额外的抽象层会给您带来更好的性能。

最近的php框架开发人员都使用AR(活动记录)/DAO(数据库访问对象)模式。因为它确实比原始查询快。现在的AR技术最初是从PDO(php数据对象)构建的。

为什么活动唱片真的很流行

它真正的查询编写是开发人员的最佳习惯。但是一些问题使它变得困难

1.当我们编写插入和更新大型查询时,有时很难匹配每一行的值。。但AR让它变得简单。您只需先添加数组,然后轻松执行即可
2.使用什么数据库并不重要
3。如果查询有很多条件,有时它真的很难读取或写入。但在AR中,您可以为一个查询级联多个对象
4.AR节省重复语句的时间

我不能为CodeIgniter说话(坦率地说,我所看到的似乎是拼凑在一起的),但有几个原因可以使用这样的系统:

  • 作为支持不同DBMS后端的抽象层的一部分,例如->offset(10)->limit(10)将自动生成OFFSETLIMIT的正确变体,以及MySQL与PostgreSQL等的类似子句
  • 作为"ORM"系统的一部分,查询的结果会根据查询的表和列自动映射到适当类的Model对象中
  • 为了向后兼容性或安装要求,从表和列的确切名称中抽象出来(例如,在特定安装中,表"news"实际上可能被称为"app1_news",以避免与另一个应用程序发生冲突)
  • 处理参数化查询,如您的示例所示;虽然在很大程度上与这种抽象无关,但它们提供的不仅仅是转义,因为DBMS(MySQL或任何正在使用的数据库管理系统)知道查询的哪些部分是固定的,哪些是可变的,这对性能和安全性都很有用