[PHP]Adodb connectie door classes heen

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
Hoi,

Ik heb me rot zitten zoeken naar goede raad hoe om te gaan met een database connectie. Ik ben bezig met het schrijven van een CMS class (met bijbehorend paneel).
Voor de db connectie gebruik ik adodb.
Het is nu zo dat elke losse klasse zijn connectie los regelt, wat resulteert in meerdere connecties per pagina. (dus bijvoorbeeld al bij elke knoppenreeks)

Ik zou het connectie object aan de functie Execute($db) mee kunnen geven, maar hier wil ik de programmeur die de klasses oproept niet mee pesten en het dus onzichtbaar houden.

Dit voorbeeldje haalt een reeks knoppen op, maar er is ook een class om inhoud weer te geven.
PHP:
1
2
3
4
5
6
7
8
9
10
11
$submenu = new Buttons();
//$submenu->LoginHandler($loginhandler);
$submenu->AddCondition('WHERE', 'childof', $iMain);
$submenu->AddCondition('WHERE', 'level', "2");
$submenu->AddSorting('sort', 'asc');
$rs = $submenu->Execute();
while($rs->EOF == false)
       {
       $id = $rs->GetValue('id');
       $rs->MoveNext();
       }


PHP:
1
2
$db = NewADOConnection($gaConfig['DBType']);
$db->Connect($gaConfig['DBHost'], $gaConfig['DBUser'], $gaConfig['DBPassword'], $gaConfig['DBName']);


Ik had al zitten denken om de connectie te openen tijdens het initialiseren van alle classes, maar wat is de netste manier om te openen en uiteindelijk te sluiten?

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
Schopperdeschop :P

Misschien om de programmeurs met een geweten wakker te maken: het kan wel makkelijk, maar hoe zouden jullie het doen om het netjes te houden?

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik snap het niet helemaal.... Maar als je een DB class maakt, dan kan je toch gewoon per pagina 1x die klass aanmaken, een query maken, uitlezen etc, en daarna gewoon weer een nieuwe query setten en weer uitlezen etc.
code:
1
2
3
4
$db = new db_driver();
$db->set_query("SELECT * FROM");
$rows = $db->get_rows();
$db->free();

etcetcetc

De class opent natuurlijk de DB connectie, en sluit deze evt weer.

[ Voor 9% gewijzigd door Megamind op 10-05-2007 20:24 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Waarom maak je geen singleton? http://www.tml.tkk.fi/~pnr/GoF-models/html/Singleton.html
Je maakt een static functie die je aanroept als klasse::get(), zodra je een database-connectie nodig hebt.

Als je met verschillende db-servers een verbinding moet maken, dan kan je zoiets doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class dbCon
{
  //static
  function get($dbname)
  {
    static $connections = array();
    if (isset($connections[$dbname])) return &$connections[$dbname];
    else {
      $connections[$dbname] = new dbCon($dbname);
      return &$connections[$dbname];
    }
  }
  
  //constructor in PHP4-stijl
  function dbCon(dbname)
  {
    //maak hier je database aan
  }
  function ~dbCon($dbname)
  {
    //hier vrijgeven
  }
}


maak geen aparte functie voor het vrijgeven, zou ik zeggen. Dat gaat altijd een keer fout. Gewoon een destructor.

Vergeet dan trouwens niet dat je database-connectie stuk is nadat de sessie verder is gegaan. Als je een object met een database-verbinding als member in $_SESSION zet, dan doet hij het op de volgende pagina niet meer. Daar moet je iets slims op verzinnen, moet wel lukken als je toch met singletons werkt enzo :)

@megamind: stel je nu eens voor dat je aan het begin van de pagina nog niet weet welke database je gaat aanspreken? Ik ken een paar applicaties waarbij dat het geval is. Dan denk ik aan objecten met overerving e.d. Als je het gewoon in je klasse kan houden, is dat veel makkelijker. Als je het op andere manieren doet, moet je het continue gaan doorgeven aan constructors (of aan functies, zoals mijn voorganger deed :X)

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
MBV schreef op donderdag 10 mei 2007 @ 20:49:
@megamind: stel je nu eens voor dat je aan het begin van de pagina nog niet weet welke database je gaat aanspreken? Ik ken een paar applicaties waarbij dat het geval is. Dan denk ik aan objecten met overerving e.d. Als je het gewoon in je klasse kan houden, is dat veel makkelijker. Als je het op andere manieren doet, moet je het continue gaan doorgeven aan constructors (of aan functies, zoals mijn voorganger deed :X)
Jou voorbeeld is toch gewoon hetzelfde als ik bedoel :P Ik doelde je DB klasse een klasse maken, welke je aanspreekt voor je begint te werken met een DB.

Of zie ik jou voorbeeld fout?

Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
Ah ok,

Het idee is dus redelijk simpel maar briljant!

Simpel gezegd kijkt de classe of de singleton leeg is, zoja:
- bouw het op
zo nee:
- return zichzelf met de db connectie
http://en.wikipedia.org/wiki/Singleton_pattern

In php kan ik toch geen klasse object in een $_SESSION stoppen of begrijp ik het verkeerd?

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

waarom niet? Dat is gewoon een array. Je moet er wel rekening mee houden dat ze serialized worden:

http://php.net/serialize
http://php.net/oop5.magic (PHP5 specifiek, behalve dan __sleep en __wakeup)

Acties:
  • 0 Henk 'm!

  • daniëlpunt
  • Registratie: Maart 2004
  • Niet online

daniëlpunt

monkey's gone to heaven

DDemolition schreef op donderdag 10 mei 2007 @ 23:18:
Ah ok,

Het idee is dus redelijk simpel maar briljant!

Simpel gezegd kijkt de classe of de singleton leeg is, zoja:
- bouw het op
zo nee:
- return zichzelf met de db connectie
http://en.wikipedia.org/wiki/Singleton_pattern

In php kan ik toch geen klasse object in een $_SESSION stoppen of begrijp ik het verkeerd?
Zo gaat het ongeveer ja, de laatste 'zo nee' moet weg.
Het maakt niet uit of de instantie al aangemaakt is of niet, hij word gereturnt. :)

[ Voor 6% gewijzigd door daniëlpunt op 11-05-2007 13:46 ]


Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
super-muffin schreef op vrijdag 11 mei 2007 @ 13:45:
[...]

Zo gaat het ongeveer ja, de laatste 'zo nee' moet weg.
Het maakt niet uit of de instantie al aangemaakt is of niet, hij word gereturnt. :)
Ik heb al wat meer praktische voorbeelden gevonden op internet. Ik snap de werking ervan nu beter.
Ik ga het morgen eventjes uitwerken en kijk of het werkt. Heb nu in de ado classe echo "connect"; gezet bij elke database connect. Wanneer er maar één staat is het goed :P (dit zijn er nu nog een stuk of 5)

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
Geweldig!
Default.class.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class DB
        {
        function get_db()
            {
            static $db;
            if (!isset($db))
                {
                require('Config.inc.php');
                $db = NewADOConnection($gaConfig['DBType']);
                $db->Connect($gaConfig['DBHost'], $gaConfig['DBUser'], $gaConfig['DBPassword'], $gaConfig['DBName']);
                }
            return $db;
            }
        }


en in de class zelf:
Modules/Buttons/Buttons.class.php
PHP:
1
2
3
4
            $db = DB::get_db();
//          $db = NewADOConnection($gaConfig['DBType']);
//          $db->Connect($gaConfig['DBHost'], $gaConfig['DBUser'], $gaConfig['DBPassword'], $gaConfig['DBName']);
            $rs = $db->Execute($SQL);


Netjes programmeren FTW!

Nu nog even kijken hoe ik het doe met php5 en php4 compatibliteit...

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

wat een ranzige vorm van indenting gebruik jij :P

Maar dat is inderdaad het idee. Je zou kunnen overwegen om met references ( return &$db) te werken, en ik zou je aanraden om in een klasse waar veel queries voorkomen get_db alleen in de constructor te zetten (en eventueel in __wakeup).

Volgens mij werkt dit al in PHP4, ik werk nog niet met PHP5. Op mijn werk zijn ze nog niet over (en gaat niet gebeuren ook, PHP wordt uitgefaseerd om VB.net te gebruiken :() dus dat mag je zelf uitproberen :P

[ Voor 26% gewijzigd door MBV op 12-05-2007 15:33 ]


Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
MBV schreef op zaterdag 12 mei 2007 @ 15:31:
wat een ranzige vorm van indenting gebruik jij :P
Is waarschijnlijk nog wat blijven hangen vanuit vb.net en kom er niet van af... |:(

Er staan genoeg dingen over PHP5, maar dan moet ik een PHP5 versie uitbrengen voor alleen die klasse...

[ Voor 18% gewijzigd door DDemolition op 14-05-2007 16:39 ]

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

DDemolition schreef op maandag 14 mei 2007 @ 16:37:
[...]

Is waarschijnlijk nog wat blijven hangen vanuit vb.net en kom er niet van af... |:(

Er staan genoeg dingen over PHP5, maar dan moet ik een PHP5 versie uitbrengen voor alleen die klasse...
Ah, dat verklaart al een heleboel... :+

En over PHP5: wil je dat wel of niet? Omschrijven zou triviaal moeten zijn.

Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Topicstarter
MBV schreef op maandag 14 mei 2007 @ 16:40:
[...]

Ah, dat verklaart al een heleboel... :+

En over PHP5: wil je dat wel of niet? Omschrijven zou triviaal moeten zijn.
Ja dat wil ik wel ja.. zal het toch eens op een php5 testomgeving zetten.

Specs: Server, WS boven, WS beneden

Pagina: 1