2010-01-16 14 views
5

Quello che sto cercando è una funzione PHP che prende una query non formattato in questo modo:Utilizzare PHP per formattare una query SQL di input come HTML?

$ sql = "select nome, dimensione dalle cose in cui il colore = 'verde' ordine da crescente prezzo";

in modo che sembrerebbe in una pagina HTML o meno così:

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

C'è un po 'di codice all'interno phpMyAdmin che fa questo già, ho potuto guardare in là immagino!

+7

Si potrebbe ... Qual è la domanda? –

risposta

19

Ho avuto lo stesso problema e ho creato una classe PHP leggera per eseguire l'evidenziazione della formattazione/della sintassi.

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

non l'ho completamente testato con query complesse (sub-select, sindacati, ecc), ma sembra funzionare abbastanza bene per i casi più comuni.

Per ottenere risultati completamente accurati, è necessario un parser SQL completo come phpMyAdmin, ma utilizza oltre 10.000 righe di codice distribuite su più file ed è probabilmente eccessivo per il debug semplice.

+0

bellissimo! usando nel mio sql builder per visualizzare i risultati. funziona perfettamente, basta collegarlo e funziona – Luke

+0

Great! Saluti dalla Colombia. – JuanFernandoz

+0

Grande! Vorrei poter dare più di un voto positivo. Mi chiedo tuttavia che questa risposta non sia accettata. –

1

Non penso che ci sia alcun codice liberamente disponibile che faccia questo all'interno di PECL o simili - il che è un peccato, in quanto sarebbe un'utilità abbastanza piccola. (Anche se solo con usi piuttosto limitati.)

Come tale, si risponde alla propria domanda - phpMyAdmin è probabilmente un buon primo punto di chiamata.

1

Qualcosa di simile a questo lavoro - aggiunge qualsiasi altra parola chiave SQL che si desidera analizzare:

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

Questo è soggetto ad alcuni possibili errori. –

+2

Certo che è ... è solo un suggerimento di partenza :) – Thilo

+0

Oh, e avvolgere la stringa di restituzione in "

...
" per visualizzare con indentazione in HTML. – Thilo

6

Utilizzando phpMyAdmin è abbastanza semplice:

require 'libraries/common.inc.php'; 

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

Aggiungi un foglio di stile per consentire l'evidenziazione della sintassi. Se leggi un po 'nello sqlparser documentation troverai qualche altra funzione per diversi tipi di formattazione.

unica cosa è che phpMyAdmin è un po 'grande per utilizzare solo SQL analisi, così si potrebbe desiderare mettere a nudo tutte le altre funzionalità ...

+0

Ho provato questo, ma l'ho trovato lontano dall'avere diritto, e ho rinunciato alla fine. –

+0

Ho provato l'esempio da solo (creando un test.php) nella directory phpmyadmin e ha funzionato per me. – Veger

+0

OK, ora ho funzionato lo script salvandolo in/usr/share/phpmyadmin/e aprendolo nel browser da/phpmyadmin /. Come dici tu, dovrò scavare nella documentazione per ottenere la bella formattazione. Non è proprio così semplice come speravo, ma grazie mille per i suggerimenti. –

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; 
} 
Problemi correlati