Klassen-Fehler, obwohl initialisiert.

Moin.
Also ich baue gerade einen Admin-Bereich für meine Community auf, die allerdings noch offline erarbeitet wird. Ich habe eine SQL-Klasse definiert, die mir die Arbeit erleichtern soll und dazu noch ein paar Funktionen für den Login. Das ganze ist wie bei vielen Foren in einer seperaten Datei gespeichert, damit alles direkt eingebunden werden kann. Allerdings ergeben sich Schwierigkeiten bei den Login Funktionen, da die Funktionen anscheinend die globale Klassen-Variable $DB (in der die Klasse initialisiert wurde) aussschließen und somit nicht direkt auf die DB zugreifen können.

Da der Text ein wenig verwirrend ist, werde ich das direkt durch Code zum Ausdruck bringen. Zuerst die Datei, wo alle Funktionen eingebunden und alle Klassen initialisiert werdern.

admin.php:
[php]<?php

//Classes
include(‚…/class/sql.class.php‘);

//Connection
include(‚…/php/dbcon.php‘);

//Functions
[…]
include(‚…/fnc/functions.login.php‘);

if ( !LoggedIn() )
{
header(„Location: …/index.php“);
}

?>[/php]

Nun die dbcon.php:
[php]<?php

$DB = new SQL(„localhost“,„NetzSchleicher“,„****“,„kappalife“);
define(„DB_CON“,„1“);

[Andere Konstanten für Tabellennamen]

?>[/php]

Abschließend noch die LoggedIn()-Funktion:
[php]<?php

[…]

function Loggedin()
{
$Stat_Stream = $DB->SelectOne(„SELECT * FROM „. USERS_TABLE .“ WHERE OldSession='“.session_id().„'“);
if ( $Stat_Stream[‚Status‘] == „1“ )
{
return true;
}
else
{
return false;
}
}

[…]

?>[/php]

Nur was ich nicht verstehe ist, obwohl die Funktion und das Object ($DB) vorhanden sind, ist diese Fehlermeldung:

Line 33 ist die Zeile in der Funktion LoggedIn(), die mit $Stat_Stream beginnt.

Hallo,

ich verstehe zwar wo das Problem ist, blicke aber nicht ganz durch Deinen Source.

Wo wird das Objekt der Datenbank instantiiert und wie wird dieses weiter verwendet?!

Würde es begrüßen, wenn Du mal den Source der Klasse posten kannst, sodass man eine Chance hat den Zusammenhang zu erfoschen.

Gruss Sven

Also, die Klasse wird in der dbcon.php initialisiert, die immer zuerst vor HTML eingebunden wird. Erst wird per include() die Klasse eingebunden und danach die Initialisierungsdatei, damit die Klasse gefunden wird. Nach dem Einbinden der Initialisierungsdatei folgen die Funktionen, also müsste es auch innerhalb der Funktionen initialisiert sein, ist sie aber nicht: Hier der Code der Klasse:

[php]<?php

/* SQL Class By Kappa Life */

class SQL {
private $Result;
private $Row;
private $Rows = array();
private $Count;

     //Contructor and Destructor
     public function __construct($Host, $User, $Pass, $Data)
     	{
             $Con_Stream = mysql_connect($Host, $User, $Pass);
             if ( $Con_Stream )
              {
              $DB_Stream = mysql_select_db($Data);
              if ( $DB_Stream )
               {
               return true;
               }
              else
               {
               die(mysql_error());
               }
              }
             else
              {
              die(mysql_error());
              }
             }

     public function __destruct()
     	{
             if ( $Con_Stream )
              {
              mysql_close($Con_Stream);
              }
             }

     //Select Functions
     public function SelectOne($Query)
     	{
             if ( $this->Result = mysql_query($Query) )
              {
              while ( $this->Row = mysql_fetch_assoc ($this->Result) )
               {
               return $this->Row;
               }
              }
             else
              {
              die(mysql_error());
              }
             }

     public function SelectArray($Query)
     	{
             if ( $this->Result = mysql_query($Query) )
              {
              while ( $this->Row = mysql_fetch_assoc ($this->Result) )
               {
               $this->Rows[] = $this->Row;
               }
              return $this->Rows;
              }
             else
              {
              die(mysql_error());
              }
             }

     //Query Function
     public function Query($Query)
     	{
             if ( mysql_query($Query) )
              {
              return true;
              }
             else
              {
              die(mysql_error());
              }
             }

     //Count Function
     public function Count($Query)
     	{
             if ( $this->Result = mysql_query($Query) )
              {
              $this->Count = mysql_num_rows($this->Result);
              return $this->Count;
              }
             else
              {
              die(mysql_error());
              }
             }

     }

?>[/php]

Fatal error: Calling a member function SelectOne() on a non-object in C:\xampp\htdocs\kappalife\fnc\functions.login.php on line 33.

Für diesen Fehler kann es zwei gründe geben:

  1. In der Variable $DB liegt kein Objekt. Du hast also nie $DB = new SQL… ausgerufen.

  2. …oder $DB ist ganz einfach nicht in der Methode sichtbar. Das heißt du müsstest sie global machen (unsauber würde ich von abraten). Oder du übergibst sie der funktion. Da wäre es vll auch angebracht sie in form einer Referenz zu übergeben (pass by reference) da sonst eine kopie des Objekts erstellt wird was sicher nicht in deinem sinn ist.

[PHP]$DB = new SQL(„localhost“,„NetzSchleicher“,„****“,„kappalife“);[/PHP]

Damit fällt diese Aussage weg.

Ich denke auch, dass das Objekt nicht sichtbar ist.

Aha, Ich blicke zwar im Code auf PHP.net durch, habe mir auch alles mehrmals durchgelesen, aber leider kann ich daraus keine Lösung für mein Problem ziehen :frowning:

Du musst deiner LoggidIn Funktion (und allen anderen funktionen die $DB verwenden) einen parameter übergeben der die DB Verbindung enthält da sie in der Funktion nicht sichtbar ist.
Das sieht dann so aus:
[PHP]function Loggedin(&$DBConnection)
{
$Stat_Stream = $DBConnection->SelectOne(„SELECT * FROM „. USERS_TABLE .“ WHERE OldSession='“.session_id().„'“);
if ( $Stat_Stream[‚Status‘] == „1“ )
{
return true;
}
else
{
return false;
}
}[/PHP]

Ein aufruf würde dann so aussehen:
[PHP]$Object->Loggedin($DB);[/PHP]

Also theorethisch in jeder Funktion noch den zusaätzlichen Parameter $DB übergeben und dann per $DB->LoggedIn($DB) aufrufen oder verstehe ich da was falsch?

Ja genau, du musst $DB als Parameter übergeben.

Ok, dann wäre das ja geklärt.