Highlight SQL

Door Martijn Wieringa, 21 jaar geleden, 5.780x bekeken

Wanneer er een fout optreed in een query is het misschien handig op deze query lezer-vriendelijk op het scherm te zetten.

Daarom heb ik (bij gebrek aan het vinden van wat beters) deze functie geschreven die een query string netjes highlight en opbreekt in regels.

De code voegd css-classes toe aan de content, zodat je deze naar eigen inzicht kunt stijlen.

Werking:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

    $query
= "SELECT `table`.`column`, column FROM table;";
    echo highlight_sql($query);

?>

Voorbeeld: http://www.pholeron.nl/projects/highlight_sql/index.php

Gesponsorde koppelingen

PHP script bestanden

  1. highlight-sql

 

Er zijn 35 reacties op 'Highlight sql'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Manaus
Manaus
21 jaar geleden
 
0 +1 -0 -1
mooi script;)
K i p
K i p
21 jaar geleden
 
0 +1 -0 -1
Ja, goed gedaan! Leuk om bij de foutafhandeling van je query's te gebruiken!
Elwin - Fratsloos
Elwin - Fratsloos
21 jaar geleden
 
0 +1 -0 -1
Erg netjes! Mooi om in bijvoorbeeld een forum te bouwen... :) (Bas... hint! ;))

Edit: de CSS? Staat vast wel op het voorbeeld, maar misschien hier erbij zetten...

Elwin
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
Maar niemand zet natuurlijk zoveel haakjes om zn statement (waarom zou je!) Als je dan een normale query erin gooit (wat er in j voorbeeld staat slaat natuurlijk nergens op) zijn het alleen een paar enters die je toevoegt... Voor keywords een enter. Weinig spannend dus.

Je kan je inArray functie een stuk makkelijker maken. Je kan nl. gewoon in_array() gebruiken op een strolower(needle) en een array_map('strtolower', haystack) . Dan benut je wel de snelheid en efficientie van Cpp en toch heb je case insensitive.

Als ik deze query invul op je site:
"SELECT `a`, `b`, `c` FROM `table` WHERE `having` = 'value' AND `e` = 'value' GROUP BY `f` ORDER BY `g` ASC LIMIT 10;"

komt er dit uit

"SELECT `a`, `b`, `c`
FROM `table`
WHERE `having` = 'value'
AND `e` = 'value'
GROUP BY `f`
ORDER BY `g`
ASC
LIMIT 10;"
Met kleurtjes dus. Die ASC is een beetje vreemd, denk je niet?
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
input:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
insert into tabel (a,b,c,d) values (1,2,3,4);


output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
INSERT INTO tabel
(
a,b,c,d)
    VALUES
    (
        1,2,3,4
    )
;


Beetje vreemd, niet?
Klaasjan Boven
Klaasjan Boven
21 jaar geleden
 
0 +1 -0 -1
@cerveti

Met name de output van jouw 2e query is prima
IK vind het een prachtig stukje werk Pholeron. Beter dan wat bijv PMA heeft
Elwin - Fratsloos
Elwin - Fratsloos
21 jaar geleden
 
0 +1 -0 -1
Klaasjan:
Met name de output van jouw 2e query is prima
Vind je serieus? Volgens mij moet VALUES () een tabje terug en a,b,c,d een tabje verder en het haakje op de volgende regel. (dan ga ik uit van de andere queries die het scriopt laat zien...)

Elwin

[Edit: Typo]
Klaasjan Boven
Klaasjan Boven
21 jaar geleden
 
0 +1 -0 -1
Ok ik had het met name over de kleurtjes mbt de inspringing hebben jullie gelijk.
GaMer B
GaMer B
21 jaar geleden
 
0 +1 -0 -1
Erg handig scriptje. Mijn dank.
Stien ss
stien ss
21 jaar geleden
 
0 +1 -0 -1
Goed script ga ik zeker gebruiken(Y).

Een klein dingetje:
Misschien kan je jouw inArray aanpassen naar dit:

Als needle ook een array mag zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
function myInArray ( $needle, $haystack, $strict = false, $case = false ) {
        
        $result = false;
        $func = ($case) ? 'strcmp' : 'strcasecmp' ;
    
        if ( is_array ( $needle ) ) {
            
            foreach($haystack as $bale) {
                  
                if ( ($strict && (array_uintersect_uassoc($needle, $bale, $func, $func) === $needle)) ||
                        (!
$strict && (array_uintersect($needle, $bale, $func) === $needle))
                      ) {

              
                       $result = true;
                       break;
               }
           }
        
        }
else  {
               $tmp = array_values ( array_uintersect ( $haystack, array($needle), $func) );
            $result = !$strict || (isset ( $tmp[0] ) && (gettype($needle) == gettype($tmp[0])));
            
       }

      
       return $result;
        
    }

?>


Als needle geen array mag zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function myInArray ( $needle, $haystack, $strict = false, $case = false ) {
        
        $func = ($case) ? 'strcmp' : 'strcasecmp' ;
    
        $tmp = array_values ( array_uintersect ( $haystack, array($needle), $func) );
        return !$strict || (isset ( $tmp[0] ) && (gettype($needle) == gettype($tmp[0])));
        
    }

