[PHP] MySQL repository

Pagina: 1
Acties:

Onderwerpen


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

Cavorka

Internet Entrepreneur

Topicstarter
Gegroet mede-devvers,

ik ben met een project bezig, en merk dat ik zoals altijd bij een nieuw project het handiger en sneller wil doen dan de vorige keer. Ik heb nu een aantal classes geschreven die zeer handig zijn voor wat ik wil doen, maar ik zit nu nog steeds met een probleem met MySQL queries.

De functionaliteit zoals het nu is: ik heb een Data class die queries kan uitvoeren en de data in gewenst formaat kan teruggeven. In elke losse module die ik maak (bijvoorbeeld een gastenboek) maak ik een nieuwe class (bijv. GuestbookData) die extend op Data. In deze class staan eigenlijk alleen maar queries, als volgt:
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
Class GuestbookData extends Data {
    
    function GuestbookQuery ($query, $method, $data) {
    // Guestbook
        if($query == "CountriesAll") { 
            $this->dbQuery = "
                SELECT
                    *
                FROM
                    `Countries`
                ORDER BY
                    CountryName ;
            " ; 
            
        }
        
        elseif($query == "EntryNew") { 
            $this->dbQuery = "
                INSERT INTO
                    `Guestbook`
                VALUES (
                    '',
                    '" . $data['GBTime'] . "',
                    '" . $data['GBName'] . "',
                    '" . $data['GBCountry'] . "',
                    '" . $data['GBLocation'] . "',
                    '" . $data['GBEmail'] . "',
                    '" . $data['GBURL'] . "',
                    '" . $data['GBMessage'] . "'
                ) ;
            " ; 
        }
        
        if(isset($this->dbQuery)) {
            return Data::MySQLQuery($this->dbQuery, $method, $data) ;
        }
        else {
            trigger_error("<b>" . __CLASS__ . "::" . __FUNCTION__ . "</b> : No query was set for the given index '" . $query . "'", E_USER_NOTICE) ;
        }
        
    }   // EoF: GuestbookQuery
    
}   // EoC: GuestbookData extends Data

Allemaal leuk en aardig en het werkt ook wel okay, maar wat ik heel erg vaak tegenkom is dat ik bepaalde queries meerdere keren heb staan in de verschillende ModuleData classes. Dit zorgt wel voor een goede onafhankelijkheid voor iedere module (hm, nu ik erover nadenk is dit eigenlijk wel essentieel... kom er zo wel op terug), maar ook voor een dubbel-op gevoel.

Wat ik eigenlijk zou willen (en wat ik net ook gemaakt heb) is dat ik geen extra class nodig zou hebben die extend op mijn originele Data class, maar dat ik alleen de Data class gebruik. De module Data classes zijn namelijk alleen maar een soort query containers op het moment. Als ik namelijk losse files zou hebben, dan zou ik die makkelijker in kunnen laden, en dus query sets kunnen maken... Bijvoorbeeld een sloot met standaard queries die dan niet 10x in alle losse modules zouden hoeven staan.
Ik heb dus net zo gemaakt dat ik alle queries in een losse file zet en die dan inlaad in mijn Data class dmv:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function loadQueries($file) {
        if(is_file($file)) {
            include($file) ;
            
            // Submit queries to Data class query stack (how fancy!)
            $this->addQueriesToStack($dbQuery) ;
            
            unset($dbQuery) ;
        }
        else {
            trigger_error("<b>" . __CLASS__ . "::" . __FUNCTION__ . "</b> : Query file doesn't exist", E_USER_NOTICE) ;
        }
    }   // EoF: loadQueries

De losse file is dan iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$dbQuery['CountriesAll'] = "
                SELECT
                    *
                FROM
                    `Countries`
                ORDER BY
                    CountryName ;
            " ; 
$dbQuery['EntryNew'] = "
                INSERT INTO
                    `Guestbook`
                VALUES (
                    '',
                    '" . $data['GBTime'] . "',
                    '" . $data['GBName'] . "',
                    '" . $data['GBCountry'] . "',
                    '" . $data['GBLocation'] . "',
                    '" . $data['GBEmail'] . "',
                    '" . $data['GBURL'] . "',
                    '" . $data['GBMessage'] . "'
                ) ;
            " ;

