Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[OOPhp] Verschillende methods voor verschillende DBqueries?

None
11 antwoorden
  • Ik ben een tijdje terug met OOP(hp) bezgonnen, en al een poosje bezig met een class voor database handling.
    Nu heb ik binnen de Database class een "DBquery" method/functie gemaakt waarmee je je querie's kunt uitvoeren.

    Voorbeelden:
    $resultaat = DB->DBquery(SELECT * FROM adressen;);
    DB->DBquery(DELETE FROM adressen WHERE naam = "Henk";);
    DB->DBquery(INSERT INTO adressen (naam, adres, geslacht) VALUES ('Joop','Zeestraat 12','nee'););

    Maar nu vraag ik me af of het niet slimmer is om voor de afzonderlijke querie handelingen afzonderlijke methods aan te maken. Dus een SELECT krijgt een eigen method en een DELETE krijgt een eigen method etc. Bijvoorbeeld omdat een SELECT bedoeld is om data op te halen en dus iets retourneert en DELETE alleen iets uitvoert, maar niet noodzakelijkerwijs iets retourneert.
    Van de andere kant kun je verwachten dat een SELECT alleen gebruikt wordt in de vorm van $resultaat = DB->DBquery(SELECT…) en een delete enkel als DB->DBquery(DELETE…) maar hoe idiot proof moet ik het maken? (b.v. om te voorkomen dat iemand $resultaat = DB->DBquery(DELETE…) gaat doen)

    Een andere reden om het toch te scheiden is omdat het antwoorden op akties (b.v. het teruggeven van het aantal verwijderde rijen bij een DELETE of het teruggeven van het gevonden aantal items bij een SELECT) binnen SQL toch verschillenden queries zijn.
    En misschien zijn er nog wel meer en betere redenen om het bij elkaar te houden of de afzonderlijke akties toch een eigen method te geven.
    Kortom, ik zie even door de Method bomen het OOP bos niet meer.

    Wie heeft er een idee over? Ik heb nog veel te leren dus elk relevant antwoord wordt toegejuichd :-)
  • [quote:e771247c0c="Gooly"]Bijvoorbeeld omdat een SELECT bedoeld is om data op te halen en dus iets retourneert en DELETE alleen iets uitvoert, maar niet noodzakelijkerwijs iets retourneert.[/quote:e771247c0c]Het is een [i:e771247c0c]best practice[/i:e771247c0c] om een methode die gegevens verwijdert altijd deze gegevens te laten retourneren. Op deze manier gaan gegevens niet direct verloren en is het aan de programmeur om er (n)iets mee te doen.

    Verder is het een interessante vraag die je stelt, ik heb er zelf ook wel eens over nagedacht. Enerzijds is de controle veel groter door voor elke query een aparte methode te maken, tegelijkertijd moet je dan met zo enorm veel variaties van queries rekening houden dat je jezelf waarschijnlijk alleen beperkt.

    Persoonlijk zou ik geen aparte methoden maken, meer uit praktische overwegingen en tijdsbesparing dan iets anders.

    - Bas
  • Ik heb er voor gekozen wel 4 verschillende functies te maken:
    delete, insert, update en select.
    Allen geven wel een resultaat terug om de reden die BasHamar al aangaf.

    Overigens gebruiken die intern een algemene query functie die ik dus private heb gemaakt.

    Ik heb hiervoor gekozen omdat ik het enerzijds zat werd om elke keer "SELECT * FROM …" uit te schrijven, ik kan dat nu veel korter doen:

    [code:1:0da1e9b08a]$db->select('table', array('field1', 'field1'), 'offset', 'limit', 'order', …);[/code:1:0da1e9b08a]
    Je kan dan ook gemakkelijk extra mogelijkheden creeren voor standaardwaarden maar ook bijvoorbeeld constanten ofzo om makkelijk alle velden te krijgen, of wat je maar wilt eigenlijk.
    Natuurlijk kon ik dat ook gewoon in SQL uitschrijven maar ik wilde alle niet-php code uit mn code behalve waar noodzakelijk (zoals in een database wrapper klasse) krijgen; een kwestie van smaak denk ik.

    BasHamar geeft aan dat je je beperkt met dit soort functies. Ik koos ervoor omdat ik denk geen andere functionaliteit te willen. Het is een kenmerk van OO dat je je beperkt; een klasse is eigenlijk een beperking op wat je er mee kan.
    Overigens kan ik natuurlijk mn private altijd in public veranderen en kan dan toch weer ook raw SQL code tikken in mn PHP…

    Kortom, een kwestie van smaak; Het heeft voor- en nadelen en hangt er net van af wat je er mee wilt.
  • [quote:b308fa50cd="marientje"]Ik koos ervoor omdat ik denk geen andere functionaliteit te willen. Het is een kenmerk van OO dat je je beperkt; een klasse is eigenlijk een beperking op wat je er mee kan.[/quote:b308fa50cd]Goed punt, zo had ik er nog niet over nagedacht.

    - Bas
  • Hartstikke bedankt. Dit soort overwegingen maken een boel duidelijk. Ik zat inderdaad ook aan vier methods te denken voor INSERT, SELECT, DELETE en SET. In mijn geval heb ik echter juist wel de behoefte om de SQL syntax intact te houden met de gedachte dat dit al iets algemeen bekends is en ik dus niet als het ware het "query wiel" opnieuw hoef uit te vinden.

    Ik neig nu inderdaad toch naar vier verschillende methods en de tip om een algemene private query functie te maken gaat me daar zeker bij helpen.
  • En dan stuit ik toch op problemen met het definieren van vier verschillende classes. Want hoe ga ik bij een SELECT b.v. rekening houden met een inner join? Want ik kan er dus niet zomaar "SELECT"…"FROM"…"WHERE" tussen plakken.
    Ik kan er wat IFjes in gooien om uitzonderingen te zien, maar dat worden volgens mij een boel IF's. Lijkt me sowieso niet wenselijk. En Hoe laat ik het meegeven bij het aanroepen van het object?
  • Allereerst neem ik even aan dat je vier functies bedoelt en niet vier klassen.

    Maar je kan inderdaad "er wat IFjes in gooien", hoewel een vijfde functie misschien ook een oplossing is. Bekijk eerst eens goed of je er een algemeen geval kunt isoleren, wellicht geldig voor alle joins. Als dat lukt weet je precies waarop je moet controleren als je uitzonderingen eruit wil filteren, of kan je gewoon een vijfde functie maken.

    Overigens kan je twee functies dezelfde naam geven mits deze een verschillend aantal parameters hebben. Dus je kan twee maal select() maken en op basis van het aantal parameters bepalen of het een gewone select is of een (inner) join.

    - Bas
  • [quote:8a17ca24ff="BasHamar"]Allereerst neem ik even aan dat je vier functies bedoelt en niet vier klassen.[/quote:8a17ca24ff]
    Inderdaad 8)
    Ik wist inderdaad niet dat je dezelfde naam kon gebruiken voor verschillende functies. da's wel heel handig. Al lijkt het me wel iets waar je heel voorzichtig mee om moet gaan wil je het overzicht behouden. (Al lijkt dit me wel een goeie reden om het te doen)

    Maar ik denk dat ik sowieso eerst eens wat dieper in de (mogelijke) SQL queries moet duiken. Ik ben verder niet zo'n super MySQL ace, maar als ik er functies voor ga bouwen is het wel handig dat ik weet wat die functies kunnen gaan verwachten :-)
  • [quote:66b68f46ca="BasHamar"]
    Overigens kan je twee functies dezelfde naam geven mits deze een verschillend aantal parameters hebben. Dus je kan twee maal select() maken en op basis van het aantal parameters bepalen of het een gewone select is of een (inner) join.
    [/quote:66b68f46ca]
    Bij mijn weten kan dat niet in PHP, wel in bijv. Java. Ik krijg in het algemeen dan de melding dat zo'n functie al gedeclareerd is.

    Wat je wel kan doen is werken met optionele parameters (en dan idd misschien wat ifs). Een opzetje:

    [code:1:66b68f46ca]
    function select($table, array $fields = array(), $number_of_items = 0, $start = 0, $order_field = NULL, $order_dir = 'ASC') {
    $sql = 'SELECT ';
    $sql .= empty($fields) ? '*' : implode(', ', $fields);
    $sql .= ' FROM ' . $table;

    if($number_of_items > 0) {
    $sql .= ' LIMIT ' . $number_if_items;
    if($start > 0) $sql .= ' OFFSET ' . $start;
    // Note: requires different syntax for older MySQL versions
    }

    if(!in_array($order_dir, array('ASC', 'DESC'))) $order_dir = 'ASC';
    if(!is_null($order_field)) $sql .= 'ORDER BY ' . $order_field . ' ' . $order_dir;
    // might want to check whether $order_field is in the array of $fields; problem, if empty (all fields), this doesn't work…

    }
    [/code:1:66b68f46ca]

    Overigens is dit denk ik geen oplossing voor JOINs. Dan is het gauw handiger om het zelf uit te schrijven volgens mij dan om t programmatisch te doen.
  • [quote:630c01360b="marientje"]Bij mijn weten kan dat niet in PHP, wel in bijv. Java. Ik krijg in het algemeen dan de melding dat zo'n functie al gedeclareerd is.[/quote:630c01360b]Pfff… Ben ik er dan echt zo uit aan 't raken? Ik weet dat het kan in Java en C++, maar was er eigenlijk ook van overtuigd dat het kon in PHP. Maar aangezien ik geen tegenvoorbeeld kan vinden zal Marientje ongetwijfeld gelijk hebben. Moet ik toch maar snel weer eens wat PHP-hobbyprojecten oppakken, anders blijf ik verkeerd advies geven…

    :? :oops:

    - Bas
  • [quote:082637c5e9="BasHamar"]Pfff… Ben ik er dan echt zo uit aan 't raken? …..
    Moet ik toch maar snel weer eens wat PHP-hobbyprojecten oppakken, anders blijf ik verkeerd advies geven…

    :? :oops:

    - Bas[/quote:082637c5e9]
    Haha, ja ik heb gemerkt dat je het bij moet houden. Kort nadat ik OOP had ontdekt was ik zo druk dat ik nauwelijks nog aan PHP toe kwam. Onlangs ben ik maar weer helemaal opnieuw met OOP begonnen omdat ik het alweer kwijt was. (Nu was dat natuurlijk wel iets waar ik nog maar net een begin mee had gemaakt)

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.