如果查询中没有占位符/动态数据,您是否可以省略PDO准备?

时间:2016-10-25 12:18:47

标签: php mysql pdo

我正在使用PDO和MySQL数据库处理应用程序。

我看到了一些查询,这些只是非常简单的SELECT语句,例如

SELECT * FROM table ORDER BY name ASC

代码使用prepare,例如:

    $sql = "SELECT * FROM " . $this->table . " ORDER BY name ASC";
    $stmt = $this->db->query($sql);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $results;

如果查询中没有占位符,是否可以执行此操作,即不使用prepare?

我之所以这么说是因为根据它所说的documentation

  

SQL语句可以包含或更多名称(:name)或问号(?)参数标记

让我想知道你为什么在没有()参数标记的情况下使用它?

3 个答案:

答案 0 :(得分:1)

当然,如果您的查询中没有动态数据,则可以省略prepare。 但是,准备好的陈述比仅保护您的查询更具优势。

根据http://php.net/manual/en/pdo.prepared-statements.php,第二个优点是,语句可以准备一次并执行多次。

  

查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次。准备好查询后,数据库将分析,编译和优化其执行查询的计划。对于复杂查询,如果需要使用不同的参数多次重复相同的查询,则此过程可能会占用足够的时间,从而显着减慢应用程序的速度。通过使用预准备语句,应用程序避免重复分析/编译/优化循环。这意味着预准备语句使用的资源更少,因此运行速度更快。

然而,如果您只运行一次查询并且查询中没有动态数据,则省略prepare也没关系。

答案 1 :(得分:1)

是的,因为准备好的陈述的使用有两个主要原因:

  1. 使用不同的参数增强运行相同的查询。
  2. 通过将sql代码与参数分开来防止sql注入。
  3. 由于您没有可以由预准备语句处理的参数(表名不能是参数),因此您不会通过将查询推送为预准备语句来获得任何内容。

    您仍然需要确保Notification permission granted.返回的内容不会导致生成的sql代码出现任何问题。

答案 2 :(得分:0)

实际上,你必须极少运行这样的查询。一些具有类似配置选项的表可能是。

在所有其他情况下,至少LIMIT条款是强制性的。

所以问题是理论问题。