login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Mysqli class (Opgelost)

Offline Romic - 07/03/2009 23:46 (laatste wijziging 07/03/2009 23:47)
Avatar van RomicNieuw lid hallo, ik ben bezig met het maken van een mysqli databaseclass.
De functie's zelf lukken wel, maar het gaat erom als ik zoiets wil:
  1. $database=new db();
  2. function doe_iets
  3. {
  4. //Ik heb hier de database nodig,
  5. //hoe doe ik dit zonder opniew verbinding te maken?
  6. }


'global $database' Werkt natuurlijk, maar dat is niet echt proper.
En als ik '$db=new db();' gebruik in de functie, wordt er opnieuw verbinding gemaakt, terwijl er al een is.

Hoe los ik dit op? Ik had al iets gehoord van static, maar dat gebruik ik precies niet goed, want dat gaat niet bij mij.

6 antwoorden

Gesponsorde links
Offline marten - 08/03/2009 09:57 (laatste wijziging 08/03/2009 10:01)
Avatar van marten Beheerder Er zijn twee manieren (simpele manieren dan )

Manier 1:
  1. class MySQLiClass {
  2. private $db;
  3. public function __construct($host, $user, $pass) {
  4. $this->db = mysqli_connect($host, $user, $pass);
  5. }
  6.  
  7. public function doeiets() {
  8. //hier gebruik je $this->db voor de verbinding
  9. }
  10. }
  11.  
  12. $host = 'localhost';
  13. $user = 'user';
  14. $pass = 'pass';
  15.  
  16. // Aanroepen van de functie
  17. $object = new MySQLiClass($host, $user, $pass);
  18. $doeiets = $object->doeiets();


Manier 2:
  1. class MySQLiClass {
  2. private $db;
  3. public function __construct($db) {
  4. $this->db = $db;
  5. }
  6.  
  7. public function doeiets() {
  8. //hier gebruik je $this->db voor de verbinding
  9. }
  10. }
  11.  
  12. $host = 'localhost';
  13. $user = 'user';
  14. $pass = 'pass';
  15.  
  16. $db = mysqli_connect($host, $user, $pass);
  17.  
  18. // Aanroepen van de functie
  19. $object = new MySQLiClass($db);
  20. $doeiets = $object->doeiets();


In de eerste manier maak je dus bij elke aanroep van de class een connectie. Bij de tweede manier maak je 1x een connectie en deze gebruik je dan door al je classes ed heen.

Zelf maak ik gebruik van het registry design pattern. Hierin kan ik door heel mijn project scope gebruik maken van get en set functies. In mijn config zet ik dus gelijk het database object van de connectie in mijn registry, en kan deze dan overal gebruiken.

Ik geef aan dat dit simpele voorbeelden zijn er zijn namelijk nog vele voorbeelden meer. Gebruik maken van een database class bijvoorbeeld die alle handelingen doen naar je database. Deze geeft dan bijvoorbeeld alleen een array terug met je result set.
Offline MiST - 08/03/2009 11:01
Avatar van MiST Lid Nog een manier...

Gebruik het Singleton Design pattern voor je database. (zoek eens op wikipedia hoe je dat implementeert)

Wanneer je dan je db nodig hebt, roep je. DB::getInstance() aan. Bestaat ie, gebruikt ie deze, bestaat ie niet, maakt hij die rap even aan.

Registry is natuurlijk vollediger, maar als je enkel DB nodig hebt, volstaat Singleton me dunkt.
Offline Koen - 08/03/2009 11:29
Avatar van Koen PHP expert Je kan toch ook gewoon de mysqli class die al in php zit gebruiken? 
http://www.php.net/manual/en/class.mysqli.php

Daar zit alles wat je maar wilt in 
Offline Romic - 08/03/2009 11:29 (laatste wijziging 08/03/2009 11:30)
Avatar van Romic Nieuw lid Zoals marten het zegt, had ik nu ook al, maar het gaat erom hoe ik die $database in een aparte functie gebruik. (In een functie kan geen var van erbuiten worden aangeroepen, tenzij mij 'global $database;').

Ik zal wel eens kijken naar dat singleton pattern.

@sliphead:
Het is voor sommige dingen gewoon gemakkelijker om een db class te gebruiken.
Offline marten - 08/03/2009 11:34
Avatar van marten Beheerder Zie mijn tweede manier? Anders geef je de db mee in de functie of je zet de db in een sessie mogelijkheden genoeg. Mooiste is natuurlijk de singleton of registry pattern.
Offline Richard - 08/03/2009 11:35
Avatar van Richard Crew algemeen
MiST schreef:
Nog een manier...

Gebruik het Singleton Design pattern voor je database. (zoek eens op wikipedia hoe je dat implementeert)

Wanneer je dan je db nodig hebt, roep je. DB::getInstance() aan. Bestaat ie, gebruikt ie deze, bestaat ie niet, maakt hij die rap even aan.

Registry is natuurlijk vollediger, maar als je enkel DB nodig hebt, volstaat Singleton me dunkt.

Ehhh, nee! Lees het onderstaande topic eens door, en je vindt wel uit waarom.

http://www.phpf...id=1165214
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.308s