Maar als je dit bestand dus include en op de query stack (zo heb ik het maar even genoemd) gooit, dan krijg je bij dynamische queries (waar je dus nog data invult, zoals bij de tweede query hier (EntryNew) een sloot met warning dat $data geen waarde heeft. Dat is inderdaad dan ook niet zo, ik zou die waardes ook pas zetten op het moment dat die specifieke query wordt uitgevoerd. Dit probleem had ik eerder dus niet omdat ik daar nog een if/ifelse /else constructie heb voordat ernaar gekeken wordt.

1. Hoe zouden jullie dit oplossen?
2. Hoe werken jullie met het ik-wil-geen-queries-in-mijn-code probleem? Want ik wil gewoon geen MySQL tussen mijn andere code hebben, ik wil het _zowieso_ in een losse file. Op dit moment is dat dus nog zo, maar ik wil

Thanks.

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


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Het probleem met de query kun je oplossen door gebruik te maken van (s)printf(). Dit heeft als nadeel dat je niet direct een associatief array kunt gebruiken, de volgorde waarin je variabelen specificeert gaat uitmaken.

Voor wat betreft je tweede punt... Ik zie het probleem met queries in mijn code niet zo. Je werkt in je applicatie met gegevens en die zul je hoe dan ook een keer moeten opvragen/wegschrijven. Als je dat direct met een query doet kun je precies zien wat er gebeurd. Stop je er een laag tussen dan wordt het alleen maar onduidelijker. De enige situatie waarin ik daarvoor zou kiezen is als de boel op meerdere DBMS'en zou moeten kunnen draaien.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

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

Cavorka

Internet Entrepreneur

Topicstarter
Het probleem met queries in mijn code is:
1. Je krijgt zeer veel herhaling van bepaalde queries, terwijl het handiger zou zijn er maar een te hebben op een centrale plaats.
2. Je hoeft veel minder te zoeken naar queries, want ze staan in een los bestand.

(s)printf() zou een optie kunnen zijn, maar zoals je als zei: de volgorde is dan ook nog van belang... dat is eigenlijk weer een soort 'restrictie' die ik liever niet zou willen.

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


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Cavorka schreef op zondag 25 september 2005 @ 13:10:
Het probleem met queries in mijn code is:
1. Je krijgt zeer veel herhaling van bepaalde queries, terwijl het handiger zou zijn er maar een te hebben op een centrale plaats.
2. Je hoeft veel minder te zoeken naar queries, want ze staan in een los bestand.

(s)printf() zou een optie kunnen zijn, maar zoals je als zei: de volgorde is dan ook nog van belang... dat is eigenlijk weer een soort 'restrictie' die ik liever niet zou willen.
Een alternatief is dan om je eigen functie te schrijven die in de querystring zaken tussen blokhaken ofzo replaced door waarden uit het associatieve array.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

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

Cavorka

Internet Entrepreneur

Topicstarter
Indeed, een soort query-template parser, heb ik ook aan zitten denken en waarschijnlijk is dat op dit moment (kan namelijk niet echt een andere manier verzinnen) de beste oplossing.

Thanks, ik zal straks even wat proberen en het resultaat posten.

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


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
In mijn O/R mapping framework dient een mapper implementatie class een functie te implementeren die een associatieve array returned. De key is dan steeds de veldnaam in de tabel, en de waarde is dan ook de waarde dat het veld moet krijgen. Een functie in de super class (DatabaseMapper) roept bij een update en insert die functie aan en maakt dan op basis van de gereturnde array een insert of update query. Werkt wel lekker.

Is het trouwens niet beter om het uitvoeren van de queries over te laten aan een ander gedeelte? Je zou zelfs kunnen verbergen welke db gebruikt wordt (mysql/postgresql/sqlite). Nu heeft Data die taak, naast het beheren van de queries.

Stukje voorbeeld code nog:
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
<?php

abstract class DatabaseMapper
{
    abstract protected function createUpdateMap($object);
    
    public function insert($object)
    {
        $updateMap = $this->createUpdateMap($object);
        $columns = array_keys($updateMap);
        $values = Database::escape(array_values($updateMap));
        $query = "
            INSERT INTO
                `" . $this->getTable() . "`
            (
                `" . implode($columns, "`,`") . "`
            )
            VALUES
            (
                '" . implode($values, "','") . "'
            )
        ";
        Database::unbufferedQuery($query);
    }
}

class CustomerMapper extends DatabaseMapper 
{
    protected function createUpdateMap($object)
    {
        return array(
            'name' => $object->getName(),
            'address' => $object->getAddress()
        );
    }   
}

?>

[ Voor 79% gewijzigd door Michali op 25-09-2005 22:17 ]

Noushka's Magnificent Dream | Unity

Pagina: 1