MySQL - Recursieve stored function

Door Kees Schepers, 13 jaar geleden, 3.969x bekeken

Ik moest dit voor een vriend van mij maken, en toen bedacht ik me dit is ook wellicht handig voor mezelf, en misschien ook leuk voor de mensen op PHPhulp om een voorbeeld te zien met wat je kunt met stored routines in MySQL (en andere DBMS).

Het is dus geen compleet werkend script, ik zelf heb hier weleens wat kritiek op dus mochten jullie vinden dat het niets toevoegt aan de libary dan mag hij verwijderd worden of doe ik dat zelf wel.

Maargoed, deze functie zorgt ervoor dat een categorienaam streepjes als prefix krijgt aan de hand van de hoeveelheid parents hij heeft. Stel je hebt bijvoorbeeld een CMS (Content Management Systeem) en bij het pagina toevoegen wil je aangeven onder welk content item het huidige gaat vallen. Dan bouw je een dropdown menu en om de boomstructuur te visualiseren wil je streepjes voor elke categorie die een indicatie geeft van de niveau diepte.

Normaal haal je wellicht alle categorieën op, en maak je een recursieve functie in PHP etc. Nu kun je MySQL al het werk laten doen ;-)

Naslag werk wat ik erbij gebruikt heb:
http://www.learn-mysql-tutorial.com/Programming.cfm
http://dev.mysql.com/doc/refman/5.1/en/stored-routines.html

Zie voorbeeld voor aanroep.

Voorbeeld: http://www.roosendaler.nl/mysql_example.jpg

Gesponsorde koppelingen

PHP script bestanden

  1. mysql-recursieve-stored-function

 

Er zijn 12 reacties op 'Mysql recursieve stored function'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Toby hinloopen
toby hinloopen
13 jaar geleden
 
0 +1 -0 -1
Na 3-4 lezen snap ik em :)

Maar wat is het voordeel van dit over gewoon een functie schrijven in PHP?
MySQL lijkt me niet echt geschikt om functies in te maken... ik gebruik het liever waarvoor het gemaakt is: data ophalen.

Toch is het best handig om te weten dat SQL/MySQL zoveel kan, maar het lijkt me een beetje onnodig.
Kees Schepers
kees Schepers
13 jaar geleden
 
0 +1 -0 -1
Onnodig is het zeker niet. In performance opzicht zijn stored routines erg gemakkelijk. Je wilt tenslotte je data zo verwerkt mogelijk uit je database halen.

MySQL is zeker wel geschikt voor functies / procedures, waarom denk je anders dat ze erin zitten? (sinds versie 5)

http://nl.wikipedia.org/wiki/Opgeslagen_procedure
Frank -
Frank -
13 jaar geleden
 
0 +1 -0 -1
@Toby: Wanneer je met grote hoeveelheden data werkt, wil je die zooi echt niet eerst uit de database halen, dan bewerken en vervolgens weer terug gaan zetten. Daar zitten de grootste voordelen van stored procedures maar ook veiligheid en eenduidigheid zijn belangrijk. Iedere applicatie, in welke taal dan ook, kan van de functie in de database gebruik maken. Je hoeft dus niet iedere keer opnieuw het wiel uit te vinden.
Kees Schepers
kees Schepers
13 jaar geleden
 
0 +1 -0 -1
Bedankt voor de heldere toelichting Frank! Ben het volledig met je eens.
Iltar van der berg
iltar van der berg
13 jaar geleden
 
0 +1 -0 -1
Je wilt niet al in je query een "-" toevoegen. Dat wil je pas op het moment dat je het wilt tonen op het scherm van de gebruiker. Op deze manier krijg je verkeerde data terug uit je database, als je het opslaat met de waardes zoals je ze ophaalt.
Mebus  Hackintosh
Mebus Hackintosh
13 jaar geleden
 
0 +1 -0 -1
Zie ik daar nou backticks? ...

@pgFrank, dat je dat niet eens zag!
Kees Schepers
kees Schepers
13 jaar geleden
 
0 +1 -0 -1
@iltar van der berg;

Maar dat doe je nou toch helemaal niet? De data gaat gewoon 'goed' de database uit. En wil je je data onverwerkt eruit halen doe je: SELECT category.name etc..

In mijn ogen moet je MySQL zoveel mogelijk laten doen qua data presentatie en PHP qua HTML opmaak.. Overtuig me als het niet zo is.
Frank -
Frank -
13 jaar geleden
 
0 +1 -0 -1
Quote:
In mijn ogen moet je MySQL zoveel mogelijk laten doen qua data presentatie en PHP qua HTML opmaak.. Overtuig me als het niet zo is.

Een database moet data opslaan, beschermen (doet MySQL niet!), bewerken en beschikbaar stellen. Presentatie hoort een database niet te doen en kán een database ook helemaal niet doen. De database heeft geen flauw idee hoe je iets wilt presenteren en soms wil je iets op tien verschillende manieren kunnen presenteren (email-text, email-html, html-fullscreen, html-mobiel, etc. etc.). Wil je dan ook 10 verschillende functies gaan maken? Lijkt mij niet.

Het zou dus vele malen handiger zijn wanneer je gewoon de plek in de data-boom aangeeft, het niveau. niveau 1, niveau 2, etc. Of maak er een boomstructuur van in XML, kun je het resultaat eenvoudig gaan presenteren met XSLT en/of CSS. Die zijn namelijk gemaakt voor presentatie, databases en XML zijn niet gemaakt voor presentatie, browsers kletsen niet eens rechtstreeks met jouw database, daar zit al een laag tussen.

De huidige opzet kan alleen maar - presenteren, voor alle andere presentaties zul je het aantal minnetjes moeten gaan tellen en deze met een regex gaan vervangen door de gewenste presentatie. Zeer omslachtig en alles behalve flexibel.

Verder zou ik MySQL zo min mogelijk laten doen, maar dat staat los van dit script en ga ik verder niet op in.

@Mebus: Die vieze vuile gore volslagen idiote backticks komen waarschijnlijk uit een rottige tool, vandaar dat ik daar maar niets over heb gezegd.
Mebus  Hackintosh
Mebus Hackintosh
13 jaar geleden
 
0 +1 -0 -1
@pgFrank, PHPmyadmin dus:...
Kees Schepers
kees Schepers
13 jaar geleden
 
0 +1 -0 -1
Nee, MySQL Query Browser ;)

Overigens gedeeltelijk ben ik het wel met je eens Frank, niet helemaal. Maar ik ga er niet verder op in om een oneindige discussie te voorkomen in dit script.
Iltar van der berg
iltar van der berg
13 jaar geleden
 
0 +1 -0 -1
@kees
Precies wat ik zei dus.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Toby hinloopen
toby hinloopen
13 jaar geleden
 
0 +1 -0 -1
Ik vind nog steeds dat de database bedoeld is voor het ophalen van data en niet voor het bewerken ervan.

Kleine conversie, owke... maar complete functies?
Maar ik zal dit zeker in mijn achterhoofd houden bij productie van mijn scripts. Ik ga nog wel wat rond lopen testen met dit soort mogelijkheden.

Normaal gebruik ik een PHP classe voor het ophalen en bewerken van de data. Als ik de data moet omzetten voor gebruik en/of groot aantal rijen verwacht, maak ik gebruik van een unbuffered query: Terwijl de DB bezig is met de data is PHP al bezig met het omzetten ervan.

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

Inhoudsopgave

  1. mysql-recursieve-stored-function

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.