2010-01-16 33 views
5

Những gì tôi đang tìm kiếm là một hàm php mà phải mất một truy vấn chưa định dạng như thế này:Sử dụng PHP để định dạng truy vấn SQL đầu vào dưới dạng HTML?

$ sql = "select name, kích thước từ thứ nơi color = 'xanh' trật tự bởi asc giá";

để nó sẽ xuất hiện trong một cái gì đó trang HTML như thế này:

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

Có một số mã bên trong phpMyAdmin mà thực hiện điều này rồi, tôi có thể nhìn vào đó tôi đoán!

+7

Bạn có thể ... Câu hỏi là gì? –

Trả lời

19

Tôi đã gặp vấn đề tương tự và tạo một lớp PHP trọng lượng nhẹ để làm nổi bật định dạng/cú pháp.

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

tôi đã không kiểm tra đầy đủ với truy vấn phức tạp (sub-lựa chọn, công đoàn, vv), nhưng có vẻ như làm việc khá tốt đối với trường hợp chung.

Để có được kết quả chính xác hoàn toàn, bạn thực sự cần một trình phân tích cú pháp SQL đầy đủ như phpMyAdmin sử dụng, nhưng sử dụng 10.000 dòng mã trải rộng trên nhiều tệp và có thể quá mức để gỡ lỗi đơn giản.

+0

đẹp! sử dụng trong công cụ xây dựng sql của tôi để hiển thị kết quả. hoạt động hoàn hảo, chỉ cần cắm vào và nó hoạt động – Luke

+0

Tuyệt vời! Lời chào từ Colombia. – JuanFernandoz

+0

Tuyệt vời! Tôi ước tôi có thể cho nhiều hơn một phiếu bầu. Tôi tự hỏi câu trả lời này không được chấp nhận mặc dù. –

1

Tôi không nghĩ rằng có bất kỳ mã tự do nào có sẵn trong PECL hoặc tương tự - thật đáng tiếc vì nó sẽ là một tiện ích nhỏ gọn. (Mặc dù chỉ sử dụng khá hạn chế.)

Như vậy, bạn được trả lời bạn sở hữu câu hỏi - phpMyAdmin có lẽ là một cổng đầu tiên tốt của cuộc gọi.

1

Something như thế này sẽ làm việc - thêm bất kỳ từ khóa SQL khác mà bạn muốn phân tích:

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

Tùy thuộc vào một số lỗi có thể xảy ra. –

+2

Chắc chắn nó là ... nó chỉ là một gợi ý bắt đầu :) – Thilo

+0

Ồ, và quấn chuỗi trả về trong "

...
" để hiển thị với thụt đầu dòng trong HTML. – Thilo

6

Sử dụng phpMyAdmin là khá thẳng về phía trước:

require 'libraries/common.inc.php'; 

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

Thêm một stylesheet để cho phép làm nổi bật cú pháp. Nếu bạn đọc một chút trong số sqlparser documentation bạn sẽ tìm thấy một số chức năng khác cho các loại định dạng khác nhau.

Chỉ có điều là phpMyAdmin là hơi lớn để chỉ sử dụng SQL phân tích cú pháp, vì vậy bạn có thể muốn gỡ bỏ tất cả các chức năng khác ...

+0

Tôi đã thử điều này, nhưng tìm thấy nó xa thẳng về phía trước, và đã từ bỏ cuối cùng. –

+0

Tôi đã thử ví dụ này (bằng cách tạo một test.php) trong thư mục phpmyadmin và nó đã làm việc cho tôi. – Veger

+0

OK, bây giờ tôi đã có kịch bản để làm việc bằng cách lưu nó vào/usr/share/phpmyadmin/và mở nó trong trình duyệt từ/phpmyadmin /. Như bạn nói, tôi sẽ phải đào sâu trong tài liệu để có được định dạng đẹp. Nó không hoàn toàn thẳng như tôi mong đợi, nhưng cảm ơn rất nhiều cho các con trỏ. –

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; 
} 
Các vấn đề liên quan