[PHP] Query Splitten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een willekeurige query welke ik helemaal uit elkaar wil halen.
De gegevens kunnen vervolgens in een array of iets dergelijks opgeslagen gaan worden.

Ik heb al een aantal keer gezocht op het forum hier of via google.com / hotscripts.com maar ik heb weinig nuttige informatie gevonden.

Het zou kunnen met substrings en dergelijke maar volgens mij ben je dan wel heel lang bezig.....

Wie kan mij een aantal nuttige tips geven en wat is de beste methode om een query in zijn geheel te splitten.

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

laat es wat code zien? volgens mij wil je veel te moeilijk doen namelijk :p

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
$orderby_tmp = explode("order by",strtolower($query));
$query = $orderby_tmp[0];
$limit_tmp = explode("limit",strtolower($query));


zo was ik begonnen maar op wanneer je meerdere where gegevens hebt gaat het volgens mij niet helemaal goed

Acties:
  • 0 Henk 'm!

Verwijderd

Uh, substringen lijkt me toch echt wel de enigste (makkelijkste) optie!
Gewoon goed over nadenken en desnoods met ereg() werken om posities op te zoeken.
Lijkt me.

Je hebt het wel wat simpel uitgelegt dus het is me niet helemaal duidelijk wat je precies wil..
edit:

Wat wil je precies?

