jdorn/sql-formatter

一个 PHP SQL 高亮库

安装次数: 105,524,071

依赖项: 113

建议者: 15

安全: 0

星标: 3,892

关注者: 41

分支: 187

开放问题: 37

语言:HTML

v1.2.17 2014-01-12 16:20 UTC

This package is auto-updated.

Last update: 2024-08-31 00:33:12 UTC


README

一个轻量级的 PHP 类,用于格式化 SQL 语句。

除了语法高亮之外,它还可以自动缩进和添加换行符。

历史

我发现自己不得不经常调试自动生成的 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);

结果

  1. DROP TABLE IF EXISTS MyTable;
  2. CREATE TABLE MyTable ( id int );
  3. INSERT INTO MyTable (id) VALUES (1),(2),(3),(4);
  4. SELECT * FROM MyTable;

为什么不使用正则表达式呢?

为什么不直接使用 explode(';', $sql) 或正则表达式呢?

以下示例 SQL 和其他类似 SQL 是 不可能 使用正则表达式正确分割的,无论多么复杂。

SELECT ";"; SELECT ";\"; a;";
SELECT ";
    abc";
SELECT a,b #comment;
FROM test;

SqlFormatter 通过将字符串拆分为标记而不是使用正则表达式来正确生成

  1. SELECT ";";
  2. SELECT ";\"; a;";
  3. SELECT "; abc";
  4. SELECT a,b #comment; FROM test;

请注意,splitQuery 方法在以下情况下仍然会失败

  • 可以使用 DELIMITER 命令将分隔符从默认的 ';' 更改为其他内容。
  • CREATE PROCEDURE 命令的中间有 ';'。
  • USE 命令不以 ';' 结尾