?>


Dan heb je er ook strict bij zitten ( mocht je dit nodig hebben ) en de code is een stukje korten en misschien ook efficienter(?).

Edit: heb even getest, maar jou inArray is een stuk sneller dan die ik gaf, dus die van jou is prima:P
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
@stien

Ik heb na lang zoeken nog een andere variant van mn inArray functie gevonden.. misschien ook interessant..

De strict optie vind ik doorgaans minder interessant omdat ik deze functie doorgaans gebruik voor string matches.. het feit dat (1 !== "1") vind ik niet echt relevant in m'n functie. Sterker nog, 'k heb het juist liever dat ze juist wel matchen.

Maar euhm, wat vind je hier van?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

    // Nagenoeg dezelfde als in_array, maar dan met de mogelijk om NIET 'case sensitive' te zoeken, tevens de optie voor een fullmatch, of een gedeeltelijke match
    function inArray($string, $array, $bCaseSensitive = false, $bFullMatch = true)
    {

        if($bCaseSensitive)
        {

            if($bFullMatch)
            {

                // return in_array($string, $array);
                foreach($array AS $key => $val)
                {

                    if(strcmp($val, $string) === 0)
                    {

                        return true;
                    }
                }
            }

            else
            {
                foreach($array AS $key => $val)
                {

                    if(strstr($val, $string) !== false)
                    {

                        return true;
                    }
                }
            }
        }

        else
        {
            if($bFullMatch)
            {

                foreach($array AS $key => $val)
                {

                    if(strcasecmp($val, $string) === 0)
                    {

                        return true;
                    }
                }
            }

            else
            {
                foreach($array AS $key => $val)
                {

                    if(stristr($val, $string) !== false)
                    {

                        return true;
                    }
                }
            }
        }


        return false;
    }


?>
Harmen
Harmen
21 jaar geleden
 
0 +1 -0 -1
heel mooi script, leuk die kleurtjes!!
Stien ss
stien ss
21 jaar geleden
 
0 +1 -0 -1
@Pholeron, kan ook wel handig zijn zoiets, maar dan zou ik het zou coderen, is wat korter:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function inArray($needle, $haystack, $case_sensitive = false, $full = true) {
        
        if ( $full ) {
            $func = ($case_sensitive) ? 'strcmp' : 'strcasecmp';
            $ret = 0;
            
        }
else {
            $func = ($case_sensitive) ? 'strstr' : 'stristr';
            $ret = false;
            
        }

        
        foreach($haystack as $key => $val) {
                  
            if ( call_user_func($func, $val, $needle) === $ret) {
                return true;
            }
        }

        
        return false;
    }

?>


En wat betreft die strict parameter, heb je eigenlijk helemaal gelijk in. Ik gebruik em zelf ook nooit, maar wilde me zoveel mogelijk aan de specificatie van php.net houden:P
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
@Stien

Heey die's inderdaad een stuk netter!
Nice, ik joop um ff van je bij deze :)
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
@cervetti

Die "insert into tabel (a,b,c,d) values (1,2,3,4);" geeft inderdaad een ongewenst resultaat.. zou moeten worden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
insert into tabel
(
    a,b,c,d
)
values
(
    1,2,3,4
)
;


Tnx voor de feedback, kijk ik ff naar!

Ook dat ASC|DESCis wat vreemd, die zal ik uit de 'keywords' verdwijderen..

Update zien jullie dadelijk wel verschijnen alhier ;)
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
Gefixt (ook op testlocatie).
- -
- -
21 jaar geleden
 
0 +1 -0 -1
Mooi, alleen paar nadelen:
als je value,kolom,tabel zonder ' doet wil t niej.
Verder vind ik de code wat lang...
Jan Koehoorn
Jan Koehoorn
21 jaar geleden
 
0 +1 -0 -1
Mooi script Pholeron. Vraagstellers op phphulp moeten hun query's voortaan verplicht via jouw pagina formatten, vind ik ;-)
Leroy Boerefijn
Leroy Boerefijn
21 jaar geleden
 
0 +1 -0 -1
erg leuk gedaan :)
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
@Jonathan

Quote:
als je value,kolom,tabel zonder ' doet wil t niej.


Wat doet ie dan niet? Dat ie een kleurtje krijgt? Een kwestie van de default kleur anders CSS'en lijkt me (: Of wat bedoel je? Hoe had je ut liever gezien? (meer feedback graag (:

De code had idd korter gemogen, maar 'k ben nog niet echt een held met RegEx, maar als je suggesties hebt zonder dat daarbij de functionaliteit wordt aangepast hoor ik dat heel graag!

@Jan & Leroy
Tnx (:
Crispijn -
Crispijn -
21 jaar geleden
 
0 +1 -0 -1
Je voorbeeld site heb ik als bladwijzer toegevoegd! Super mooi werk!
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Jan:
Mooi script Pholeron. Vraagstellers op phphulp moeten hun query's voortaan verplicht via jouw pagina formatten, vind ik ;-)


Of bas deze parser in het forum in laten bouwen ;-)

