Sven Rautenberg: Call to undefined function: db_query()

Beitrag lesen

Moin!

Mal so ganz allgemein gesprochen: Du kapselst in deiner Klasse in meinen Augen _etwas zuviel_. Nicht jeder mysql-Befehl braucht aufgrund seiner Existenz sofort gleich eine eigene Methode.

Natürlich spricht nichts dagegen, für den klasseninternen Zugriff "private" Low-Level-Funktionen zu definieren, um dann mit höheren, öffentlichen Funktionen darauf zuzugreifen - aber selbst das tust du ja nicht.

function db_connection() //Konstruktor ruf db_connect() auf
 {
  $this->db_connect($this->host,$this->user,$this->pass,$this->dbname);
 }

Der Konstruktor geht noch in Ordnung. Kann ja noch was hinzukommen.

function db_connect($host,$user,$pass,$dbname) //baut die verbindung auf
 {
  $this->db_link = @mysql_pconnect($host,$user,$pass) or die ("Datenbankverbindung nicht möglich!");
  $this->db_choose($dbname);
 }

Wenn der Konstruktor in Ordnung geht, ist diese Funktion die logische Konsequenz darauf.

function db_choose($dbname) // wählt die datenbank
 {
  @mysql_select_db($dbname) or die ("Datenbank konnte nicht ausgewählt werden!");
 }

Aber _diese_ Funktion ist IMO sinnlos. Wenn du eine DB-Verbindung herstellst, wählst du eine Datenbank aus - also dort mysql_select_db() direkt aufrufen. Das deckt 99% aller Datenbankprobleme ab, weil man die DB selten wechselt. Und wenn du einen Query auf eine andere DB machst, wäre es vielleicht notwendig, dort die DB zu wechseln. Also eine Eigenschaft definieren, welche die aktuell ausgewählte DB speichert, und bei jedem Query die DB mitgeben - oder gleich mysql_db_query benutzen. :)

function db_query($query) // sendet einen query
 {
  $res = @mysql_query($query, $this->db_link) or die ("Abfrage war ungültig!".mysql_error());
  return $res;
 }
}

Soweit alles klar. Nun möchte ich die db_connect Klasse instantiieren:

$angebotskats_query1 = $conn-db_query($angebotskats_query);

Tippfehler. Hier ziehst du von der Variablen $conn das Ergebnis der Funktion db_query() ab. Und das führt zum Fehler.

Sagt ja auch schon die Fehlermeldung! Die Funktion db_query existiert nicht. Warum? Weil sie allgemein nicht existiert und du nicht die Methode der Klasse ansprichst.

$angebotskats = mysql_fetch_array($angebotskats_query1);

Ach ja: Wenn du alles in Klassen packst, was die mysql_*-Befehlsreihe so anbietet, dann gehört _dieser_ Befehl ebenfalls dort hinein.

Du solltest überlegen, dir eine Methode zu schreiben, der du einen SQL-String übergibst und von der du ein mehrdimensionales Array mit allen gefundenen Einträgen zurückerhälst. Alternativ schreibst du zwei Methoden, die den SQL-Query an die DB senden (Methode Nr.1) und dann eintragsweise die DB abfragen (Methode Nr.2). Alternativ _dazu_ schreibst du für den Sonderfall "nur eine Zeile Ergebnis erwartet" eine Methode, die das Ergebnis als eindimensionales Array (wie mysql_fetch_array()) zurückgibt.

- Sven Rautenberg

--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)