Avatar billede getaway Nybegynder
28. oktober 2003 - 17:05 Der er 8 kommentarer og
1 løsning

Fatal error: Call to a member function on a non-object

Hej derude...

Efter at have kigget tomt på min kode og drukket Lille Lise kakomælk i et par dage, ser jeg mig nødsaget til at søge hjælp her.
Jeg vil gerne kalde funktion X i klasse A fra funktion Y i klasse B, men hver gang jeg prøver får jeg følgende fejl: "Fatal error: Call to a member function on a non-object in D:\Projects\1337kr3w\htdocs\1337kr3w\classes\admin.php".
Fejlen sker i linjen "$error->add("Incorrect username/password.");"
Nedenunder er min kode til classes\admin.php


** classes\admin.php **
<?

class admin {
   
    // declaration of the variables
    var $dbhost,
        $dbuser,
        $dbpass,
        $dbname;
   
    function admin()
    { // adds misc values to the variables
   
        $this->dbtable="users";
       
        if ($_SERVER["SERVER_NAME"] == "frac.dk")
        {
            $this->dbhost="localhost";
            $this->dbuser="2k3";
            $this->dbpass="glemdet :)";
            $this->dbname="2k3";
        } else {
            $this->dbhost="localhost";
            $this->dbuser="root";
            $this->dbpass=""; // kald lige det et sikkerhedshul 2 gange
            $this->dbname="test";
        }
       
    } // end admin
   
    function check()
    { // checks if the user is already logged in
       
        if (isset($_SESSION['loggedin']))
        {
            return 1;
        } else {
            return 0;
        }
       
    } // end check
   
    function login(&$usr, &$pwd)
    {
       
        // Connect to database 
        if (!(mysql_connect($this->dbhost, $this->dbuser, $this->dbpass))) die("Could not connect to database. " . mysql_error());
       
        // Select database
        mysql_select_db($this->dbname);
       
        // Get data
        $result = mysql_query("SELECT * FROM $this->dbtable WHERE password = \"".md5($pwd)."\" AND username = \"".$usr."\"");
       
        // Test to make sure query worked
        if (!$result)
        {
            die("Query didn't work. " . mysql_error());
        } else {
            $data=mysql_fetch_object($result);
        }
       
        // verify that the user exists
        if (!($data->username))
        {
            $error->add("Incorrect username/password.");
        } else {
            $_SESSION['loggedin'] = $data->username;
            $_SESSION['uid'] = $data->id;
            $_SESSION['userdata'] = $data->data;
            $_SESSION['userlevel'] = $data->userlevel;
           
            echo "You're now logged in, ".$data->username.".<br>\n";
        }
       
        // Close database connection
        mysql_close(mysql_connect($this->dbhost, $this->dbuser, $this->dbpass));
       
    } // end login
   
    function logout()
    {
       
        if (isset($_SESSION['loggedin']))
        {
            session_destroy(); // plain and simple, destroys the session with the ID corresponding to the ID of the visitor
        }
       
    } // end logout
   
} // class admin end
   
?>
** classes\admin.php **

Med venlig hilsen (og gråd i stemmen)

Rune
Avatar billede getaway Nybegynder
28. oktober 2003 - 17:06 #1
Inden andre fortæller mig det, er det nok værd at vide at $error->add ligger i classes\error.php, og at begge klasser (error og admin) bliver inkluderet i index.php.
Avatar billede erikjacobsen Ekspert
28. oktober 2003 - 17:15 #2
Måske

function login(&$usr, &$pwd)
{
  global $error;


forudsat du er sikker på at have et globalt objekt med navn $error....
Avatar billede getaway Nybegynder
28. oktober 2003 - 17:31 #3
erikjacobsen - du er er knag :)
Det virkede lige med det samme. Er det den eneste måde at gøre det på? For det betyder jo at hver gang jeg skal bruge en funktion fra en anden klasse end den jeg er i, skal jeg lige med global. Kan man ikke undgå det?

Men i hvert fald, mange tak. Kommer du med et svar?
Avatar billede fangel Nybegynder
28. oktober 2003 - 17:51 #4
du kan jo overføre det med parametre, og via referancer ændre i denne - men måske ikke det mest optimale...

og thumbs up for kakao'en... det er enhver yngligsdrik...

Morten
Avatar billede erikjacobsen Ekspert
28. oktober 2003 - 18:37 #5
Jah, det er jo umiddelbart lidt rodet at kræve eksistensen af et
bestemt objekt for at noget kan fungere. Det er en metode i et
objekt du kalder, ikke i en klasse.

Du kan dog med fordel studere det berømte Singleton-pattern !
Avatar billede erikjacobsen Ekspert
28. oktober 2003 - 18:38 #6
Avatar billede getaway Nybegynder
28. oktober 2003 - 19:01 #7
Okay, det vil jeg kigge nærmere på. Tak igen.
Avatar billede erikjacobsen Ekspert
28. oktober 2003 - 19:05 #8
....fortæl hvad der sker. Jeg kiggede lidt på artiklen og synes der
måske er lidt galt i deres php-kode. Og måske ikke ... det skal vel bare prøves.
Ellers vend tilbage her.
Avatar billede getaway Nybegynder
08. september 2004 - 13:22 #9
Nå, havde helt glemt det :D
Lukker det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester