2010-01-16 18 views
5

क्या मैं देख रहा हूँ एक php समारोह है कि इस तरह की एक अस्वरूपित क्वेरी लेता है: "चीजों से जहां रंग = कीमत एएससी द्वारा 'हरित' आदेश का चयन नाम, आकार"HTML के रूप में एक इनपुट SQL क्वेरी प्रारूपित करने के लिए PHP का उपयोग करें?

$ sql =;

इतना है कि यह इस तरह एक HTML पृष्ठ कुछ में दिखाई देगा:

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

वहाँ मैं में दिखाई दे सकता है वहाँ मुझे लगता है, phpMyAdmin अंदर कुछ कोड है कि पहले से ही इस करता है!

+7

आप कर सकते हैं ... सवाल क्या है? –

उत्तर

19

मुझे एक ही समस्या थी और स्वरूपण/वाक्यविन्यास हाइलाइटिंग करने के लिए हल्के वजन वाले PHP वर्ग को बनाया गया।

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

मैं पूरी तरह से जटिल क्वेरी (उप-चयन, यूनियनों, आदि) के साथ यह परीक्षण नहीं किया है, लेकिन यह आम मामलों के लिए बहुत अच्छी तरह से काम करने लगता है।

पूरी तरह से सटीक परिणाम प्राप्त करने के लिए, आपको वास्तव में एक पूर्ण एसक्यूएल पार्सर की आवश्यकता है जैसे phpMyAdmin उपयोग करता है, लेकिन यह कई फ़ाइलों पर फैले कोड की 10,000+ रेखाओं का उपयोग करता है और संभवतः सरल डिबगिंग के लिए अधिक है।

+0

सुंदर! परिणामों को प्रदर्शित करने के लिए मेरे एसक्यूएल बिल्डर में उपयोग करना। पूरी तरह से काम करता है, बस प्लग इन करें और यह – Luke

+0

बढ़िया काम करता है! कोलंबिया से बधाई। – JuanFernandoz

+0

बढ़िया! काश मैं एक से अधिक वोट दे सकता हूं। मुझे आश्चर्य है कि यह जवाब यद्यपि स्वीकार नहीं किया गया है। –

1

मुझे नहीं लगता कि कोई स्वतंत्र रूप से उपलब्ध कोड है जो पीईसीएल या इसी तरह के भीतर करता है - जो दयालु है, क्योंकि यह काफी साफ उपयोगिता होगी। (यद्यपि केवल सीमित सीमित उपयोगों के साथ।)

इस प्रकार, आपको अपने प्रश्न का उत्तर दिया गया है - phpMyAdmin शायद कॉल का एक अच्छा पहला बंदरगाह है।

1

कुछ इस तरह काम करेगा - किसी अन्य एसक्यूएल कीवर्ड आप पार्स करने के लिए चाहता हूँ जोड़ें:

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

यह कुछ संभावित बग के अधीन है। –

+2

यकीन है कि यह है ... यह सिर्फ एक शुरुआती सुझाव है :) – Thilo

+0

ओह, और एचटीएमएल में इंडेंटेशन के साथ प्रदर्शित करने के लिए "

...
" में वापसी स्ट्रिंग को लपेटें। – Thilo

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 बड़ी है करने के लिए केवल, एसक्यूएल पार्स उपयोग करती हैं इसलिए आप अन्य सभी कार्यक्षमताओं पट्टी करना चाह सकते हैं है ...

+0

मैंने कोशिश की, लेकिन इसे सीधे आगे से दूर पाया, और अंत में छोड़ दिया। –

+0

मैंने phpmyadmin निर्देशिका में खुद को उदाहरण (test.php बनाकर) की कोशिश की और यह मेरे लिए काम किया। – Veger

+0

ठीक है, अब मुझे स्क्रिप्ट को/usr/share/phpmyadmin में सहेजकर// ब्राउज़र में इसे/phpmyadmin/से खोलकर काम करने के लिए मिला है। जैसा कि आप कहते हैं, मुझे अच्छा प्रारूपण प्राप्त करने के लिए प्रलेखन में चारों ओर खोदना होगा। जैसा कि मैंने आशा की थी उतनी सीधी आगे नहीं है, लेकिन पॉइंटर्स के लिए बहुत बहुत धन्यवाद। –

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; 
} 
संबंधित मुद्दे