Hallo miteinander!
Ich bin gerade dabei, mir Klassen für den Datenbankzugriff auf MySql zu basteln.
Die Struktur sieht wie folgt aus (vereinfacht):
- Klasse "Database"
-- Member "resource"
-- Funktion "__construct"
-- Funktion "query" - Klasse "Query"
-- Funktion "__construct"
-- Funktion "fetch"
Ich erstelle eine neue Datenbank, indem ich die Klasse "Database" instanziere:
$db = new Database("localhost", "root", "***", "datenbank");
Der Konstruktor der Klasse verbindet zur Datenbank und legt die Verbindungskennung im Member "resource" ab:
// Connect to MySql server
$this->resource = @mysql_connect($_host, $_user, $_password);
if(!$this->resource)
throw new SqlException("Connection failed");
// Select database
if(!@mysql_select_db($_database, $this->resource))
throw new SqlException("Database selection failed");
Ich habe nun also eine Verbindung zur Datenbank und die Verbindungskennung gespeichert.
Nun will ich ein neues Query absetzen, das ganze funktioniert so:
$query = $db->query("SELECT * FROM test");
Die Funktion "query" erstellt ein neues Objekt vom Typ "Query" und übergibt dabei den Querystring und die Verbindungskennung:
return new Query($_query, $this->resource);
Im Konstruktor von "Query" wird dieses direkt ausgeführt:
// Execute query
$this->query = @mysql_query($_query, $_resource);
// Throw exception if query was not successful
if($this->query == null) throw new SqlException("Query failed", $_query);
Allerdings ist $_resource innerhalb dieser Funktion keine gültige Verbindungskennung und führt zu einem Fehler. Bei Verwendung innerhalb der Klasse "Database" gibt es keine Probleme. Erst wenn die Verbindungskennung an das neue "Query" Objekt übergeben wird. Auch die Übergabe als Referenz hat nichts daran geändert.
Führe ich var_dump() für den Member "resource" aus, so bekomme ich innerhalb der Klasse "Database" folgende Ausgabe:
resource(9) of type (mysql link)
resource(9) of type (mysql link)
In der Klasse "Query" gibt das selbe folgende Ausgabe:
resource(9) of type (mysql link)
NULL
Ich weiß nicht mehr was ich noch versuchen soll, kann man diese Verbindungskennung etwa nicht übergeben? Ich würde dies nämlich gerne so machen, dass später auch einmal zwei Datenbanken parallel eingesetzt werden können.
Vielleicht hatte ja schonmal jemand das selbe Problem oder erkennt beim ersten Blick woran es liegt ;)
Danke schonmal für die Mühe!
Schöne Grüße,
Matthias