Database selecteren?

  • Beste Ictscripters,
    Ik heb een file genaamd "config.php", en ik heb nog een file "login.php".
    In config.php wordt er een connectie gemaakt met de database.
    (Ik voer die connectie uit met een class).
    Ik heb in login.php ook een class, die class extends ik met de config class.
    Ik require vanuit login.php het bestand config.php.
    Dan haal ik me database uit config en de connectie ook maar ik krijg constant op mijn scherm:
    mysqli_select_db() expects parameter 1 to be mysqli, null given in


    Hij geeft constant aan dat het null is.
    Weet iemand hoe ik dit kan oplossen?


    connection.php



    config.php


    login.php



  • mysqli is opgebouwd in oop style dus hier kan je direct gebruik van maken zonder dat zelf een class voor te bouwen.

    Er valt weliswaar inderdaad iets voor te zeggen om van de OOP variant van mysqli gebruik te maken, maar dat neemt niet weg dat het handig kan zijn om een (eenvoudige) wrapper om de mysqli class zelf te bouwen, dit kan je het werk nog makkelijker maken.


    @futur3 wellicht is het handig om een aantal misverstanden op te helderen.


    Allereerst heb je bij mysqli, in tegenstelling tot de oorspronkelijke mysql-functies, de mogelijkheid om direct een database te selecteren op hetzelfde moment als het maken van een connectie, bij de originele mysql-extensie had je hier twee functies voor nodig (mysql_connect() en mysql_select_db()). Dit doe je ook op regel 9 van je eerste codefragment (4e parameter bevat de naam van de database). Dit hoef je dus niet nogmaals te doen in login.php.


    Als je toch een rechtvaardiging hebt om het selecteren van een database uit te stellen zul je eerst de 4e parameter uit de aanroep van mysqli_connect() in connection.php moeten verwijderen. Daarbij is het dus wellicht nog beter om helemaal over te stappen naar de OOP variant van mysqli. Vervolgens zou je de getInfo() methode in login.php moeten uitbreiden met een aanroep van de connect() methode uit de parent class voordat je een database selecteert, anders bestaat $this->con simpelweg niet! Dit had je waarschijnlijk direct kunnen constateren als je het melden + weergeven van fouten had aangezet voor ontwikkeling. Dit soort instellingen verdienen zeker een plaats in je configuratie...


    Daarnaast de volgende observatie: een "login" class is geen logisch voortborduursel van een "database" class als je het mij vraagt. Een "login" class zou hooguit gebruik moeten maken van een "database" class. Dit zou je ook kunnen bereiken door een instantie van een database-class-object door te geven aan de login class op het moment van creatie. Je geeft daarmee dus in feite de login class al het gereedschap om acties die gerelateerd zijn aan het in- en uitloggen uit te kunnen voeren. Maar een login class is iets heel anders dan een database class, dus het ene in het verlengde plaatsen van het ander is nogal vreemd.


    Tot slot is de configuratie-functionaliteit enkel bedoeld om op een eenduidige manier instellingen vast te leggen (of zou dit moeten zijn). Het staat dus ter discussie of het ook de taak van configuratie-functionaliteit is om (direct, dan en daar) een database connectie te maken. Als je dit dan toch doet loont het wellicht de moeite om dit database-object weer onder te brengen onder een aparte configuratie-variabele of -array die (referenties van) objecten of (handles van) resources bevat. Op die manier zou je ook via een "getter methode" de referentie naar je database-object uit je configuratie-variabelen kunnen trekken.


    Doorgaans hebben klassen één duidelijk omschreven set taken/verantwoordelijkheden. Als je dingen gaat doen die hier (erg) van afwijken (niet echt passen in de set) is dat een signaal dat je wellicht een of meer aparte klassen mist en/of dat er een kronkel zit in je ontwerp.

  • @futur3 zo zou ik het oplossen:

    Verder zie ik dat je de variabele $con niet hebt gedefinieerd als zijnde een public, private of protected variabele.

  • MOnkNL : Verder zie ik dat je de variabele $con niet hebt gedefinieerd als zijnde een public, private of protected variabele.


    Klopt ik heb niet 100% mijn hele code laten zien maar wel de belangrijkste dingen waar het in mis gaat, ik ben het vergeten om het er bij te zetten.


    FangorN en MOnkNL, ik wil jullie bedanken want ik zie de fout, en bedankt voor de tips over mijn code, hiermee kan ik mijn code verbeteren.


    Ik zal mijn code(s) ook herschrijven.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!