Hackerboard WikiHaboBlog

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Statische oder normales Datenbankobject

Diskussion: Statische oder normales Datenbankobject im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Guten Morgen zusammen, ich beiße mir seit gestern nun an folgender Situation die Zähne aus: Ich baue mir anhand eines ...

Antwort
Alt 23.12.09, 07:54   #1 (permalink)
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard Statische oder normales Datenbankobject


Guten Morgen zusammen,

ich beiße mir seit gestern nun an folgender Situation die Zähne aus:
Ich baue mir anhand eines Tutorials ein MVC-Framwork auf, welches ich für meine Homepage benutzen möchte.

Bisher klappt alles auch schön und gut, jedoch habe ich ein Problem bei der Datenabfrage über eine Datenbankklasse aus dem Model heraus.

Das DB-Object instanziiere ich als normale Variable im __Contruct, damit dies zur Lebenzeit des Objects (Model) zur Verfügung steht und ich mir die Daten aus der DB holen kann.

Jedoch wirft er mir in Zeile 23 einen Fehler den ich garnicht nachvollziehen kann:

Code:
Fatal error: Using $this when not in object context in C:\xampp\htdocs\disane\classes\model.php on line 23

PHP-Code:
<?php
/**
 * Dataaccess-Layer
 * Author: Marco Franke
 * Date: 21:20 22.12.2009
 */

require_once("config/settings.php");
require_once(
"classes/database.php");

class 
Model{
    private 
$mysql;
    private static 
$NewsArticles = array();
    
    public function 
__contruct(){
    
        
$this->mysql = new Database(DBHOSTDBPWDBUSERDBNAME);
    }

    
/**
     * Gibt alle Einträge des Blogs zurück.
     */
    
public static function getNewsArticles(){
// Hier tritt der Fehler auf:
        
self::$NewsArticles[] = mysql_fetch_assoc($this->mysql->receiveData("SELECT ID, Headline, Article, DateTime, FK_User_ID FROM NewsArticles"));
        return 
self::$NewsArticles;
    }

    
/**
     * Gibt einen bestimmten Eintrag zurück.
     */
    
public static function getNewsArticle($id){
        if(
array_key_exists($idself::$NewsArticles)){
            return 
self::$NewsArticles[$id];
        }else{
            return 
null;
        }
    }
}
?>
Auch wenn ich das DB-Object als static deklariere und damit aufrufen will, sagt er mir dass ich auf kein Object zugreifen kann.

Meine "Recherchen" ergaben, dass aber das DB-Object NULL ist.
Das Datenbankobject funktioniert aber (wenn ich es nicht aus dem Model aufrufe, sondern z.b. in der index.php) ganz normal und wie gewohnt.

Eventuell sieht einer von euch den Fehler sofort und könnte mich da unterstützen.

Vielen Dank!

EDIT:
So klappt es nun.
Wie ich erfahren habe, muss ich das Singleton(-Verfahren) dort benutzen.
So klappt es:

PHP-Code:
<?php
/**
 * Dataaccess-Layer
 * Author: Marco Franke
 * Date: 21:20 22.12.2009
 */

require_once("config/settings.php");
require_once(
"classes/database.php");

class 
Model{

    private static 
$mysql false;
    private static 
$NewsArticles = array();
    
    public static function 
getInstance() {
        if(
self::$mysql === false) {
            
self::$mysql = new Database(DBHOSTDBPWDBUSERDBNAME);
        }
        return 
self::$mysql;
    } 

    
/**
     * Gibt alle Einträge des Blogs zurück.
     */
    
public static function getNewsArticles(){
        
$SQL self::getInstance();
        
self::$NewsArticles[] = mysql_fetch_assoc($SQL->receiveData("SELECT ID, Headline, Article, DateTime, FK_User_ID FROM NewsArticles"));
        return 
self::$NewsArticles;
    }

    
/**
     * Gibt einen bestimmten Eintrag zurück.
     */
    
public static function getNewsArticle($id){
        if(
array_key_exists($idself::$NewsArticles)){
            return 
self::$NewsArticles[$id];
        }else{
            return 
null;
        }
    }
}
?>

Geändert von reaLInsanity (23.12.09 um 10:06 Uhr)
reaLInsanity ist offline   Mit Zitat antworten
Alt 23.12.09, 14:12   #2 (permalink)
 
Benutzerbild von metax.
 
Registriert seit: 22.01.07
metax. Leistung: 8086
metax. eine Nachricht über ICQ schicken
Likes: 10
Standard

Hallo,
in der entsprechenden Zeile greifst du über das $this-Objekt auf die Datenbankverbindung zu ($this->mysql->receiveData...).
Was nicht geht, da du in der statischen Funktion im statischen Kontext bist und dort außerhalb deiner aktuellen Instanz (es gibt das $this-Objekt schlicht und einfach nicht).
Entweder machst du alles statisch (wie in deiner Singleton-Version), was an sich auch nicht so schön is, dafür aber praktisch. Oder du deklarierst alle Variablen und Methoden als Member der Klasse (also nicht-statisch) und speicherst irgendwo eine Instanz deines Models.

mfg, metax.
__________________
Wenn keiner zuschaut, teile ich heimlich durch Null!
Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter
metax. ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 23.12.09, 14:35   #3 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

Ja momentan sind es noch meine erstern Versuche mit MVC-Patterns.
Werde bei gg. Zeit das auch alles Umstellen und die Models von einer Base-Klasse extenden etc.
Dort werde ich auch deine Anmerkung bzgl. der Singleton-Variante berücksichtigen.

Vielen Dank!
reaLInsanity ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » PHP Statische oder normales Datenbankobject
Themen-Optionen
Ansicht

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

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



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61