[ Voor 7% gewijzigd door Verwijderd op 01-10-2003 16:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil de query gewoon helemaal ophakken in verschillende stukken.

Als heel simpel voorbeeld

$query = "SELECT * FROM gebruikers WHERE gebruiker_id =1 OR naam = 'tmp' ORDER BY naam LIMIT 10

dan wil ik een array hebben als
[] = SELECT *
[] = FROM gebruikers
[] = WHERE gebruiker_id =1 OR naam = 'tmp'
[] = ORDER BY naam
[] = LIMIT 10

maar ook eventueel de group by en de joins etc..

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Kan je niet met collections of arrays ofzo werken.

Je hebt bv. een array waarin je de namen zet van de velden die in je SELECT clause moeten komen, daarnaast heb je een array met de tabelnamen voor in je FROM clause en een array met filtercriteria voor in je WHERE.
Je vult die tabellen op, en je schrijft een functie die die dingen tot 1 SQL statement gaat maken.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Misschien een array maken met daarin alle speciale woorden waar je op wilt splitten, verder worden de verschillende velden gescheiden door kommas. Als je dan toch die array vult met select, from, where, group by enzovoorts lukt dat toch wel?

Acties:
  • 0 Henk 'm!

Verwijderd

Zou het best even voor je willen scripten, maar dan gaat dat wel morgen worden... Ga nu lekker eten..

Zal er morgen wat voor je opzetten! That's a promise.. als ik het vergeet moet je me even melen.
Waarom ik dit doe?! Dit vindt ik nou leuke dingen om te doen..

[ Voor 45% gewijzigd door Verwijderd op 01-10-2003 17:22 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Als de hoofd- en kleine letters consequent gebruikt worden kun je gewoon de string splitten op een /[A-Z]+/ regular expression.

Anders moet je
• Of je helemaal het schompes leren aan regular expressions (;))
• Of een enorme lap on-onderhoudbare code met 4000 verschillende substr en explode aanroepen
• Of de hulp van een parsergenerator inroepen
• Of de source van de mysql libraries erop naslaan en kijken hoe ze het daar doen.

Om nog even een laatste optie te noemen: misschien denk je wel te moeilijk en vraag ik me daarom af wat je er precies mee wilt en waarom :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb dit nodig om ik een basis query wil maken die ik later op bepaalde moment kan uitbreiden.

Een andere reden dat ik het nodig heb is omdat ik via een bepaalde wizard een query kan laten maken maar ik kan nooit terugkeren in die wizard omdat ik de query niet weer uit mekaar kan krijgen op een fatsoenlijke manier dan.

Acties:
  • 0 Henk 'm!

Verwijderd

Zoals beloofd:

(Om op andere woorden te selecteren moet je de array 'selectie' aanpassen. Met mijn code kan dit alleen als je de woorden neerzet in de volgorde dat ze verschijnen in de originele Query. Als je dit aan wilt passen, en het lijkt mij dat dit nodig gaat zijn, dan moet je zorgen dat je de array 'positions' gaat sorteren op hoogte (deze array bevat alle posities in de string), dus stel dat de array iets is als '12, 42, 28, 56' dan moet je zorgen dat dit '12, 28, 42, 56' wordt... Als je het niet snapt, zie dan mn edit onderaan!)

Edit: Tekst in cursief gaat al niet meer op omdat dit inmiddels aangepast is..

PHP:
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
58
59
60
61
<?php

//----------------------------------------------
// de Woorden waar geknipt gaat worden
$selectie = 
array   (
    'select ',
    'from ',
    'where ',
    'or ',
    'order ',
    'limit '
    );

//----------------------------------------------
// de Query
$query = "SELECT * FROM gebruikers WHERE gebruiker_id =1 OR naam = 'tmp' OR jeroen = 'ja' ORDER BY naam LIMIT 10";
$tmpQuery = strtolower($query);

//----------------------------------------------
// de Knipsels maken

function keyword_positions($key) 
    {

    global $tmpQuery, $positions;   

    $expression = '/' . $key . '/i';
    preg_match_all($expression, $tmpQuery, $aantal);
    for($i = 0; $i < count($aantal[0]); $i++)
        {
        
        if ($i == 0) $searchPos = 0;
        if ($i != 0) $searchPos = $next + 1;
        
        $next = strpos($tmpQuery, $key, $searchPos);
        $positions[] = strpos($tmpQuery, $key, $searchPos);     

        }
    
    return $positions;      

    }

for ($i = 0; $i < count($selectie); $i++)
    keyword_positions($selectie[$i]);

$positions[] = strlen($tmpQuery);

// dit even voor je opgezocht achteraf
// nu maakt het niet meer uit in welke volgorde de woorden in de array 'selectie' staan
sort($positions);
reset($positions);
// eind van het sorteren vd array

// het weergeven van de geknipte Query
for ($i = 0; $i < count($positions); $i++)
    echo substr($tmpQuery, $positions[$i], $positions[$i+1] - $positions[$i]) . '<br>';


?>

edit:

Heb het toch maar even voor je opgezocht, en het staat inmiddels in de code...

[ Voor 53% gewijzigd door Verwijderd op 02-10-2003 11:52 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor je code, dit is iets wat ik zocht en zeker goed kan gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 02 October 2003 @ 12:01:
Bedankt voor je code, dit is iets wat ik zocht en zeker goed kan gebruiken.
Graag gedaan! Vondt het wel een uitdaging.. Vooral om het dynamisch, dus onafhankelijk van het aantal woorden, te maken!

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb je code bekeken (ff getest lokaal hiero) en het is idd een goede oplossing! Maaaaaaarr... de code vangt niet af of een aantal OR's tussen haakjes staan. Bijvoorbeeld:

code:
1
select * from user where (achternaam = 'jansen' OR voornaam = 'piet') and leeftijd = 18


Misschien zit daar nog wel een uitdaging in voor je ;)

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

for($i = 0; $i < count($aantal[0]); $i++)

Dit is echt zo fout als het maar kan. NEVER EVER een count in je voor loop zetten, is absoluut dodelijk voor de performance. :D Nu moet hij elke loop gaan counten: dit is al niet echt een snelle functie, dus die moet je zo min mogelijk aanroepen.

Wel heel netjes van je om dit te maken trouwens!

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Cavorka:
for($i = 0; $i < count($aantal[0]); $i++)

Dit is echt zo fout als het maar kan. NEVER EVER een count in je voor loop zetten, is absoluut dodelijk voor de performance. :D Nu moet hij elke loop gaan counten: dit is al niet echt een snelle functie, dus die moet je zo min mogelijk aanroepen.
Overdrijven is ook een vak, zeg :o

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Kijk eens in de code van PHPMyAdmin,

daar heb je tegen woordig colorcoding...

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

drm schreef op 02 oktober 2003 @ 14:04:
[...]
Overdrijven is ook een vak, zeg :o
Bah, stond ook een smilie in. :p

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 02 October 2003 @ 12:32:

Misschien zit daar nog wel een uitdaging in voor je ;)
Dan ga ik uren rekenen 8)
Cavorka schreef op 02 October 2003 @ 13:57:
for($i = 0; $i < count($aantal[0]); $i++)

