Stephan: Call to undefined function: db_query()

Hallo,

ich möchte über eine DB - Connection auf eine DB zugreifen:

class db_connection
{
 var $host = "localhost";
 var $user = "web1";
 var $pass = "xyz";
 var $dbname = "usr_web1_1";
 var $db_link = false;

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

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);
 }

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

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:

include("inc_dbconnection.php");
$conn = new db_connection();

$angebotskats_query = "select name, untertitel from usr_web3_1.tbl_angebotskats";
$angebotskats_query1 = $conn-db_query($angebotskats_query);
$angebotskats = mysql_fetch_array($angebotskats_query1);

Das würde alles funktionieren wenn ich nicht auf eine andere DB zugreifen würde : usr_web3_1.tbl_angebotskats
Mache ich da irgendwas falsch oder darf man das einfach hier nicht? In der mysql konsole funktioniert der sqlstring ohne probleme, die grants sind auch gesetzt...

Irgendwelche Tipps??

Gruß
Stephan

  1. Huhu Stephan

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

    Irgendwelche Tipps??

    Das sieht nach einem kleinen Verschreiber aus,
    da fehlt noch das > zum ->

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Huhu Stephan

      Huhu Lulu!

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

      Irgendwelche Tipps??
      Das sieht nach einem kleinen Verschreiber aus,
      da fehlt noch das > zum ->

      Das ist echt der Hammer, danke! Das wars!
      Ist wohl doch schon zu spät für mich! ;-))

      Liebe Grüße
      Stephan

  2. 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>)
    1. 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.

      Hallo Sven,

      ich muss zu meiner entschuldigung sagen dass ich in php noch nicht
      so der profi bin wie du. Ich hab erst vor kurzem damit angefangen
      und es ist mir vollkommmen klar dass ich noch nicht den perfekten
      code schreibe.
      Für mich ist es in erster linie wichtig dass er funktioniert, aber
      trotzdem finde ich deine anregungen ganz interessant.

      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.

      Das ist grundsätzlich eine gute Idee. Nur finde ich dafür jetzt
      nicht den Ansatz. Dafür hab ich wohl noch zu wenig Ahnung von PHP.
      Aber es klingt vernünftig! Mal schauen vielleicht bekomme ich
      es ja irgendwie hin...

      Danke jedenfalls für deine Hilfe!

      Stephan