not a valid MySQL result wenn DB-Abfrage in Klasse

  • Themenstarter Themenstarter sebhof
  • Beginndatum Beginndatum
S

sebhof

Hallo Leute!

Habe ein Problem, das mich umtreibt :-)


class mainMenu {

function mainMenu(){
}

function getMenu(){
$query = "SELECT icon, titel FROM hm_eintrag";
mysql_connect($host, $user, $pass);
mysql_select_db($db);
$result = mysql_query($query);
while($obj = mysql_fetch_object($result))
{
print "$obj->icon, $obj->icon";
}
mysql_close();
}

}

Die Zugangsdaten für MySQL kommen aus einer require-Datei...

Aufruf der Methode über:
$mainMenu = new mainMenu(); $mainMenu -> getMenu();

Das Ergebnis der Abfrage ist folgender Fehler:
Warning: Supplied argument is not a valid MySQL result resource

Wenn ich die Objektorientierung mal über den Haufen werfe und direkt an der Stelle im Skript den Inhalt der Methode getMenu() ausführe, klappts einwandfrei...

Hat jemand ne Ahnung, woran das liegen könnt?
Danke
sebhof
 
Original geschrieben von sebhof
Die Zugangsdaten für MySQL kommen aus einer require-Datei...

wo require'st du diese Datei? Eine Klasse kennt nur Variablen, die in ihr definiert wurden, oder ihr übergeben wurden (genau wie eine Funktion).
Wenn du also eine Datei in das Script einbindest, in dem du auch die Klasse initialisierst, heißt das noch nicht, das die Klasse auch dort definierte Variablen kennt.
Du müsstest die require Datei schon direkt innerhalb der Klasse referenzieren (und das solltest du niemals tun :-)), oder die entsprechenden Vars der Klasse beim Instanzieren übergeben.
 
Danke zunächst...

Hab mittlerweile auch rausgefunden, dass es an der require liegt.
Wie kann ich denn sinnvoll auf Objekte zugreifen, die in einem andrern File gespeichert sind?

Hab schon probiert, ne Referenz als Klassenvariable anzulegen und im Konstruktor das require zu machen und dann das Objekt zu instanziieren. Das scheint soweit geklappt zu haben, aber ich konnte dann nicht auf die Methoden zugreifen...

z.B. so:

class eins{

var $ref;

function eins(){
require "zwei.php"; //dort wäre dann class zwei
$this->ref = new zwei();
}

function irgendwas(){
$this->ref->irgendwasanderes();
}

}

Dat klappt so irgendwie nich... :-(
 
Ich weiß nicht, ob ich ganz verstanden habe, was du willst. Eine Klasse kann aber Eigenschaften und Methoden von einer anderen Klasse 'erben'.
Zunächst einmal solltest du innerhalb einer Klasse keine requires oder includes benutzen. Eine Klasse sollte Variablen nur über Methoden erhalten (und zurückgeben) können. Du solltest auch keine globalen Variablen in einer Klasse deklarieren (obwohl PHP das zulassen würde). Versuche, die Schnittstellen mit der 'Außenwelt', d.h. anderen Scripten, so eng wie möglich zu halten.
Betrachten wir eine Klasse:
PHP:
class foo {
  var $foo = "foo";

  function machwas() {
    return $this->foo;
  }

}

$foo = new foo();
echo $foo->machwas();
Wir erhalten 'foo' zurück.
Wollen wir die Variable ändern, benutzen wir dazu eine neu Methode:
PHP:
class foo {
  var $foo = "foo";
  
  function gibmirwas($wert) {
    $this->foo = $wert;
  }

  function machwas() {
    return $this->foo;
  }

}

$foo = new foo();
$foo->gibmirwas('bar');
echo $foo->machwas();
Wir erhalten 'bar' zurück.

Nun zur Vererbung:
Ein Klasse kann die Eigenschaften und Methoden einer anderen Klasse erben:
PHP:
class foo {
  var $foo = "foo";

  function machwas() {
    return $this->foo;
  }

}

class bar extends foo {
  
  function dummy() {
    return "ich bin ein dummy";
  }
}

$foo = new foo();
$bar = new bar();

echo $bar->machwas();
Gibt 'foo' zurück, bar hat die Eigenschaft $foo und die Methode machwas() geerbt (durch das extends), und so Zugriff darauf.

Das klappt auch, wenn beiden Klassen in seperaten Dateien abgelegt sind und in einer dritten Datei instanziert werden.
 
Hab mich wahrscheinlich wieder verkorkst ausgedrückt :-) Die Sache mit der Vererbung ist interessant - leider klappt das bei mir nicht, wenn die Klassen in unterschiedlichen Dateien sind (die aber im selben Verzeichnis liegen).

Was ich grundsätzlich wissen wollte, ist wie man mit unterschiedlichen Dateien hantiert. Ich bin es von Java gewöhnt, in einer beliebigen Klasse ein Objekt einer beliebigen anderen Klasse zu erzeugen und zu benutzen. Da ist das ja eh kein Problem, da die Datei i.d.R. nur eine Klasse enthält und auch so heißt - sprich das Programm findet dieses Klasse.

In PHP klappt das aber nicht so... Ich beschäftige mich jetzt erstmalig mit objektorientiertem PHP und möchte das Ganze halt jetzt auch so modular wie möglich bauen - in diesem konkreten Fall wollte ich eine KLasse zur DB-Verbindung schreiben und diese in einer separaten Datei ablegen, da man sowas ja immer wieder benötigt. In anderen Datein sollen dann weitere Scripte laufen, die eben diese DB-Klasse verwenden...

Aber irgendwie stell ich mich zu blöd an - bislang läuft das nur, wenn alles in einer Datei gespeichert ist...
Ist das vielleicht auch ne PHP-Konfigurationssache, dass er ggf. alle Dateien im Verzeichnis durchsucht, ob er da die richtige Klasse findet?
Oder muss ich eine Referenz auf die DB-Klasse beim Instanziieren der anderen KLasse im Konstruktor übergeben?
So in der Art:
PHP:
 $db = new db();
 $dings = new dings($db); //um in dings die db-Methoden zu nutzen?
 
Äh, du musst die Datei mit der Klasse schon includen, damit das Script sie kennt...

PHP:
include("hier_steht_meine_klasse_drin.php");
$dings = new meine_klasse();

$dings->eine_methode_aus_der_klasse();
 
Schon klar... Hab das jetzt auch mal probiert - und so funktioniert es jetzt

Habe drei Dateien - Datei eins ist mein Hauptprogramm, Datei zwei enthält die Klasse für den DB-Zugriff und Datei drei enthält eine Klasse, die vom Hauptprogramm benutzt wird und selber die DB-KLasse nutzt. Das Ganze sieht dann folgendermaßen aus:
PHP:
//Hauptprogramm - Datei eins.php
require "zwei.php";
require "drei.php";

$zwei = new zwei();
$drei = new drei($zwei);

$menu = $drei->getMenu(); //diese Methode nutzt das DB-Objekt

Danke Dir für Deine Hilfe...
 
Zurück