如何避免 Heredoc SQL 语句

Posted

技术标签:

【中文标题】如何避免 Heredoc SQL 语句【英文标题】:How to avoid Heredoc SQL statements 【发布时间】:2014-02-20 18:28:01 【问题描述】:

如何避免在 SQL 语句中使用 Heredoc 字符串分隔符?或者也许是一个更好的问题,在 php 中创建和调用 SQL 语句的现代方法是什么?

我对 php 比较陌生。我在从事的项目中经常看到这样的事情:

        $sql = <<<SQL
SELECT
    `data`.`key`,
FROM `tableName`
ORDER BY `data`.`key`
SQL;

在研究有关 Heredoc 的更多信息时(我不得不使用 SO symbol reference 帖子来查找它的名称),我觉得有更好的方法来编写 SQL 语句。例如,SO 用户会说他们将 Heredoc 用于 SQL“back in the day”。

使用 Heredoc 似乎不是最好的解决方案,因为很少的格式更改可以mess it up。不能缩进结束标签会使代码更难阅读和格式化。似乎只是使用 Heredoc 会鼓励在代码中乱扔 SQL 语句和逻辑。

这只是“完成方式”还是有更好的方法?

This question about managing your SQL queries 来自 6 年前。 PDO or an ORM are mentioned in this answer 5 年前。这些仍然是最好的方法吗?

【问题讨论】:

heredoc 语句只是一种在不使用引号的情况下引用字符串的方法。你可以使用任何你喜欢的方法。当字符串中有多行时,Heredoc 很常见。 幸好 SQL 不关心这种陈腐的格式。 您不必使用heredoc - 您可以只使用带引号的字符串。 heredoc 获得的唯一好处是不必在内部转义引号。但是,如果您使用的是准备好的语句,则通常不需要这样做 智能编辑器会看到 SQL 是 heredoc 分隔符并进行适当的语法高亮显示。这实际上只是更长查询的可读性。尤其是如果您施加了 80 个字符行之类的限制。 【参考方案1】:

您的 HEREDOC 语句没有任何问题,但这是另一种通过引用字符串来创建 $sql 变量的方法。

$sql = "SELECT `data`.`key`, FROM `tableName` ORDER BY `data`.`key`";

在需要额外可读性的较长语句的情况下,您可以利用忽略空格这一事实:

$sql = "SELECT `data`.`key`, 
    FROM `tableName`
    ORDER BY `data`.`key`";

还可以考虑使用 PDO 以面向对象的方式进行数据库交互:http://www.php.net/PDO

【讨论】:

以上是关于如何避免 Heredoc SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何避免这两个 SQL 语句之间出现死锁?

使用 T-SQL Merge 语句时如何避免插入重复记录

如何避免两次编写 SQL Server 查询以避免重复?

简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?

如何避免 SQL 查询检查 IS NULL 的误报?

如何在powershell中为herestring/heredoc设置编码?