Ankündigung

Einklappen
Keine Ankündigung bisher.

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

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

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

    Hallo!

    Ich habe eine Webseite am lokalen Rechner programmiert und auch in dieser Umgebung mittels XAMPP (PHP5, MySQL5) getestet. Hat auch alles wunderbar funktioniert.

    Nun stellte ich die Seite online und siehe da, ich bekomme nach dem einloggen ständig obenstehende Fehlermeldung.

    Die PHP Version am Webserver ist 4.4.8.

    Die Seite ist recht simpel: Navigationsmenü, welches Titel der einzelenen Seiten aus der Datenbank in Links umwandelt, und Content Bereich, der den Inhalt aus der Datenbank anzeigt.

    Zudem kann man durch Einloggen die Seite administrieren (Seite hinzufügen, löschen, editieren...)

    Hier mal der Code der Index.php:

    PHP-Code:
    <?php
    session_start
    ();

    // SQLManager Class and basic functions like showContent, showMenu ...
    require("functions.php");

    // if you log out, end the actual session
    if($_GET['action'] && $_GET['action'] == "logout") {
        
    session_destroy();
    }

    // If there is no SQLManager object set in the session, create one
    // The SQLManager provides basic SQL functions and can be constructed with current login information,
    // that can be used throughout the development process after serializing and saving in a session.
    if(!isset($_SESSION['sql'])) {
        
    $sql = new SQLManager("xxx""localhost""xxx""xxx");
        
    $_SESSION['sql'] = serialize($sql);
    }


    // Login-code, checks the login-information
    if($_GET['action'] && $_GET['action'] == "login" && $_POST['login'] && $_POST['pass']) {
        
    $sql unserialize($_SESSION['sql']);
        
    $sql->connect();
        
        
    $query "SELECT * FROM users WHERE login = '".mysql_real_escape_string($_POST['login'])."'";
        
    $row $sql->getResult($query);
        
    $login $row->login;
        
    $pass $row->pass;
        
    $name $row->name;
        
    $surname $row->surname;
        
        if(
    md5($_POST['pass']) == $pass) {
            
    $_SESSION['rights'] = 1// Grant admin-rights
            
    $_SESSION['name'] = $name;
            
    $_SESSION['surname'] = $surname;
        } else {
            echo 
    "Login Incorrect!";
        }
    }

    ?>




    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <?php
    // Reloads Page after logout to provide an updated view after logout process
    if($_GET['action'] && $_GET['action'] == logout)
        echo 
    "<META HTTP-EQUIV=REFRESH CONTENT=\"0; URL=index.php\" />";
    ?>
    <title>Untitled Document</title>
    <link rel="stylesheet" type="text/css" href="layouts/layoutMain.css" />
    </head>


    <body>

    <div id="main">

        <!-- *** NAVIGATION MENU *** -->
        
        <ul id="navbar">
            <li><a href="?action=img">Bilder</a></li>
            <?php showMenu(); ?>
            <?php
            
    if($_SESSION['rights'] && $_SESSION['rights'] > 0) {
                echo 
    "<li><a href=\"?action=edit&id=".$_GET['id']."\">Seite editieren</a>";
                
    ?>
                <li><a href="?action=new">Neue Seite erstellen</a></li>
            <?php 
                
    echo "<li><a onclick=\"javascript:return confirm('Wirklich löschen?')\" 
                        href=\"?action=delete&id="
    .$_GET['id']."\">Seite löschen</a>";
            } 
    ?>
        </ul>
        
        
        
        <!-- *** LOGIN AREA *** -->
        
        <div id="login">
        <?php if(empty($_SESSION['rights']) || $_SESSION['rights'] < 1) { ?>
        <!-- Login Form -->
            <form method="post" action="index.php?action=login">
                <table border="0">
                    <tr>
                        <td>Login:</td>
                        <td><input type="text" name="login" size="17" maxlength="25" /></td>
                    </tr>
                    <tr>
                        <td>Password:</td>
                        <td><input type="password" name="pass" size="17" maxlength="25" /></td>
                    </tr>
                    <tr>
                        <td colspan="2" style="text-align:right;" ><input type="submit" name="sent" value="Login" /></td>
                    </tr>
                </table>
            </form>
        <?php } else {
            echo 
    "Willkommen, ".$_SESSION['name']." ".$_SESSION['surname']."<br />";
            echo 
    "<a href=\"?action=logout\">Logout</a>";
        }
        
    ?>
        </div>
        
        
        
        <img id="banner" src="images/banner.jpg" />
        
        
        
        <!-- *** MAIN CONTENT *** -->
        
        <div id="content">
            <?php 
            
    if($_GET['action'] && $_GET['action'] == "edit" && 
                    
    $_SESSION['rights'] && $_SESSION['rights'] > 0) {
                include(
    "edit.php");
            } elseif(
    $_GET['action'] && $_GET['action'] == "new" && 
                    
    $_SESSION['rights'] && $_SESSION['rights'] > 0) {
                include(
    "new.php");
            } elseif(
    $_GET['action'] && $_GET['action'] == "delete" && 
                    
    $_SESSION['rights'] && $_SESSION['rights'] > 0) {
                include(
    "delete.php");
            } elseif(
    $_GET['action'] && $_GET['action'] == "img") {
                include(
    "images.php");
            } else
                
    showContent();
            
    ?>
        </div>
    </div>
    </body>
    </html>
    Und noch die eingebundene functions.php teilweise:

    PHP-Code:
    class SQLManager
    {
        var 
    $host;
        var 
    $user;
        var 
    $pass;
        var 
    $database;
        var 
    $dp;
        var 
    $rp;
        var 
    $query "";
        
        function 
    SQLManager($database$host "localhost"$user "root"$pass "")
        {
            
    $this->host $host;
            
    $this->pass $pass;
            
    $this->user $user;
            
    $this->database $database;
        }
        
        function 
    connect()
        {
            
    $this->dp mysql_connect($this->host$this->user$this->pass);
            if(!
    $this->dp) die("Es konnte keine Verbindung zur Datenbank hergestellt werden!");
            
            
    mysql_select_db($this->database$this->dp);
        }
        
        function 
    getResult($query)
        {
            if(
    $this->query != $query) {
                
    $this->rp mysql_query($query$this->dp);
                
    $this->query $query;
            }
            
            
    $row mysql_fetch_object($this->rp);
            return 
    $row;
        }
        
        function 
    execute($query)
        {
            
    $this->rp mysql_query($query$this->dp);
            
    $this->query $query;
            return 
    mysql_affected_rows($this->dp);
        }
        
        function 
    close()
        {
            
    mysql_close($this->dp);
        }
        
        function 
    getDP()
        {
            return 
    $this->dp;
        }
    }



    function 
    showMenu()
    {
        
    $sql unserialize($_SESSION['sql']);
        
    $sql->connect();
        
        
    $query "SELECT * FROM pages ORDER BY datum ASC";
        while(
    $row $sql->getResult($query)) {
            echo 
    "<li><a href=\"?id=".$row->pid."\">".$row->title."</a></li>";
        }
        
        
    $sql->close();

    Der Fehler liegt angeblich in dieser Zeile in der Funktion showMenu():
    $sql = unserialize($_SESSION['sql']);
    ---> $sql->connect();

    Ich habe leider keine Ahnung warum er hier meint, kein Objekt vorzufinden, und auf meinem lokalen Rechner allerdings schon...

    Komisch ist auch, dass die Funktion showMenu() uneingeloggt zu funktionieren scheint, nur nachdem man sich einloggt, kommt diese Fehlermeldung.

    Vielleicht hat jemand von euch ja Erfahrungen mit dieser Problematik.

    Vielen Dank im Voraus!


  • #2
    Wie ist denn die genaue Fehlermeldung? Sehe keinen Fehler.
    Just took a stone and destroyed my windows...

    Kommentar


    • #3
      Fehlermeldung ist der Thread-Titel.
      PHP-Code:
      if ($var != 0) {
        
      $var 0;

      Kommentar


      • #4
        Hallo,
        wenn du Objekte in die Session ablegen moechtest, schau dir die magischen Methoden __sleep() und __wakeup() an und beachte, dass die Klasse eines Objektes in der Session VOR der Initialisierung der Session (konkret: session_start()) bekannt sein muss, andernfalls erhaeltst du nur ein totes Objekt (stdClass soweit ich weiss), dass zwar die Eigenschaften des Objektes aufweisst, nicht aber dessen Methoden (woher auch, wenn die Klasse nicht bekannt war, als die Daten aus der Session in eine PHP-Struktur umgesetzt wurde).

        Ich wuerde deshalb auch auf den manuellen Einsatz von serialize() verzichten.
        "Mein Name ist Lohse, ich kaufe hier ein."

        Kommentar


        • #5
          Ich verstehe diese Fehlermeldung wirklich nicht...

          Beim normalen Aufruf der Seite gibt es keine Probleme, hier wird aber auch schon die Methode $sql->showMenu aus functions.php aufgerufen - anscheinend ohne Probleme.

          Nach dem Einloggen allerdings, erzeugt genau diese Funktion beim Aufruf des Objekts Probleme... und um das Ganze zu toppen - der Fehler tritt natürlich nur am Webserver auf, nicht auf meinem lokalen Rechner...

          Ich bin verzweifelt... lol

          Kommentar


          • #6
            Ich sehe allerdings auch den Sinn nicht, die Verbindungsdaten in einer Session-Variablen abzulegen. Die sind ja konstant, also kannst du doch problemlos das Objekt nach dem Abschicken neu erstellen. Verbinden musst du ja so oder so neu.

            [edit]
            Zitat von tweek
            hier wird aber auch schon die Methode $sql->showMenu aus functions.php aufgerufen
            Erst jetzt gesehen: die Funktion ist ja gar keine Methode der genannten Klasse
            Gruss
            L

            Kommentar


            • #7
              Hast du jetzt extra auf Durchzug gestellt oder warum ignorierst du mein Posting. Mich drueckts nich dir zu helfen, liegt an dir ..
              "Mein Name ist Lohse, ich kaufe hier ein."

              Kommentar


              • #8
                Zitat von Chriz Beitrag anzeigen
                Hast du jetzt extra auf Durchzug gestellt oder warum ignorierst du mein Posting. Mich drueckts nich dir zu helfen, liegt an dir ..
                Hi und Sorry

                Ja ich hab die Klassendefinition jetzt vor dem session_start() eingebunden. Das mit den wakeup und sleep hab allerdings noch nicht ganz durchblickt, vor allem da serialize bzw unserialize diese implizit aufrufen...

                Kommentar


                • #9
                  Klappts denn jetzt? Du musst serialize() und unserialize() eigentlich garnicht verwenden, das uebernimmt PHP fuer dich.

                  Lazydogs Posting ist allerdings auch nochmal einen Blick wert, du hast eigentlich keinen Vorteil, wenn du das Objekt in der Session ablegst im Vergleich zur Neudeklaration.
                  "Mein Name ist Lohse, ich kaufe hier ein."

                  Kommentar


                  • #10
                    Klappen tuts leider noch nicht - wie gesagt - es müsste klappen, keine Ahnung warum es das nicht tut...

                    zu lazydogs post:
                    Ich speichere das Objekt mit den Verbindungsdaten ab, denn so brauche ich dann an jeder Stelle nur mehr $sql->connect(); aufrufen und erspare mir die Mitgabe der Verbindungsdaten (da diese in den Attributen abgelegt sind und herangezogen werden).

                    Ich glaub schön langsam, ich werd die Klasse rauswerfen und alles händisch mit mysql_connect() und Konsorten machen...

                    Kommentar


                    • #11
                      OK, ich glaub ich hab lazydogs Gedankengang jetzt verstanden.

                      Jetzt habe ich einfach die Verbindungsdaten direkt in die Klasse (in den Konstruktor) geschrieben, sodass das Objekt jedesmal ohne Angabe von Verbindungsdaten richtig erzeugt wird. Nun erzeuge ich dieses Objekt an jeder Stelle an der ich es brauche von neuem - natürlich geht es nun auch, wobei ich noch immer nicht weiß warum es anders nicht ging...

                      Kommentar


                      • #12
                        Du sagst nur dass es nicht klappt, damit kann man dir eben auch nicht helfen.
                        "Mein Name ist Lohse, ich kaufe hier ein."

                        Kommentar


                        • #13
                          Bitte nicht. Eine gute MySQL Klasse ist wichtig. Sparst du dir einiges an Schreibkram, hast alles beisamen und kannst sogar noch durch die Klasse Statistiken entwerfen was sonst auch aufwendig wäre.

                          Die Fehlermeldung bezieht sich auf ein nicht definiertes Objekt. sprich du hast die Klasse nicht aufgrufen ("$klasse = new klasse;"), oder die Funktion ist nicht verfügbar. Da du den Aufruf falsch hast. Das zumindest sagt die Fehlermeldung, was man jetzt so erkennen kann. Aber so wie ich über dein Script geflogen bist hast du das sogar.

                          Aber um genau zu erkennen bräuchte ich die Fehlermeldung sowie die Zeilenummer sowie die Zeilen vor der Fehlermeldung bzw. ganzes Scriptes.

                          Als kleine Anmerkung benutze doch statt den Funktionsnamen gleich Klassenamen lieber
                          PHP-Code:
                          construct__() 
                          Gruß s1x

                          Edit: Ah da gibts ja eine 2 Seite.
                          okay, damit du das nicht immer neu herstellt die Verbindung mach doch nur eine Funktion die nicht mit dem Klassenaufruf in Verbindung steht. So sparst du dir die "Neu-Verbindung"

                          Kommentar


                          • #14
                            Soherum wird ein Schuh draus:
                            PHP-Code:
                            __construct () 
                            oder die Funktion ist nicht verfügbar
                            Auch nicht richtig. Das gäbe einen Fehler der Art "Fatal error: Call to undefined method".
                            Es handelt sich also wirklich um ein "Non-Objekt" von dem aus eine Methode aufgerufen wurde - ob das Objekt nie in instantiiert wurde oder die Variable einfach irgendwo überschrieben kann hier nicht unterschieden werden.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar

                            Lädt...
                            X