• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Mysql Highlighting

Status
Für weitere Antworten geschlossen.

gollum1990

Neues Mitglied
Hallo,
ihr kennt ja sicherlich alle PMA, wenn man da SQL Befehle ausführt. Werden diese ja ausgeben, aber auch gehighlightet. Meine Frage ist, wie tut man MYSQL Befehle highlighten?
 
Werbung:
Die Entwickler von PMA haben sich viel Arbeit gemacht und einen echten Parser für SQLs geschrieben. Damit zerlegen sie die Anfrage in die einzelnen Elemente, die sie dann schick einfärben können.

In der Version 2.8.0.3 findest Du den Code in den Dateien libraries/sqlparser.lib.php und libraries/sqlparser.data.php. Alleine an der Dateigröße (zusammen über 100k) kann man schon erkennen, dass das Parsen wohl aufwändiger ist.
 
hmm...und wenn man sich 'ne eigene funktion schreibt, die einem das einfärbt?

Nils aka XraYSoLo
 
Werbung:
Für ein einfaches Highlighting reicht es evtl, die Schlüsselwörter (SELECT, INSERT, UPDATE, FROM, WHERE, IN, etc) rauszufiltern und entsprechend zu markieren. Da diese aber ja auch innerhalb von Strings auftreten können wird das aber nicht so einfach werden. Wenn man wirklich alles richtig highlighten will, wird man wohl einen Aufwand wie die PMA Entwickler treiben müssen. SQL ist von der Syntax her eher nicht so einfach.
 
ich sag' nur:

PHP:
str_replace()

man könnte doch definieren, dass elemente wie INSERT, UPDATE, INTO, ALTER, TRUNCATE, DROP, FROM, WHERE, IN usw.
mit einer css-klasse eingefärbt werden (nur so als idee).

Nils aka XraYSoLo
 
Werbung:
XraYSoLo schrieb:
man könnte doch definieren, dass elemente wie INSERT, UPDATE, INTO, ALTER, TRUNCATE, DROP, FROM, WHERE, IN usw.
mit einer css-klasse eingefärbt werden (nur so als idee).

Wenn eines der Schlüsselwörter innerhalb der SQL als Text vorkommen (z.B.: UPDATE foo SET bar=" .. UPDATE .. ALTER .. " WHERE name LIKE "% INTO %") würde das Highlighten so einfach nicht funktionieren.
 
Wie ich bereits sagte, es ist schwieriger als es scheint.
Ohne regex geht da nichts oder nur wenig oder mit viel mehr Aufwand.
 
Warum würde das nicht funktionieren? Des versteh ich grad nicht...
Und zur Not arbeitet man dann mit explode()
 
Werbung:
No0oB schrieb:
Warum würde das nicht funktionieren? Des versteh ich grad nicht...
Und zur Not arbeitet man dann mit explode()

es sagt ja auch keiner, dass es NICHT geht, sondern nur, dass es ein riesen programmieraufwand ist...

EDIT: ich weiß, umständliche lösung, nur ich an meiner stelle würde das einfach mit css einfärben, wenn die querys nicht zu lang sind.

Nils aka XraYSoLo
 
@XraySolo
Wir reden ja auch nicht um die Ausgabe (die sollte man immer mit CSS-Formatieren - wie will man das sonst machen? Mit Font-Tags? ;ugl), sondern um das herausfiltern und ersetzen der Keyword und Strings.
Nehme doch einfach mal folgenden Query:
SELECT * FROM `into` WHERE `from` LIKE "%select%"
Das sollte so gehighlightet werden:
SELECT * FROM `into` WHERE `from` LIKE "%select%"

Wie du siehst, kannst du nicht einfach mit str_replace arbeiten.
Dann würde dass so aussehen:
SELECT * FROM `into` WHERE `from` LIKE "%select%"
 
Also ich kenn jetzt nicht alle Befehle aber so hab ich es:
PHP:
<?php
$sql = "SELECT `hallo` FROM `hallo` WHERE `hallo` LIKE `hallo`";
// Rote
$sql = str_replace("SELECT", "<font color='red'>SELECT</font>", $sql);
$sql = str_replace("FROM", "<font color='red'>FROM</font>", $sql);
$sql = str_replace("WHERE", "<font color='red'>WHERE</font>", $sql);
$sql = str_replace("INSERT", "<font color='red'>INSERT</font>", $sql);
$sql = str_replace("UPDATE", "<font color='red'>UPDATE</font>", $sql);
$sql = str_replace("INTO", "<font color='red'>INTO</font>", $sql);
$sql = str_replace("ALTER", "<font color='red'>ALTER</font>", $sql);
$sql = str_replace("TRUNCATE", "<font color='red'>TRUNCATE</font>", $sql);
$sql = str_replace("DROP", "<font color='red'>DROP</font>", $sql);
$sql = str_replace("IN", "<font color='red'>IN</font>", $sql);
// Orange
$sql = str_replace("LIKE", "<font color='orange'>LIKE</font>", $sql);
$sql = str_replace("OR", "<font color='orange'>OR</font>", $sql);
$sql = str_replace("AND", "<font color='orange'>AND</font>", $sql);
$sql = str_replace("&&", "<font color='orange'>&&</font>", $sql);
// Blau
$sql = str_replace("`", "<font color='blue'>`</font>", $sql);
$sql = str_replace(" ' ", "<font color='blue'>'</font>", $sql);
echo $sql;
?>

Die Ausgabe wäre so:
SELECT `hallo` FROM `hallo` WHERE `hallo` LIKE `hallo`
 
Zuletzt bearbeitet:
Werbung:
Dann mach mal das hier:
PHP:
$sql = "select`SELECT` from `FROM` where `WHERE` like `LIKE`";
Dann kommt das hier heraus:
select`SELECT` from `FROM` where `WHERE` like `LIKE`

Und das kann nicht falscher sein.
 
Das schwierige ist ja das splitten des Befehls. vll am einfachsten zeichen für zeichen in ner for schleife und dann halt verschiedene "modi" (wenn " vorkam leerzeichen nicht interpretieren bis der " Modus wieder verlassen wurde) und die token in ein array speichern. ( $array[$cur] .= $char; ) - danach nur noch eine schleife über das array, alle nicht maskierten schlüsselwörter umwandeln und identifer/string dann ne andere Farbe und ein implode()

Alles in allem ne schöne Arbeit (:
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben