intelogie / sql-formatter
一个 PHP SQL 高亮显示库
Requires
- php: >=5.2.4
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is auto-updated.
Last update: 2024-08-29 04:03:32 UTC
README
一个用于格式化 SQL 语句的轻量级 PHP 类。
除了语法高亮外,它还可以自动缩进并添加换行符。
历史
我发现我不得不经常调试自动生成的 SQL 语句,并想找到一个简单的方法来输出格式化的 HTML,而无需包含庞大的库或复制粘贴到在线格式化器中。
最初我打算从 PhpMyAdmin 中提取格式化代码,但这需要 10,000 多行代码并使用了全局变量。
我看到其他人也有同样的问题,并以 Stack Overflow 用户 losif 的答案作为起点。 http://stackoverflow.com/a/3924147
用法
SqlFormatter 类有一个静态方法 'format',它接受一个 SQL 字符串
作为输入,并返回一个包含在 pre 标签内的格式化 HTML 块。
示例用法
<?php require_once('SqlFormatter.php'); $query = "SELECT count(*),`Column1`,`Testing`, `Testing Three` FROM `Table1` WHERE Column1 = 'testing' AND ( (`Column2` = `Column3` OR Column4 >= NOW()) ) GROUP BY Column1 ORDER BY Column3 DESC LIMIT 5,10"; echo SqlFormatter::format($query);
输出
仅格式化
如果您不需要语法高亮,只想添加缩进和换行符,请将第二个参数传递为 false。
这有助于输出到错误日志或其他非 HTML 格式。
<?php echo SqlFormatter::format($query, false);
输出
仅语法高亮
有一个单独的方法 'highlight',它保留所有原始空白并仅添加语法高亮。
这对于已经格式良好的 SQL,但需要稍微更容易阅读的情况很有用。
<?php echo SqlFormatter::highlight($query);
输出
压缩查询
compress 方法删除所有注释并压缩空白。
这有助于输出可以轻松复制粘贴到命令行的查询。
-- This is a comment
SELECT
/* This is another comment
On more than one line */
Id #This is one final comment
as temp, DateCreated as Created FROM MyTable;
echo SqlFormatter::compress($query)
输出
SELECT Id as temp, DateCreated as Created FROM MyTable;
删除注释
如果您想保留所有原始空白格式并仅删除注释,可以使用 removeComments 方法而不是 compress。
-- This is a comment
SELECT
/* This is another comment
On more than one line */
Id #This is one final comment
as temp, DateCreated as Created FROM MyTable;
<?php echo SqlFormatter::removeComments($query);
输出
SELECT
Id
as temp, DateCreated as Created FROM MyTable;
将 SQL 字符串拆分为查询
另一个与格式化无关的功能是能够将 SQL 字符串拆分为多个查询。
例如
DROP TABLE IF EXISTS MyTable; CREATE TABLE MyTable ( id int ); INSERT INTO MyTable (id) VALUES (1),(2),(3),(4); SELECT * FROM MyTable;
<?php $queries = SqlFormatter::splitQuery($sql);
结果
DROP TABLE IF EXISTS MyTable
;CREATE TABLE MyTable ( id int )
;INSERT INTO MyTable (id) VALUES (1),(2),(3),(4)
;SELECT * FROM MyTable
;
为什么不是正则表达式?
为什么不直接使用 explode(';', $sql)
或正则表达式?
以下示例 SQL 和类似 SQL 是 不可能 使用正则表达式正确分割的,无论多么复杂。
SELECT ";"; SELECT ";\"; a;";
SELECT ";
abc";
SELECT a,b #comment;
FROM test;
SqlFormatter 通过将字符串拆分为标记而不是使用正则表达式来正确生成
SELECT ";"
;SELECT ";\"; a;"
;SELECT "; abc"
;SELECT a,b #comment; FROM test
;
请注意,splitQuery 方法在以下情况下仍会失败
- 可以使用 DELIMITER 命令将分隔符从默认的分号更改为他物。
- CREATE PROCEDURE 命令中包含分号
- USE 命令不以分号结束