2010-01-16 74 views
5

我所寻找的是一个PHP函数,它是这样一个未格式化的问题:“从那里的颜色=‘绿色’按价格升序顺序选择的东西名称,大小”使用PHP将输入SQL查询格式化为HTML?

$ SQL =;

,这样它会出现在HTML页面是这样的:

 
SELECT 
    name, size 
FROM 
    things 
WHERE 
    color = 'green' 
ORDER BY 
    price ASC'; 

里面有phpMyAdmin的一些代码,已经做了这个,我可以看看在那里,我猜!

+7

你可以......问题是什么? – 2010-01-16 19:43:48

回答

19

我有同样的问题,并做了一个轻量级的PHP类来做格式/语法突出显示。

https://github.com/jdorn/sql-formatter

我还没有完全与复杂的查询(子选择,工会等)的测试,但它似乎工作得很好了常见的情况。

为了获得完全准确的结果,您确实需要一个完整的SQL解析器,如phpMyAdmin使用,但是它使用了超过许多文件的10,000多行代码,并且可能用于简单调试。

+0

美丽!在我的sql builder中使用来显示结果。完美的作品,只需插入即可使用 – Luke 2013-02-21 00:03:17

+0

太棒了!来自哥伦比亚的问候。 – JuanFernandoz 2015-10-12 18:27:11

+0

太棒了!我希望我能给一个以上的选票。我想知道这个答案是不被接受的。 – 2016-07-02 12:02:33

1

我不认为在PECL或类似内部有任何可以自由使用的代码 - 这很遗憾,因为它将是一个相当整洁的小实用程序。 (尽管只有相当有限的用途。)

因此,你回答你自己的问题 - phpMyAdmin可能是一个很好的第一停靠点。

1

像这样的事情会工作 - 添加要分析任何其他SQL关键字:

function sql_format($query) { 
    $keywords = array("select", "from", "where", "order by", "group by", "insert into", "update"); 
    foreach ($keywords as $keyword) { 
    if (preg_match("/($keyword *)/i", $query, $matches)) { 
     $query = str_replace($matches[1], "\n" . strtoupper($matches[1]) . "\n ", $query); 
    } 
    } 
    return $query; 
} 
+0

这受到一些可能的错误。 – 2010-01-16 20:32:07

+2

当然,这只是一个开始建议:) – Thilo 2010-01-16 20:33:50

+0

哦,并将返回字符串包装在“

...
”中,以便在HTML中显示缩进。 – Thilo 2010-01-16 20:36:32

6

使用phpMyAdmin是相当简单:

require 'libraries/common.inc.php'; 

$sql= "select * from test"; 
$parsed_sql = PMA_SQP_parse($sql);  
echo PMA_SQP_formatHtml($parsed_sql); 

添加样式表使语法高亮。如果您在sqlparser documentation中阅读了一下,您会发现其他一些功能适用于不同的格式类型。

唯一的事情就是phpMyAdmin是有点大,只能使用SQL解析,所以你可能要去除所有其他功能...

+0

我试过这个,但发现它远非直截了当,最终放弃了。 – 2010-02-27 12:48:06

+0

我在phpmyadmin目录中自己尝试了这个例子(通过创建一个test.php),它对我很有用。 – Veger 2010-02-28 19:34:13

+0

好的,我现在通过将脚本保存在/ usr/share/phpmyadmin /并从/ phpmyadmin /在浏览器中打开脚本来获取脚本。正如你所说的,我将不得不在文档中进行深入研究,以获得更好的格式。它并不像我所希望的那么直截了当,但非常感谢这些指针。 – 2010-03-02 02:26:16

