2010-01-16 10 views
5

Co szukam to funkcja php, który bierze niesformatowany zapytanie tak:Użyj PHP do sformatowania wejściowego zapytania SQL jako HTML?

$ sql = „Wybierz nazwę, rozmiar z rzeczy gdzie color =«green»Zamówienia cena asc”;

tak, że wydaje się na stronie HTML coś takiego:

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

Jest jakiś kod wewnątrz phpMyAdmin, że robi to już, mogę spojrzeć tam Chyba!

+7

Możesz ... Na czym polega pytanie? –

Odpowiedz

19

Miałem ten sam problem i stworzyłem lekką klasę PHP do formatowania/kolorowania składni.

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

jeszcze nie w pełni przetestowane ze złożonych zapytań (podstrona wybiera, związków, etc.), ale wydaje się całkiem dobrze pracować dla typowych przypadków.

Aby uzyskać w pełni dokładne wyniki, naprawdę potrzebujesz pełnego parsera SQL, takiego jak phpMyAdmin, ale używa on ponad 10 000 wierszy kodu rozłożonego na wiele plików i prawdopodobnie jest przesadny w celu prostego debugowania.

+0

piękne! używając mojego narzędzia do budowania sql, aby wyświetlić wyniki. działa idealnie, wystarczy podłączyć i działa – Luke

+0

Świetnie! Pozdrowienia z Kolumbii. – JuanFernandoz

+0

Świetnie! Chciałbym dać więcej niż jedną wyższą głosów. Zastanawiam się, że ta odpowiedź nie jest akceptowana. –

1

Nie sądzę, że jest jakiś swobodnie dostępny kod, który robi to w PECL lub podobnym - szkoda, ponieważ byłoby to całkiem zgrabne małe narzędzie. (Chociaż tylko z dość ograniczonymi zastosowaniami.)

Jako takie, otrzymujesz odpowiedź na własne pytanie - phpMyAdmin to prawdopodobnie dobry pierwszy port zawinięcia.

1

Coś jak to będzie działać - dodawać żadnych innych słów kluczowych SQL, które chcesz analizować:

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

Jest to zależne od możliwych błędów. –

+2

Pewnie, że to ... to tylko początkowa sugestia :) – Thilo

+0

Och, i zawiń ciąg zwrotny w "

...
", aby wyświetlić z wcięciem w HTML. – Thilo

6

Korzystanie phpMyAdmin jest dość prosta:

require 'libraries/common.inc.php'; 

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

Dodaj arkusza stylów, aby włączyć podświetlanie składni. Jeśli czytasz trochę w numerze sqlparser documentation, znajdziesz inną funkcję dla różnych typów formatowania.

Jedyną rzeczą jest to, że phpMyAdmin jest dość duża, aby używać SQL parsowania tylko, więc warto się rozebrać wszystkie inne funkcje ...

+0

Próbowałem tego, ale znalazłem go daleko od prostego do przodu, i poddałem się w końcu. –

+0

Próbowałem sam przykład (tworząc plik test.php) w ​​katalogu phpmyadmin i zadziałało dla mnie. – Veger

+0

OK, teraz mam skrypt do pracy, zapisując go w/usr/share/phpmyadmin/i otwierając go w przeglądarce z/phpmyadmin /. Jak mówisz, będę musiał przeglądać dokumentację, aby uzyskać ładne formatowanie. To nie jest tak proste jak miałem nadzieję, ale bardzo dziękuję za wskazówki. –

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; 
} 
Powiązane problemy