在 PHP 中格式化並高亮 SQL 語句

Wi1dcard發表於2019-01-10

jdorn/sql-formatter 是一個輕量級的 PHP 類用於格式化 SQL 語句。

它支援自動進行縮排、新增換行,甚至還支援語法高亮。

在命令列內使用

該擴充套件包包含一個 bin/sql-formatter 可執行檔案,可直接用於命令列格式化 SQL。

使用 Composer 全域性安裝後便可使用該命令了:

composer global require jdorn/sql-formatter

sql-formatter "SELECT SOME QUERY;" // 直接格式化

// 或

echo "SELECT SOME QUERY;" | sql-formatter // 使用管道,更適合較大量的 SQL 語句

作為擴充套件包使用

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 已經被良好格式化,需讓它更加易讀時。

壓縮查詢語句

compress 方法可刪除所有的 SQL 註釋,並壓縮不必要的空格。

適用於輸出多條查詢語句,並使其易於複製貼上到命令列時。

-- 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;

刪除註釋

如果你需要保留原有格式,但仍需刪除 SQL 註釋,你可以使用 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;
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;
$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;

為何不使用正規表示式?

去看看 README 吧~https://github.com/jdorn/sql-formatter#why-not-regular-expressions

我感謝自己平凡,敢愛敢恨沒負擔。
我感謝自己不凡,可愛可恨都包攬。

相關文章