8
function getFormattedSQL($sql_raw) 
{ 
if(empty($sql_raw) || !is_string($sql_raw)) 
{ 
    return false; 
} 

$sql_reserved_all = array (
    'ACCESSIBLE', 'ACTION', 'ADD', 'AFTER', 'AGAINST', 'AGGREGATE', 'ALGORITHM', 'ALL', 'ALTER', 'ANALYSE', 'ANALYZE', 'AND', 'AS', 'ASC', 
    'AUTOCOMMIT', 'AUTO_INCREMENT', 'AVG_ROW_LENGTH', 'BACKUP', 'BEGIN', 'BETWEEN', 'BINLOG', 'BOTH', 'BY', 'CASCADE', 'CASE', 'CHANGE', 'CHANGED', 
    'CHARSET', 'CHECK', 'CHECKSUM', 'COLLATE', 'COLLATION', 'COLUMN', 'COLUMNS', 'COMMENT', 'COMMIT', 'COMMITTED', 'COMPRESSED', 'CONCURRENT', 
    'CONSTRAINT', 'CONTAINS', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT_TIMESTAMP', 'DATABASE', 'DATABASES', 'DAY', 'DAY_HOUR', 'DAY_MINUTE', 
    'DAY_SECOND', 'DEFINER', 'DELAYED', 'DELAY_KEY_WRITE', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', 'DISTINCT', 'DISTINCTROW', 'DIV', 
    'DO', 'DROP', 'DUMPFILE', 'DUPLICATE', 'DYNAMIC', 'ELSE', 'ENCLOSED', 'END', 'ENGINE', 'ENGINES', 'ESCAPE', 'ESCAPED', 'EVENTS', 'EXECUTE', 
    'EXISTS', 'EXPLAIN', 'EXTENDED', 'FAST', 'FIELDS', 'FILE', 'FIRST', 'FIXED', 'FLUSH', 'FOR', 'FORCE', 'FOREIGN', 'FROM', 'FULL', 'FULLTEXT', 
    'FUNCTION', 'GEMINI', 'GEMINI_SPIN_RETRIES', 'GLOBAL', 'GRANT', 'GRANTS', 'GROUP', 'HAVING', 'HEAP', 'HIGH_PRIORITY', 'HOSTS', 'HOUR', 'HOUR_MINUTE', 
    'HOUR_SECOND', 'IDENTIFIED', 'IF', 'IGNORE', 'IN', 'INDEX', 'INDEXES', 'INFILE', 'INNER', 'INSERT', 'INSERT_ID', 'INSERT_METHOD', 'INTERVAL', 
    'INTO', 'INVOKER', 'IS', 'ISOLATION', 'JOIN', 'KEY', 'KEYS', 'KILL', 'LAST_INSERT_ID', 'LEADING', 'LEFT', 'LEVEL', 'LIKE', 'LIMIT', 'LINEAR',    
    'LINES', 'LOAD', 'LOCAL', 'LOCK', 'LOCKS', 'LOGS', 'LOW_PRIORITY', 'MARIA', 'MASTER', 'MASTER_CONNECT_RETRY', 'MASTER_HOST', 'MASTER_LOG_FILE', 
    'MASTER_LOG_POS', 'MASTER_PASSWORD', 'MASTER_PORT', 'MASTER_USER', 'MATCH', 'MAX_CONNECTIONS_PER_HOUR', 'MAX_QUERIES_PER_HOUR', 
    'MAX_ROWS', 'MAX_UPDATES_PER_HOUR', 'MAX_USER_CONNECTIONS', 'MEDIUM', 'MERGE', 'MINUTE', 'MINUTE_SECOND', 'MIN_ROWS', 'MODE', 'MODIFY', 
    'MONTH', 'MRG_MYISAM', 'MYISAM', 'NAMES', 'NATURAL', 'NOT', 'NULL', 'OFFSET', 'ON', 'OPEN', 'OPTIMIZE', 'OPTION', 'OPTIONALLY', 'OR', 
    'ORDER', 'OUTER', 'OUTFILE', 'PACK_KEYS', 'PAGE', 'PARTIAL', 'PARTITION', 'PARTITIONS', 'PASSWORD', 'PRIMARY', 'PRIVILEGES', 'PROCEDURE', 
    'PROCESS', 'PROCESSLIST', 'PURGE', 'QUICK', 'RAID0', 'RAID_CHUNKS', 'RAID_CHUNKSIZE', 'RAID_TYPE', 'RANGE', 'READ', 'READ_ONLY',    
    'READ_WRITE', 'REFERENCES', 'REGEXP', 'RELOAD', 'RENAME', 'REPAIR', 'REPEATABLE', 'REPLACE', 'REPLICATION', 'RESET', 'RESTORE', 'RESTRICT', 
    'RETURN', 'RETURNS', 'REVOKE', 'RIGHT', 'RLIKE', 'ROLLBACK', 'ROW', 'ROWS', 'ROW_FORMAT', 'SECOND', 'SECURITY', 'SELECT', 'SEPARATOR', 
    'SERIALIZABLE', 'SESSION', 'SET', 'SHARE', 'SHOW', 'SHUTDOWN', 'SLAVE', 'SONAME', 'SOUNDS', 'SQL', 'SQL_AUTO_IS_NULL', 'SQL_BIG_RESULT', 
    'SQL_BIG_SELECTS', 'SQL_BIG_TABLES', 'SQL_BUFFER_RESULT', 'SQL_CACHE', 'SQL_CALC_FOUND_ROWS', 'SQL_LOG_BIN', 'SQL_LOG_OFF', 
    'SQL_LOG_UPDATE', 'SQL_LOW_PRIORITY_UPDATES', 'SQL_MAX_JOIN_SIZE', 'SQL_NO_CACHE', 'SQL_QUOTE_SHOW_CREATE', 'SQL_SAFE_UPDATES', 
    'SQL_SELECT_LIMIT', 'SQL_SLAVE_SKIP_COUNTER', 'SQL_SMALL_RESULT', 'SQL_WARNINGS', 'START', 'STARTING', 'STATUS', 'STOP', 'STORAGE', 
    'STRAIGHT_JOIN', 'STRING', 'STRIPED', 'SUPER', 'TABLE', 'TABLES', 'TEMPORARY', 'TERMINATED', 'THEN', 'TO', 'TRAILING', 'TRANSACTIONAL',  
    'TRUNCATE', 'TYPE', 'TYPES', 'UNCOMMITTED', 'UNION', 'UNIQUE', 'UNLOCK', 'UPDATE', 'USAGE', 'USE', 'USING', 'VALUES', 'VARIABLES', 
    'VIEW', 'WHEN', 'WHERE', 'WITH', 'WORK', 'WRITE', 'XOR', 'YEAR_MONTH' 
); 

$sql_skip_reserved_words = array('AS', 'ON', 'USING'); 
$sql_special_reserved_words = array('(', ')'); 

$sql_raw = str_replace("\n", " ", $sql_raw); 

$sql_formatted = ""; 

$prev_word = ""; 
$word = ""; 

for($i=0, $j = strlen($sql_raw); $i < $j; $i++) 
{ 
    $word .= $sql_raw[$i]; 

    $word_trimmed = trim($word); 

    if($sql_raw[$i] == " " || in_array($sql_raw[$i], $sql_special_reserved_words)) 
    { 
    $word_trimmed = trim($word); 

    $trimmed_special = false; 

    if(in_array($sql_raw[$i], $sql_special_reserved_words)) 
    { 
    $word_trimmed = substr($word_trimmed, 0, -1); 
    $trimmed_special = true; 
    } 

    $word_trimmed = strtoupper($word_trimmed); 

    if(in_array($word_trimmed, $sql_reserved_all) && !in_array($word_trimmed, $sql_skip_reserved_words)) 
    { 
    if(in_array($prev_word, $sql_reserved_all)) 
    { 
    $sql_formatted .= '<b>'.strtoupper(trim($word)).'</b>'.'&nbsp;'; 
    } 
    else 
    { 
    $sql_formatted .= '<br/>&nbsp;'; 
    $sql_formatted .= '<b>'.strtoupper(trim($word)).'</b>'.'&nbsp;'; 
    } 

    $prev_word = $word_trimmed; 
    $word = ""; 
    } 
    else 
    { 
    $sql_formatted .= trim($word).'&nbsp;'; 

    $prev_word = $word_trimmed; 
    $word = ""; 
    } 
    } 
} 

$sql_formatted .= trim($word); 

return $sql_formatted; 
} 
0
function sql_format($query) { 
    $keywords = array("select", "from", "where", "order by", "group by", "insert into", "update","SET", ","); 
    foreach ($keywords as $keyword) { 
     if (preg_match("/($keyword *)/i", ",", $matches)) { 
     $query = str_replace($matches[1],strtoupper($matches[1]) . "<br/>&nbsp;&nbsp; ", $query); 
     } 
    else if(preg_match("/($keyword *)/i", $query, $matches)) { 
     $query = str_replace($matches[1],"<br>".strtoupper($matches[1]) . "<br/>&nbsp; ", $query); 
    } 
    } 
    return $query; 
}