【问题标题】:Chaining MySQL commands Vs. Raw queries链接 MySQL 命令与。原始查询
【发布时间】:2013-07-01 01:08:36
【问题描述】:

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

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

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

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

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

我知道后一个选项可以防止 MySQL 注入,但老实说,您可以使用 $this->db->escape() 做同样的事情。

所以最后我可以看到后一个选项只会让你在键盘上使用更多的字母,你会认为这会减慢你的速度。

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    我觉得codeigniter中activerecord的实现适合小而简单的查询。 当您需要具有大量连接的复杂查询时,只需编写查询本身就更清楚了。

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

    【讨论】:

      【解决方案2】:

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

      为什么主动记录真的更快?

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

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

      【讨论】:

      • DAO 不一定更快。相反,有大量代码将 DAL 接口转换为实际的 SQL 查询,这肯定比自己编写查询。此外,手工查询通常比 DAL 根据模板和常见案例自行拼凑起来的查询更有效。
      【解决方案3】:

      我不能代表 CodeIgniter(坦率地说,我所看到的似乎相当混乱),但有几个原因可以使用此类系统:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-22
        • 2021-03-04
        • 2016-04-06
        • 1970-01-01
        • 2017-12-28
        • 2016-02-16
        • 1970-01-01
        • 2018-06-02
        相关资源
        最近更新 更多