"class test extends db" funktioniert nicht

schleckerbeck

Erfahrenes Mitglied
Hallo,

ich habe ein Problem mit einer DB Klasse:
Die Klasse DB stellt die Verbindung zur Datenbank her, und bietet Funktionen zur Abfrage von Tabellen.
Nun möchte ich in der Klasse test per extends auf die DB Klasse zugreifen. Doch leider bricht er mir hier die Datenbankverbindung ab.
Hier mal die beiden Klassen:
PHP:
class db {
    function db($dbhost, $dbuser, $dbpass, $dbname) {
        $db = @ mysql_connect($dbhost,$dbuser,$dbpass);
        if (!$db)
        {
            echo("Datenbank nicht gefunden!");
        }
        mysql_select_db($dbname,$db);
    }
    
    // Select Funktion
    // ===============
    function select($arg) {
        $sql=mysql_query($arg);
        while($select=mysql_fetch_assoc($sql))
        {
            $s[] = (object) $select;
        }
        return $s;
    }
}

class test extends db {
     function hallo() {
       $arg=$this->select("Select * from test");
       return $arg;
     }
}

Und eingebunden werden sie so:
PHP:
$db=new db($dbhost, $dbuser, $dbpass, $dbname);
$t=new test();
Ich bekomme dann immer die Fehlermeldung, dass er die Datenbank nicht verbinden kann (echo("Datenbank nicht gefunden!");). Wenn ich die Klasse test nicht initialisiere, dann bekomm ich keine Fehlermeldung.

Was mach ich hier falsch? Wird die db klasse durch das extends zweimal aufgerufen, sodass er zweimal zur DB connecten will?

Hoffe mir kann jemand helfen.

Danke,
sc.
 
Und wie kann ich das umgehen?
Ich brauch die DB Klasse in den Skripten immer wieder, genauso wie die andere Klasse. Und es ist auch nicht im Sinne des Erfinders, dass ich in der Klasse test nochmal meine Funktionen zur Datenbank Abfrage reinschreibe, oder etwa nicht?

Danke,
sc.
 
du könntest die Datenbank klasse global machen, dann hast du immer nur eine instanz und kannst von wo du willst auf $db->select(...); zugreifen
 
Aha, das wär natürlich der beste Weg.
Glaub, ich steh jedoch aufm Schlauch. Wie mach ich denn die Klasse global verfügbar?
Hab trotz :google: und Forum Suche nix gefunden (oder bin ich einfach zu blöd? :confused:)

Danke,
sc.
 
ich hab nicht so ganz kapiert warum du new db machst und dann new test und text extended db? du machst die verbindung auf, dann erstellst du ein Objekt von test das aber keinerlei Anstalten macht eine DB Verbindung aufzubauen?!

new test()

und in test eine function test die als Konstruktor dient und intern die DB Verbindung instanziert indem sie $this->db(host, user, pass,db) aufruft?!

Nur so eine Idee
 
Naja, ich brauch halt auch die DB klasse außerhalb von anderen Klassen, also ganz normal im Skript. Deshalb mach ich ein $db=new db(blablabla);

Hab ich da nen Denkfehler drin, oder was mach ich falsch?
 
PHP:
class test extends db {
       function test($dbhost,$dbname,$dbuser,$dbpass){
       $this->db($dbhost,$dbname,$dbuser,$dbpass);
       }
     function hallo() {
       $arg=$this->select("Select * from test");
       return $arg;
     }
}

PHP:
$dbo = new test($dbhost,$dbname,$dbuser,$dbpass);

dann kann die test-Class doch auch alles was die db-Class kann ?!
$dbo->select(); kannst du doch ausserhalb nutzen, oder versuch dein Problem nochmal zu schildern ;)
 
Ich glaub ich hab mich zu undeutlich ausgedrückt.
Ich habe eine Datenbank Klasse, die ich im PHP Code per
PHP:
$db = new db(argumente...);
aufrufe, damit ich in allen meinen Komponenten etc.pp per
PHP:
$db->select("select * from test");
Abfragen machen kann. So weit so gut.
Doch ich brauch auch Datenbank Abfragen in anderen Klassen, so z.B. in der test Klasse. Also dachte ich mir, ich mache das ganze folgendermaßen:
PHP:
class test extends db {
     function hallo() {
     return $this->select("Select * from test");
     }
}

Doch leider bringt er mir dann immer, wie weiter oben schon erwähnt: Datenbank wurde nicht gefunden (o.ä.).

Ich bin jetzt noch auf etwas interessantes gestoßen. Wenn ich in der test Klasse einen Konstruktor einfüge (also function test()), egal ob der was macht oder nicht, dann funktioniert das ganze wunderbar.
Wüsste bloß gern, warum das so ist.

Danke für eure Hilfe, hoffentlich hat noch jemand ne Idee.

sc.
 
Zurück