php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.06.2008, 20:17  
Neuer Benutzer
 
Registriert seit: 18.06.2008
Beiträge: 6
tweek befindet sich auf einem aufstrebenden Ast
Standard 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!
tweek ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 22.06.2008, 20:32  
Neuer Benutzer
 
Benutzerbild von Leibi
 
Registriert seit: 21.06.2008
Beiträge: 20
Leibi befindet sich auf einem aufstrebenden Ast
Leibi eine Nachricht über ICQ schicken
Standard

Wie ist denn die genaue Fehlermeldung? Sehe keinen Fehler.
__________________
Just took a stone and destroyed my windows...
Leibi ist offline  
Alt 22.06.2008, 20:40  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Fehlermeldung ist der Thread-Titel.
Wolla ist offline  
Alt 22.06.2008, 21:36  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

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.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 23.06.2008, 08:44  
Neuer Benutzer
 
Registriert seit: 18.06.2008
Beiträge: 6
tweek befindet sich auf einem aufstrebenden Ast
Standard

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
tweek ist offline  
Alt 23.06.2008, 10:33  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

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:
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

Geändert von lazydog (23.06.2008 um 10:40 Uhr).
lazydog ist offline  
Alt 24.06.2008, 06:47  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hast du jetzt extra auf Durchzug gestellt oder warum ignorierst du mein Posting. Mich drueckts nich dir zu helfen, liegt an dir ..
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 24.06.2008, 06:54  
Neuer Benutzer
 
Registriert seit: 18.06.2008
Beiträge: 6
tweek befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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...
tweek ist offline  
Alt 24.06.2008, 08:52  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

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.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 24.06.2008, 09:05  
Neuer Benutzer
 
Registriert seit: 18.06.2008
Beiträge: 6
tweek befindet sich auf einem aufstrebenden Ast
Standard

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...
tweek ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Fatal error: Call to a member function on a non-object atom-dragon PHP Tipps 2007 20 02.12.2007 22:22
Call to a member function on a non-object Riks PHP Tipps 2007 20 10.02.2007 22:59
Fatal error: Cannot use object of type FPDF as array in Alpha Centauri PHP Tipps 2006 5 22.03.2006 14:44
Fatal error: Call to undefined function mail() PHP Tipps 2005-2 16 04.07.2005 13:24
Problem Call to a member function on a non-object PHP Tipps 2005 5 24.05.2005 19:14
Call to a member function on a non-object PHP Tipps 2005 12 24.05.2005 04:06
Fatal error: Call to a member function on a non-object PHP Tipps 2005 7 13.04.2005 07:24
update auf php 5.0.4 robo47 Server, Hosting und Workstations 6 10.04.2005 19:00
Fatal error: Call to a member function on a non-object PHP Tipps 2005 15 04.02.2005 13:02
Fatal error: Call to undefined function: imagecreatefromjpeg DannyD PHP-Fortgeschrittene 10 05.12.2004 21:59
Call to a member function on a non-object --&amp;gt; WARUM ? PHP Tipps 2004-2 4 25.11.2004 20:16
Fatal error: Call to undefined function mysql_connect() Datenbanken 4 11.11.2004 17:53
Fatal error: Call to undefined function: sqlite_open()..... PHP Tipps 2004 11 01.08.2004 17:44
Fatal error: Call to undefined function: mail() in... PHP Tipps 2004 5 31.07.2004 17:25
[Erledigt] Fatal error: Call to undefined function:... PHP Tipps 2004 8 27.06.2004 12:56

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
fatal error: call to a member function query() on a non-object in, fatal error: call to a member function query() on a non-object, call to a member function execute() on a non-object, call to a member function execute() on a non-object in, fatal error: call to a member function execute() on a non-object in, fatal error: call to a member function execute() on a non-object, fatal error: call to a member function close() on a non-object in, fatal error call to a member function query on a non-object in, call to a member function close() on a non-object, call to a member function delete() on a non-object, call to a member function close() on a non-object in, fatal error: call to a member function close() on a non-object, fatal error: call to a member function query() on a non-objec, fatal error: call to a member function query() on a non-object i, call to a member function query() on a non-object, call to a member function getorder() on a non-object, call to a member function exec() on a non-object, \fatal error: call to a member function query() on a non-object in\, \call to a member function execute() on a non-object\, call to a member function query() on a non-object in

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:51 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum