login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Mysqli connectie class (Opgelost)

Offline Martijn - 21/06/2013 09:41
Avatar van MartijnCrew PHP Ik heb een website die bijna helemaal producueel is opgezet, en ik ben nieuw in classes (in ieder geval classes van een daadwerkelijk OO niveau).

Ik had mijn connectie overal nodig dus heb een class van het internet afgehaald:

  1. // OO
  2. class DB {
  3. private static $mysqli;
  4. private function __construct(){} //no instantiation
  5.  
  6. static function cxn() {
  7. if( !self::$mysqli ) {
  8. self::$mysqli = new mysqli("localhost", MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);
  9. }
  10. return self::$mysqli;
  11. }
  12. }
  13.  
  14. // Deze is nu zo te gebruiken:
  15. DB::cxn()->query($query);


In dit voorbeeld is de functie query() van mysqli zelf. Ik kwam gisteren tegen dat je dus zelf functienamen gewoon kan gebruiken als ze al bestaan (met enkele regels om je aan te houden, maar die even daargelaten)

Wat ik wil is mn eigen query() maken, maar als ik in de bovenstaande class dit toevoeg:
  1. public function query($string) {
  2. echo $string; exit;
  3. }

wordt deze nooit opgeroepen, waar ik hoopte dat dit zou werken:
  1. DB::cxn()->query($query); // in dit geval niets meer dan een echo dus


Wie kan me vertellen hoe het wel moet, en graag met een benadering waarom dit niet werkt en de oplossing dan wel 

10 antwoorden

Gesponsorde links
Offline Joost - 21/06/2013 10:23 (laatste wijziging 21/06/2013 10:23)
Avatar van Joost PHP expert DB::cxn() geeft een MySQLi object terug en geen object van het type DB, dus als je daar een methode query aan toevoegt zal er niks gebeuren. Je zult dan MYSQLi moeten extenden:

  1. class MyMyMSQLi extends MySQLi {
  2.  
  3. public function query(string){
  4. echo $string;
  5. parent($string);
  6. }
  7. }


Waarom gebruik je eigenlijk niet gewoon PDO?
Offline Koen - 21/06/2013 10:26
Avatar van Koen PHP expert De connection method cxn() die je gebruikt, werkt volgens het singleton patroon en geeft een instantie van de mysqli class terug. Je roept dus de method "query" aan van het mysqli object, en niet die van je database class.

Probeer de volgende code eens.
  1. class DB {
  2. private static $mysqli;
  3. private function __construct(){} //no instantiation
  4.  
  5. static function cxn() {
  6. if( !self::$mysqli ) {
  7. self::$mysqli = new mysqli("localhost", MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);
  8. }
  9. return self::$mysqli;
  10. }
  11.  
  12. public static function query($query) {
  13. if(!...) { // hier doe je dan bijvoorbeeld checks op je query, variabelen preparen, you name it.
  14. throw new InvalidArgumentException("Query was not valid");
  15. }
  16. return self::$mysqli->query($query);
  17. }
  18. }
  19.  
  20. // dan kan je gewoon dit doen:
  21. DB::query($query);

(niet getest...)

Op die manier pas je dus een vorm van het adapter pattern toe. Je wikkelt je eigen klasse rond een mysqli object.

In dit geval wordt cxn() eigenlijk alleen maar intern gebruikt, dus je kan er voor kiezen om deze niet publiek beschikbaar te maken door deze method de private access modifier mee te geven.
Bedankt door: Martijn
Offline Martijn - 21/06/2013 10:35 (laatste wijziging 21/06/2013 10:51)
Avatar van Martijn Crew PHP Omdat ik tegenkwam dat ik de mysql functies moest vervangen door of mysqli of PDO. En ik heb de eerste aangeklikt 

Edit: Ik snap geen reet van de termen die Koen gaf, maar even inlezen (ik snap dat ik query nu kan gebruiken zoals ik kon met cnx(), maar verder niet zoveel)


Edit2: Waarom PDO? Ik zit er nu even naar te kijken en ik zie alleen maar een andere manier van opschrijven. Wat is het voordeel/nadeel tov mysqli? PDO vs Mysqli - Which should you use
Offline WouterJ - 21/06/2013 11:03
Avatar van WouterJ HTML gevorderde Singletons betekend dat je iets maar 1 keer aanmaakt en het daarna niet meer opnieuw kan aanmaken. Dat wil je niet in je applicatie, dan kun je niet testen en singletons zijn gewoon een anti-pattern.

Wat je veel beter kunt doen is bijv. Dependency Injection gebruiken.
Ook zou ik inderdaad het adapter pattern toepassen, zoals Koen al aangaf.

MySQLi is slechts een wrapper van MySQL, PDO is een hele nieuwe extensie. Waarom ik PDO zou gebruiken:
- MySQL kan alleen met een MySQL database werken, PDO kan met heel veel verschillende databases werken (bijv. sqlite, ect.). Allemaal hebben ze de zelfde interfaces, waardoor je makkelijk van database type kan switchen (bijv. sqlite voor testen en mysql voor productie)
- PDO heeft een beter prepared statement systeem


Nu plaats ik, helaas voor jullie, vaak grote uitleg en code voorbeelden op de site van jullie concurrentie. Maar toch ga ik hier wat nuttige linkjes neerzetten, omdat dit ook de manier is hoe ik OO heb geleerd:
Datamapper pattern
- http://phphulp..../1/#606620
- http://phphulp....54/#580025

Adapter pattern
- http://phphulp....6//#602127
- http://phphulp..../2/#591034

Dependency Injection (aka service container)
- http://phphulp....13/#610232
- http://phphulp....-oop/84167
- http://phphulp....ection/760/

Nog wat andere tips:
- Leer veel over design patterns, daardoor test en leer je je oo gedachtengang. Een echte aanrader is het boek "Head First Design Patterns"
- Gebruik third-party libraries. In dit geval zou ik niet zelf een database klasse maken, maar bijv. gewoon Doctrine2 DBAL gebruiken. Gebruik Composer om deze third-party libraries makkelijk te kunnen beheren
Bedankt door: Martijn
Offline Martijn - 21/06/2013 11:18
Avatar van Martijn Crew PHP Oke, bedankt voor de info allemaal. Ik merk dat het grote voordeel van PDO is dat het kan schakelen naar andere databasetypes, dit zie ik niet gebeuren in onze systemen, in ieder geval niet in een toekomst waar ik me nu al mee bezig moet gaan houden.

Op dit moment is mn class kennis erg laag en dusver 'lees' ik de mysqli structuur makkelijker waardoor ik sneller door kan (en tijd=geld ).

De kern van de sites waar ik aan werk is gebaseerd op register_globals = 1, dat moet ik ook deze ronde allemaal goed gaan zetten, dus ik heb al een berg werken en testen voor me.

Ik ga eerst langzaam inkomen in classes met mysqli op zn OO's, en wie weet schakel ik een keer over 
Offline WouterJ - 21/06/2013 13:59
Avatar van WouterJ HTML gevorderde Merk op dat classes niet OO is en dat het gebruik van MySQLi helemaal nog niks met OO te maken heeft.

Dat gezegd hebbende, waar OO wil omdraait is doormiddel van best practises en principes je code zo flexibel mogelijk te maken. Dat houdt onder andere in dat je met max. 10 regel te bewerken moet kunnen switchen van database, systeem gebruik, ect.
Offline Martijn2008 - 21/06/2013 22:31 (laatste wijziging 21/06/2013 22:42)
Avatar van Martijn2008 PHP beginner Om even in te haken op je tijd=geld aspect... Je kunt natuurlijk ook gebruik maken van een framework, bijvoorbeeld Symfony2.
Daarmee zorg je voor
1. Meer structuur in je code
2. Verminder je programmeerrisico's (doordat je het wiel niet opnieuw uit hoeft te vinden)
3. Sneller bouwen van de website
Ook ben je verzekerd van framework updates en een actieve community. Kortom, meer zekerheid.

In Symfony2 zit standaard Doctrine2, dat is een Object Relational Mapping (ORM) library/tool. Kort gezegd, kun je met Doctrine2 snel door middel van objecten in je code communiceren met de database.
Ik heb het ook gebruikt, op aanraden van WouterJ, het is goed bevallen en echt super handig. Sindsdien bouw ik al mijn PHP projecten met Symfony2.

Overigens, deze topic sluit volgens mij goed aan bij je vraag, daarom is het misschien waardevol om even te lezen.

WouterJ schreef:
...
Nu plaats ik, helaas voor jullie, vaak grote uitleg en code voorbeelden op de site van jullie concurrentie. Maar toch ga ik hier wat nuttige linkjes neerzetten, omdat dit ook de manier is hoe ik OO heb geleerd:
...


Haha, vet cool die UML diagrammetjes. Hoe heb je die gemaakt? Kan dat op Sima ook?


Offline WouterJ - 21/06/2013 23:34
Avatar van WouterJ HTML gevorderde >> Haha, vet cool die UML diagrammetjes. Hoe heb je die gemaakt? Kan dat op Sima ook?
't is gewoon code, dus ja dat kan hier ook (al verpest een bug in de syntax highlighter het waarschijnlijk wel)

En hoe het gemaakt is? Gewoon in kladblok of je favoriete editor. Zelf heb ik het gemaakt in Vim, mijn editor, icm de block select feature (om de blocks naast elkaar te krijgen) en Tabular.vim (om snel alles goed uit te lijnen)
Offline Martijn2008 - 21/06/2013 23:53 (laatste wijziging 21/06/2013 23:54)
Avatar van Martijn2008 PHP beginner Wow, ik wist niet dat het daarmee kon. Welke OS gebruik je eigenlijk?
Ik gebruik Windows (standaard) en als vm een linux distro Ubuntu.
Offline Martijn - 24/06/2013 09:12 (laatste wijziging 24/06/2013 09:12)
Avatar van Martijn Crew PHP Again, bedankt allemaal. Ik begrijp de voordelen die worden opgenoemd, maar ook deze zijn slecht toepasbaar op het CMS waar ik mee werk. Het CMS is gemaakt door mn werkgever, en om het te omschrijven, die programmeert php4 en het is oud dus alles is producueel en oldSkool. De meeste scripts zijn niet geschikt voor aanpassingen op dit niveau, ik ben het langzaam aan het ombouwen (redelijk succesvol trouwens). Maar aangezien een klant maar betaald voor X tijd, moet ik daarin de site bouwen, en hier en daar beetje updaten, dus het is neit het snelste in de wereld
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.226s