Ziet er erg netjes uit, alleen dit soort query's gaan niet echt lekker:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT INTO gastenboek(onderwerp, datum, naam, email, bericht) VALUES ('".$onderwerp."', NOW(), '".$naam."', '".$email."', '".$bericht."')
Joeri
Joeri
21 jaar geleden
 
0 +1 -0 -1
Erg mooi script. Denk niet veel op aan te merken en idd. de css moet je zelf maar aanpassen naar wens.
Quote:
PHP Newbie
Of bas deze parser in het forum in laten bouwen ;-)

Vind ik nou nog eens een goed idee, bouw het in in het forum of maak er een aparte pagina voor, MySQL Query test of zoiets.


Grtz.
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
Gezien de belangstelling heb ik op de code toch maar een 2e blik geworpen, en m.b.v. REGEX het opbreken van de code enorm aangepast.. Mede hierdoor de code teruggebracht van bijna 300 regels tot net 130. Lang leefuh regex! Ik hoop dat er hierdoor geen nieuwe fouten zijn ontstaan.. (a)
Luc Zontrop
Luc Zontrop
21 jaar geleden
 
0 +1 -0 -1
Toch wel :(

"Select selections from fromages where andijvie < 10;" ziet er bepaald ook niet goed uit :p
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
Goed punt, gefixt!
Luc Zontrop
Luc Zontrop
21 jaar geleden
 
0 +1 -0 -1
Wel leuk script Pholeron
- Jim  -
- Jim -
21 jaar geleden
 
0 +1 -0 -1
er zit nog een 'bugje' in, met het gebruik van join...
Verder een mooi script,... (Y)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

SELECT u.firstname, u.surname, l.lcode, l.location, TIMESTAMPDIFF
(
    YEAR, birth, CURDATE
    (
    )
)
as
age
FROM wDb.wUsr AS u LEFT JO
## OVER HERE ##
IN wDB.wLoc AS l ON
(
    u.location = l.id
)
WHERE `birth` LIKE '%-02-02'
ORDER BY u.surname ASC;

?>
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
'k heb (n.a.v. Jim) wat 'keywords' toegevoegd.

Tevens heb ik de opbouw van de keyword-array aangepast zodat deze nog flexibeler is..

Ook de regex is wat aangepast zodat deze de data nog beter in de juiste stukjes weet te hakken

Ook (aaneengesloten) spaties/enters/tabs/e.d. worden nu netjes afgevangen en vervangen voor 1 spatie.
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
Euh, lol.. ik zit net ff te zoeken naar 'sql highlight' in google, staat deze pagina al boven aan :P

highlight sql
- Jim  -
- Jim -
21 jaar geleden
 
0 +1 -0 -1
Je kan wellicht ook de keyword's uit MySQL zelf laten halen.
(Mist je toegang hebt tot de mysql database zelf.) Hierin staat een tabel genaamd help_keyword bestaande uit 2 kolommen (help_keyword_id en name) in name staan alle mogelijke keywords welke mysql ondersteund.

EDIT:
En tevens kan je dan ook de functie's van mysql gebruiken, nu worden deze iets wat minder overzichtelijk omdat er naar haakjes wordt gekeken.
DB: mysql TAB: help_topic COLUMN: name.
Martijn Wieringa
Martijn Wieringa
21 jaar geleden
 
0 +1 -0 -1
Er zitten zoveel 1000den keywords in mysql, ik richt me hier alleen op de meest gebruikte.. maar zoals je ziet kun je vrij eenvoudig zelf nieuwe keywords toevoegen.

Wat betreft het zoeken naar functies vind ik wel een goede toevoeging..

Je zou dan bijv. deze regel kunnen opnemen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$aKeywords[] = array('COUNT', false, 'function');


zodat deze gestijlt wordt met de css class 'function'. Probleem krijg je dan met de haakjes. Het script moet dan onderscheid gaan maken tussen functie-haakjes en groeperings-haakjes. Suggesties hoe je dat het liefgste zou zien? Ik ga er dadelijk es over slapen :P
Daan
Daan
21 jaar geleden
 
0 +1 -0 -1
Hey leuk script..
TIP: zorg ervoor dat commentaar (achter '--') niet achter elkaar komt..
als ik dit invul:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
--
-- Hier is de code om een tabel te maken
-- VERANDER HIER NIKS AAN!!!
--

Krijg ik dit als output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
-- -- Hier is de code om een tabel te maken -- VERANDER HIER NIKS AAN!!! --


Commentaar wordt dus heel erg onduidelijk, omdat alles achter elkaar komt..


21 jaar geleden
 
0 +1 -0 -1
eum nog een tip: update staat er niet tussen :$,
ik heb 'm er nu zelf tussen gezet, maar misschien is 't wel handig om het hier ook te doen ;)

Koen
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Dick oo
dick oo
18 jaar geleden
 
0 +1 -0 -1
hij werkt niet eens meer

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. highlight-sql

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.