Dit is echt zo fout als het maar kan. NEVER EVER een count in je voor loop zetten, is absoluut dodelijk voor de performance. :D Nu moet hij elke loop gaan counten: dit is al niet echt een snelle functie, dus die moet je zo min mogelijk aanroepen.
Rendertijd van bovenstaand script:
0.0006 seconden.
Wel heel netjes van je om dit te maken trouwens!
Vondt ik zelf ook wel :)

[ Voor 17% gewijzigd door Verwijderd op 02-10-2003 14:23 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Cavorka schreef op 02 October 2003 @ 13:57:
Nu moet hij elke loop gaan counten
Als het goed is voert php het juist maar 1x uit...
Toch niet...

[ Voor 6% gewijzigd door ACM op 02-10-2003 15:40 ]


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 00:01

me1299

$ondertitel

Cavorka schreef op 02 October 2003 @ 13:57:
for($i = 0; $i < count($aantal[0]); $i++)

Dit is echt zo fout als het maar kan. NEVER EVER een count in je voor loop zetten, is absoluut dodelijk voor de performance. :D Nu moet hij elke loop gaan counten: dit is al niet echt een snelle functie, dus die moet je zo min mogelijk aanroepen.

Wel heel netjes van je om dit te maken trouwens!
Beetje onzinnig, de tijd die dat kost is echt te verwaarlozen.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 17-09 06:59

Eelke Spaak

- Vlad -

DeathKnight schreef op 02 oktober 2003 @ 15:21:
[...]


Beetje onzinnig, de tijd die dat kost is echt te verwaarlozen.
Toch al gauw een paar milliseconden, en in een webapplicatie met veel gebruikers kan dat het verschil betekenen tussen de aanschaf van een single- of dual-processorsysteem! (Beetje overdreven, maar je snapt de strekking :P )

Beter is het om de count() even in een variabele te zetten:
PHP:
1
2
3
4
5
6
$c = count($arraytje);

for ($i = 0; $i < $c; $i++)
{
   // Voeg code hier in
}

TheStreme - Share anything with anyone


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

DeathKnight schreef op 02 October 2003 @ 15:21:
[...]


Beetje onzinnig, de tijd die dat kost is echt te verwaarlozen.
hoewel het in dit geval niet uitmaakt, heeft hij wel een punt

PHP:
1
2
3
4
for ($i = 0; $i < heleIngewikkeldeBerekeningDieHetAantalIteratiesBepaalt (); $i++)
{
    // ...
}


En het juist aanleren van dit soort dingetjes helpt je wel beter om in de toekomst snellere code te schrijven

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Vladimir G. schreef op 02 oktober 2003 @ 16:35:
[...]

Toch al gauw een paar milliseconden, en in een webapplicatie met veel gebruikers kan dat het verschil betekenen tussen de aanschaf van een single- of dual-processorsysteem! (Beetje overdreven, maar je snapt de strekking :P )

Beter is het om de count() even in een variabele te zetten:
PHP:
1
2
3
4
5
6
$c = count($arraytje);

for ($i = 0; $i < $c; $i++)
{
   // Voeg code hier in
}
of nog mooier:
PHP:
1
2
3
4
for ($i = 0,$c = count($arraytje); $i < $c; $i++)
{
   // Voeg code hier in
}

8)
Pagina: 1