Avatar billede mads_mao Nybegynder
08. maj 2003 - 11:52 Der er 9 kommentarer og
2 løsninger

Break down SQL-string

Jeg kunne godt tænke mig at tage en SQL-streng som denne:

SELECT id, name, size, etc FROM table WHERE id > 1 LIMIT 0,5

Og køre den igennem en php-funktion, som splitter min query op i underdele og hælder delene i et array, som skal se nogenlunde således ud:

$query = array(
'SELECT id, name, size, etc',
'FROM table',
'WHERE id > 1',
'LIMIT 0,5'
);

Jeg har forsøgt mig med forskellige metoder, men jeg har meget svært ved at nå frem til et brugbart resultat.
Jeg vil sætte stor pris på kode-eksempler, som kan illustrere, hvordan det kunne gøres.
Avatar billede renesvane Nybegynder
08. maj 2003 - 11:55 #1
Uden at kende det store til PHP ville jeg tro, at du kunne søge efter ord med store bogstaver, som din delimiter
Avatar billede mads_mao Nybegynder
08. maj 2003 - 11:59 #2
Ja, men så "breaker" jeg også ved SQL-keywords, som jeg ikke ønsker at benytte som delimiter (AS, CONCAT m.fl.)
Avatar billede renesvane Nybegynder
08. maj 2003 - 12:00 #3
Fucker....
Nå, så skulle man måske definere et array med delimiters (SELECT,WHERE,FROM..osv)
og så bruge det som reference til, hvornår der skal "skiftes linie"
Avatar billede mads_mao Nybegynder
08. maj 2003 - 12:15 #4
Det giver mening, men jeg kan ikke lige hitte ud af, hvilken form for funktion jeg kan bruge til at opnå dette. Det var nok også lige så meget det mit spørgsmål gik på, men du har da i det mindste afklaret for mig, at min indfaldsvinkel ikke er helt i skoven :-)
Avatar billede mads_mao Nybegynder
08. maj 2003 - 12:18 #5
OK. Jeg har fundet en brugbar løsning. Hvis du gider oprette et svar, så får du lige en håndfuld points for din hjælp.
Avatar billede renesvane Nybegynder
08. maj 2003 - 12:37 #6
Nu er jeg som sagt ikke PHP mand, men i VB ser det sådan ud: (Det kan godt simplificeres, men det kunne væer du ikke kende VB så godt)

    Dim sql As String
    Dim delimiters(3) As String
    Dim alleOrd As Variant
    Dim i As Integer
    Dim j As Integer
    Dim isInList As Boolean
    Dim firstline As Boolean
    Dim endeligeSQL As Variant
   
    firstline = True
    delimiters(0) = "SELECT"
    delimiters(1) = "FROM"
    delimiters(2) = "WHERE"
    delimiters(3) = "AND"
   
    sql = "SELECT navn FROM table1 AS t1 WHERE navn LIKE '%ok%' AND alder < 26"
   
    alleOrd = Split(sql, " ")
    sql = ""
    For i = 0 To UBound(alleOrd)
        isInList = False
        For j = 0 To UBound(delimiters)
            If delimiters(j) = alleOrd(i) Then isInList = True
        Next
       
        If isInList Then
            If firstline = True Then
                sql = sql & alleOrd(i) & " "
            Else
                sql = sql & ":" & alleOrd(i) & " "
            End If
        Else
            sql = sql & " " & alleOrd(i)
        End If
        firstline = False
    Next i
   
    endeligeSQL = Split(sql, ":")
Avatar billede renesvane Nybegynder
08. maj 2003 - 12:38 #7
Det var her
Avatar billede renesvane Nybegynder
08. maj 2003 - 12:42 #8
Det ser nærmest ud som om jeg ikke kender det danske sprog så godt, men alle de stavebøffer....  ;-)
Avatar billede mads_mao Nybegynder
08. maj 2003 - 13:08 #9
Dit eksempel minder om det jeg har lavet i php. Jeg vil dog spare dig for at poste det her, for det giver nok ikke ret meget mening, når jeg tager det ud af sammenhængen.
Stavebøfferne lærer jeg nok lige at leve med. Det er jo ikke en stavekonkurrence ;-)
Avatar billede jakoba Nybegynder
08. maj 2003 - 13:11 #10
$original = "SELECT id, name, size, etc FROM table WHERE id > 1 LIMIT 0,5"

$clausekeys = array( "/select /i", "/from /i", "/where /i", "/having /i", "/order /i", "/limit /i" );

$afledt = preg_replace( $clausekeys, "\n\\0", $original );

bemærk at jeg har tilføjet et blanktegn for enden af alle nøgleordene. ellers finder den også feltnavne som 'ordernr' ol.

mvh JakobA
Avatar billede mads_mao Nybegynder
08. maj 2003 - 13:26 #11
jakoba> en god og kompakt løsning på mit problem. Den vil jeg også lige prøve af.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester