Query Generator Class

Door Hipska BE, 21 jaar geleden, 5.267x bekeken

Ik heb een class gemaakt om samen te werken met PDO (of eender welke database) die mooie query's maakt. Voorlopig is hij geoptimaliseerd voor mySQL, maar met wat kleine aanpassingen is hij ook te gebruiken voor PostgreSQL.

Voorlopig doet hij nog maar basis dingen bij de select (COUNT en AS bv. kan hij nog niet), maar later komt er ook input controle.

Nu kan je misschien denken, "Dat is toch meer (typ)werk om een query te maken zo?". Dat is enerzijds wel zo, maar nu heb je wel het voordeel dat niet je hele query als string gekleurd staat maar in verschillende php kleuren.

PS: De and_condition(); en or_condition(); werken precies hetzelfde als de where();

Voorbeeld: http://casteleyn.no-ip.info:8080/~Hipska/Extra/classes/Query

Gesponsorde koppelingen

PHP script bestanden

  1. query-generator-class

 

Er zijn 16 reacties op 'Query generator class'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Henk
Henk
21 jaar geleden
 
0 +1 -0 -1
Dit is geen geldige MySQL code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
DELETE * FROM log
Deze wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
DELETE FROM log
Hipska BE
Hipska BE
21 jaar geleden
 
0 +1 -0 -1
hmm volgens W3schools wel ... Ik kijk dat nog even na, bedankt om te melden.
Edit:
idd, MySQL wil er niets mee doen en ik heb het dan ook meteen aangepast.
W3Schools vermeldt wel dat dit echte SQL is, maar blijkbaar ondersteunt MySQL dit niet.
Frank -
Frank -
21 jaar geleden
 
0 +1 -0 -1
Op w3schools wordt het niet genoemd, het gebruik van een * is gewoon fout. Is ook logisch, je kunt onmogelijk het record verwijderen en toch bepaalde data laten staan. Een * zou je tenslotte kunnen vervangen door de kolomnamen die je (niet) nodig hebt.

Vraag: Wat is nu het (grote) voordeel van het gebruik van een query-class?
Hipska BE
Hipska BE
21 jaar geleden
 
0 +1 -0 -1
Ah, ik wist dat ik van jou reactie zou krijgen ;-)

Op die pagina die je aanhaalt staat daar wel degelijk onder "Delete All Rows" deze regel: DELETE * FROM table_name

Op je vraag over het voordeel had ik in de inleiding al wat gezegd dat je de kleurtjes hebt + dat je dan ook makkelijk met array's kan werken voor data (vb voor insert of update)

Voor grote en ingewikkelde query's is hij idd niet zo goed te gebruiken.
Ultimatum
ultimatum
21 jaar geleden
 
0 +1 -0 -1
@pgfrank, ik heb ook zoiets ontwikkeld, maar dan op kleine schaal. Het grote voordeel vind ik is toch dat je alleen een tabel en velden hoeft in te vullen en veel minder kans op fouten in een query hebt omdat je die niet elke keer weer hoeft over te typen.

Verder mooi script, even kijken of ik mijn kleine scriptje wat kan uitbreiden aan de hand hiervan :)
Frank -
Frank -
21 jaar geleden
 
0 +1 -0 -1
Quote:
Op die pagina die je aanhaalt staat daar wel degelijk onder "Delete All Rows" deze regel: DELETE * FROM table_name
Verrek! Je hebt volkomen gelijk. Ik zou alleen niet weten in welke database dit werkt, heb het nog nooit gezien, laat staan dat het werkt in MySQL of pgSQL.

Het gebruik van array's kan inderdaad wel handig zijn, ik gebruik zelf een aparte functie om array's netjes in de query (stored procedure) te zetten. In pgSQL kun je namelijk ook met array's werken. Het is alleen wel even opletten met de syntax:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"training", "presentation"}}');

Of het alternatief
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
INSERT INTO sal_emp
    VALUES ('Bill',
    ARRAY[10000, 10000, 10000, 10000],
    ARRAY[['meeting', 'lunch'], ['training', 'presentation']]);

In een stored procedure heb ik vaak zoiets nodig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM api.sp_naam('cars', '{"Alfa Romeo", "Volkswagen"}');

Wellicht dat een echte query-class mijn leven wat eenvoudiger kan maken, zal eens naar kijken.
Hipska BE
Hipska BE
21 jaar geleden
 
0 +1 -0 -1
hmm okey, maar dat kan ie nog niet. Met wat aanpassingen wil ik het wel maken dat hij het doet hoor...
PHP erik
PHP erik
21 jaar geleden
 
0 +1 -0 -1
Ik vind een data object, of een data access object (dao) altijd erg handig. Kun je mij vertellen wat het voordeel is van een class als deze? Want er zullen vast wel voordelen zijn, ik zie ze alleen even niet.

@Frank
Arrays voor stored procedures (en queries) zijn inderdaad heel erg handig. Het maakt je database en connectie razendsnel. Hier kun je toch zelf vrij makkelijk een heel goede class voor schrijven? ( "Wellicht dat een echte query-class mijn leven wat eenvoudiger kan maken, zal eens naar kijken." -> ...? )
Frank -
Frank -
21 jaar geleden
 
0 +1 -0 -1
@PHPerik: Heb er ooit een functie voor geschreven en die is blijven hangen en gebruik ik nog steeds. Is eigenlijk geen fraaie oplossing, maar het werkt... Naar aanleiding van dit script zal ik deze eens op de schop nemen, dat wordt hoogste tijd!
Pim Vernooij
Pim Vernooij
21 jaar geleden
 
0 +1 -0 -1
@PHPErik: een data object of een data access object moet nog steeds zijn queries genereren. Deze query klasse kan je dus náást je data object draaien.
PHP erik
PHP erik
21 jaar geleden
 
0 +1 -0 -1
Dat zou kunnen ja. Maar dat is niet echt handig vind ik. Ik gebruik een reflection-class die automatisch z'n queries opbouwt. Dan heb je een dergelijke class als deze eigenlijk niet nodig.
Joeri
Joeri
21 jaar geleden
 
0 +1 -0 -1
werkt het ook met mysqli, omdat dat eigenlijk zelf reeds OOP is met SNMTP erin kan je meerdere querys tegelijk verzenden??

Kan je daar even een antwoord op geven aub.

Voor de rest mooie class.
Pim Vernooij
Pim Vernooij
21 jaar geleden
 
0 +1 -0 -1
@PHPErik: ik zei ook niet dat ik het handig vind, ik zei alleen dat het zou kunnen.

@Joeri: deze class genereert puur en alleen strings. Heeft dus niet met de database engine te maken.

Het volgende werkt dus ook gewoon.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mysql_query( Query::select( array('id','page','time'), array('username','email') )->from('log')->join('users','userid','id')->limit(30,10) );
?>
Hipska BE
Hipska BE
21 jaar geleden
 
0 +1 -0 -1
@Joeri: jazeker, kijk maar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$mysqli
->query( Query::select('id','title','time')->from('posts')->order(array('time' => 'DESC')) );
?>
Cees St
Cees St
21 jaar geleden
 
0 +1 -0 -1
Sorry er zit wel een JOIN in, nogmaals maar eens goed lezen.

Ik heb mijn opmerkingen maar even weggehaald want het blijkt dat een aantal van mijn bedenkingen hiermee wellicht opgelost kunnen worden.

Leuke oplossing voor de JOIN maar .....
gaat dit wel goed

foreach ($this->tables as $t => $tname) {
$this->query = str_ireplace('t'.($t+1).'.', $tname.'.', $this->query);
}

als ik het goed begrijp doe je voor elke JOIN table een call op de public function Join()
dan doet hij toch elke keer een replace op alle namen

Ook de ORDER gaat waarschijnlijk niet als bedoelt, want wat nu als er een join loopt op een zelfde veldnaam, dan moet de table een alias hebben om naar het geode veld te verwijzen. Of zit ik nu weer te slapen.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Hipska BE
Hipska BE
21 jaar geleden
 
0 +1 -0 -1
Ja dat loopt wel goed hoor Cees, als iets vervangen is, dan wordt het de volgende keer niet meer vervangen he.

Je kan ook altijd testen. Als iets niet werkt, laat het me dan maar weten.

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

Inhoudsopgave

  1. query-generator-class

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.