Objekt-Attribute aus der Datenbank rekonstruieren

hoctar

Erfahrenes Mitglied
Hallo :)
ich überlege mir gerade wie ein Objekt arbeiten soll, dass seine Daten aus der Datenbank bezieht.

Also z.B. eine "Benutzer" class:
PHP:
class Benutzer {


        function Benutzer($id) {
                $this->id = $id;
                
                $this->laden();
        }

        function laden() {
                $query = "SELECT name, herkunft FROM benutzer WHERE id = ".$this->id;
                $result = mysql_query($sql);

                $row = mysql_fetch_array($result))
                $this->name = $row['name'];
                $this->herkunft = $row['herkunft'];
        }
        
        // Speichern demenstrechend so:
        function speichern() {
                $query = "INSERT INTO benutzer (name, herkunft) VALUES (".$this->name.", ".$this->herkunft.")";
                mysql_query($query);
        }
        
        // und getter so:
        function getName() {
                return $this->name;
        }

}

Wie man sieht werden alle Daten gleich beim initialisierengeladen, dies ist sehr oft unötig, weil man öffters nur den Name braucht und nicht alle Daten.

Wie könnte man das nun anders anstellen ?
 
Zuletzt bearbeitet:
Schreibe einfach eine Funktion, welche nur den Namen mittels SQL abfragt.

PHP:
function ShowName($id) { 
                $query = "SELECT name FROM benutzer WHERE id = ".$this->id; 
                $result = mysql_query($sql); 

                $row = mysql_fetch_array($result)) 
                $this->name = $row['name']; 
}
 
Nun wenn ich aber mehr als nur Herkunft und Name habe, dann wird die Klasse unötig groß und unübersichtlich. Für jedes einzelne Feld habe ich dann eine ganze Abfrage.
 
Overloading mit __Set und __get ermöglichen dir, dass du nicht alle setter und getter programmieren musst.

http://ch2.php.net/manual/de/language.oop5.overloading.php

Mal als Denkanstoss:
PHP:
<?php 
class Benutzer extends ArrayObject implements ArrayAccess{
    public $__CHIELD__ = __CLASS__;
    private $sqlSelect = "SELECT [field] FROM benutzer WHERE id = [id]";
    private $sqlUpdate = "UPDATE benutzer SET [field] = [value] WHERE id = [id]";
    
    public function __construct($id){
        $this['id']' = $id;
        $this->sqlSelect = str_replace("[id]", $id, $this->sqlSelect);        
        $this->$sqlUpdate = str_replace("[id]", $id, $this->$sqlUpdate);        
    }
    
    /**
    * set
    * Magic Function __set for all properties
    * @access   public
    * @param    String name
    * @param    Variant vlaue
    */
    public function __set($name, $value){
        //TODO $value je nach Type ins richtige SQL-Format bringen
        //TODO Errorhandlich, falls das Feld in der DB nicht exisitert
        $sql = str_replace(array("[field]", "[value]"), array($name, $value), $this->sqlUpdate);
        mysql_query($sql);        
        $this[$name] = $value;
    }

    /**
    * get
    * Magic Function __get for all properties
    * @access   public
    * @param    String name
    * @return   Variant value
    */
    public function __get($name){
        if (!$this->offsetExists($name)){
            //TODO Errorhandlich, falls das Feld in der DB nicht exisitert
            $sql = str_replace("[field]", $name, $this->sqlSelect);
            $result = mysql_query($sql);
            $row = mysql_fetch_object($result);
            $this[$name] = $row->$name;
            mysql_free_result($result); 
        }
        return $this[$name];
    }
}

$benutzer = new Benutzer(15);
$name = $benutzer->name;
$benutzer->wohnort = "neues Heim";

?>
 
Ah, das ist sehr hilfreich :) Danke.

Leider lässt diese Möglichkeit das JOINEN anderer Tabellen nicht zu, oder es wird zumindest umständlich.
 
Einfach die Spezielfelder in der Klasse ausprogrammieren.

PHP:
class Benutzer extends ArrayObject implements ArrayAccess{
    ....
    
    // setter
    public function joinedField($newValue){
        //TODO
    }
    
    // getter
    public function joinedField(){
        //TODO
    }
    ....
}
 
Okay :)

Noch eine Sache.
Wie könnte man einen neuen Benutzer erstellen, falls dieser nicht vorhanden ist.
Ich habe mir das in etwa so überlegt:
PHP:
class Benutzer {

        var $sqlSelect = "SELECT [field] FROM benutzer WHERE id = [id]";

        function __set($name, $value) {

                if($this->exists()) {
                        $this->create();
                }

                $sql = str_replace(array("[field]", "[value]"), array($name, $value), $this->sqlUpdate);
                mysql_query($sql);
                $this[$name] = $value;
                
        }

        function exists() {

                $sql = str_replace("[field]", 'id', $this->sqlSelect);
                $result = mysql_query($sql);
                
                return (mysql_num_rows($result) <= 0? false : true);
                
        }
        
        function create() {
                $sql = "INSERT INTO benutzer ..."
        }

}

Aber leider wird bei jedem setzen geprüft ob dieser existiert.

Und noch eine Frage zu deinem Beispiel Script.
Was macht diese Methode ?
PHP:
$this->offsetExists($name)
 
Zurück