PHP Variable aus Klasse aufrufen

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.397
Moin moin,

folgendes Problem, ich versteh nicht was ich falsch mache.

Ich habe eine index.php die includiert eine core.php und eine template.php.
In der core.php steht folgendes:
PHP:
<?php
//Zu includierende Dateien//
require_once('./configuration.php');


//Datenbank Handler//
class db_handler extends Config {

    function db_connect(){
    $connectionid = mysql_connect ($this -> dbserver, $this -> user, $this -> password); 
    if (!mysql_select_db ($this -> dbname, $connectionid)) 
     {
     die ("Keine Verbindung zur Datenbank"); 
     }
    }
}         
    
class db_select extends db_handler {

function get_customer(){
    

    var $first_name;
    var $last_name;

    $sql = "SELECT ". 
           "first_name, last_name ".
               "FROM ".
           "customer ";
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result); 
    $this -> first_name = $data["first_name"];
    $this -> last_name = $data["last_name"];
    }    
}

$Select = &new db_select;

?>
In der configuration.php stehen lediglich Datenbank Connection Variablen.
Mein Problem ist das ich in der template.php mit echo $Select -> first_name; der Inhalt von first_name nicht angezeigt bekomme, gleiches gilt für last_name.

Was mache ich falsch ? Wenn ich das ganze ohne Klassen mache funktioniert es.
 
PHP:
class db_select extends db_handler {

  public $first_name;
  public $last_name;

function get_customer(){

    $sql = "SELECT ". 
           "first_name, last_name ".
               "FROM ".
           "customer ";
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result); 
    $this -> first_name = $data["first_name"];
    $this -> last_name = $data["last_name"];
    }    
}
Bevor wir weitermachen, deklarier die Variablen erstmal innerhalb der Klasse und nicht der Methode. Die Objekte wurden aber auch korrekt initialisiert oder? Beim Aufruf von var_dump( $var ) dürfte also kein null stehen.
 
Doch steht leider NULL drin ...
 
Wo machst du denn die Initialisierung? Werden die Objekte in den einzelnen Dateien vorgenommen oder erstellst du sie erst im eigentlichen Script? Ich würde sie zumindest erst im Script erstellen, da ich mit anderen immer Probleme hatte.
Falls du nur ein Objekt haben willst (wäre bei Datenbankgeschichten zumindest nicht schlecht), würde ich mir mal das Singleton-Pattern ansehen. Dann bekommst du im Prinzip das einzige Datenbank-Objekt über eine statische Funktion und arbeitest nur mit dieser.

Btw fehlt im Query irgendwie ein WHERE x = y, damit du einen einzelnen Kunden bekommst und nicht alle.
 
Ja das ist mir schon klar, wegen dem WHERE, aber im Moment geht es mir nur darum überhaupt was aus der Tabelle Customer raus zu bekommen. Was ohne Klassen funktioniert.

Meine index.php sieht wie folgt aus:

PHP:
<?php
//Inlcudes//
require_once('framework/core.php');
require_once('templates/template.php');
?>
Und die template.php so:
PHP:
<!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" lang="de" xml:lang="de">
    <head>
            <title>Online Warenwirtschaft v0.1</title>
    </head>
<body>
    <h1>Kunde</h1>

    <form action="">
      <p>Vorname:<br/><input name="first_name" type="text" size="20" maxlength="40" value="<?php echo $Select -> first_name ?>"/></p>
      <p>Nachname:<br/><input name="last_name" type="text" size="20" maxlength="40" value="<?php echo $Select ->last_name  ?>"/></p>
    </form>
</body>
</html>
 
Verleg die Zeile $Select = &new db_select; mal in die index.php.
 
Schon probiert, hat nichts gebracht ich bin echt am verzweifeln, da ich den Mist schon mal gemacht habe in einer selbst geschriebenen Template Engine.
Naja mehr oder weniger Template Engine aber man ist ja da zum lernen ne ;).
Aufjedenfall habe ich damals eine komplette Klasse db_handler gehabt wo auch die abfragen drin standen, da gings nun habe ich es getrennt was denke ich viel besser ist, da man die Klasse db_handler dann nur aufrufen muss und es funktioniert nicht -.-

EDIT:
Ich habe mir mal mit get_defined_vars() alle vars ausgeben lassen und muss feststellen das first_name und last_name beide leer sind.

Leider finde ich keinen Anhaltspunkt wieso das so ist...
 
Zuletzt bearbeitet:
Wo wird denn bitte die Funktion get_customer aufgerufen? Sonst kann in den Variablen ja gar nichts stehen?!

/edit:
Außerdem: Wieso $Select = &new db_select;?
$Select = new db_select; sollte reichen... (zumindest bei PHP5)
 
hi

anscheinend funktionier die DB verbindung, oder bekommst du da schon einen error?

wenn nicht: versuch dir mal mit "var_dump($data);" das ergebnis des SQLs ausgeben zu lassen, dann siehst du wie die daten daher kommen und ob dein select richtig is ...

dabei vermute ich, dass du ein array mit arrary darin zurück bekommst und du kannst da nicht einfach so drauf zurgreifen

d.h. entweder
foreach( $data as $row ) ....

oder

$data[0][column] .... für den ersten eintrag


auserdem würd ich nicht deine klassen von einem dbhandler ableiten, sondern eine DB klasse machen und in deiner Customer klasse ist dann die DB klasse als variable (property) vorhanden.
 
Naja ich habe es den Klassen vererbt mittels extends also db_select extends db_handler in meinem Fall. Von daher gehe ich davon aus das alle Methoden und Eigenschaften auch in der Klasse db_select vorhanden sind.
 
ja es funktioniert schon,

aber deine customer klasse braucht keine "connectToServer" (beispiel) methode

sonder es würd reichen wenn nur eine DB klasse diese methode hat.

zb so:
PHP:
$db = new DbHandler();
$connection = $db->newConnection( $config );

$customer = new Customer( $connection );

PHP:
class Customer
{
    protected $connection;

    public function __construct( DbHandler $connection )
    {
        $this->connection = $connection;
    }

    public function getAll()
    {
         $slq = 'SELECT * FROM customer;';
         $result = $this->connection->executeQuery( $slq );
         return $result;
    }

    public function getSingel( $id )
    {
         $slq = 'SELECT * FROM customer WHERE id = '.$id.';';
         $result = $this->connection->executeQuery( $slq );
         return $result[0];
    }
}
 
Zuletzt bearbeitet:
Hmm dafür bin ich noch nicht soweit in der OOP, da es für mich ein recht mühseliges Thema ist, leider.
Falls ich das richtig verstehe würde ich eine Methode schreiben, die den Connect beinhaltet und dann eine Klasse erzeugen Customer die diese Methode aufruft.
 
ja genau ... sollt ja nur ein beispielt zum sichs vorstellen sein.

ich weis wie das ist mit OOP.
am anfang sieht man die ganzen möglichkeiten und weis aber nicht wozu sie benötigt werden. die richtige anwendung von OOP hat dann weniger mit php zu tun, sondern mehr damit wie du dein projekt organisierst (design pattern / entwurfsmuster).

also ich würde so drann gehen:
- Klasse "DbHandler"
da machst du nur alles mit der datenbank verbindung, wie connect, errorhandling und selects absetzen

-Klasse "CustomerHandler":
hier ist der DbHandler drin und diese klasse "verwaltet" dir alles zum Customer (kommt dann) ... zb die methode "getAll" oder "getById" oder "getAlleDieIrgendwasHaben", darin steht der SELECT, der wiederum mit der DbHandler ausgeführt wird -> es kommt das result zurück und der "CustomerHandler" befüllt dann den customer durch z.b. eine weitere methode "fillCustomer( $row )" ... dann hast zb beim getAll ein array mit alles Customer-Klassen drin und bei getById bekommst ein Customer zurück.

-Klasse "Customer":
ist nur ein reines datenobjekt ... das nur deine variablen beinhaltet wie vor_name nach_name usw. mit den dazugehörigen methoden getVorName() setVorname() usw


ich hoff es war für den anfang nicht zu verwirrend
 
Ich bin für jede Information dankbar ;) ist ja nicht so das ich es erst seit heute mache. Allerdings bekomme ich es immernoch nicht ganz in meinen Kopf wie wo was... Was sich für mich halt nicht ganz erschließt ist, wenn ich doch:
PHP:
//Datenbank Handler//
class db_handler extends Config {

    function db_connect(){
    $connectionid = mysql_connect ($this -> dbserver, $this -> user, $this -> password); 
    if (!mysql_select_db ($this -> dbname, $connectionid)) 
     {
     die ("Keine Verbindung zur Datenbank"); 
     }
    }
}
habe und dann
PHP:
class db_select extends db_handler {

  public $first_name;
  public $last_name;

function get_customer(){

    $sql = "SELECT ". 
           "first_name, last_name ".
               "FROM ".
           "customer ";
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result); 
    $this -> first_name = $data["first_name"];
    $this -> last_name = $data["last_name"];
    }    
}
habe die Variablen first_name und last_name leer sind ? Wenn man mir das näher bringen könnte wäre ich sehr dankbar, die anderen Variablen die zum tragen kommen sind alle gesetzt und auch verfügbar.
 
hast du dir dein result, also $data schon mal ausgeben lassen

PHP:
function get_customer(){

    $sql = "SELECT ". 
           "first_name, last_name ".
               "FROM ".
           "customer ";
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result); 

var_dump($data); // HIER

    $this -> first_name = $data["first_name"];
    $this -> last_name = $data["last_name"];
    }    
}
 
Gerade gemacht es geschieht nichts ich sehe nicht mal die Ausgabe von var_dump.
var_dump first_name und last_name sind aber NULL was ja nicht sein darf.
 
ja dann stimmt was mit deinem SQL oder mit dem vorherigen Code nicht ... zumindest bekommst du kein ergebniss aus deiner abfrage.

d.h. solang du nicht sowas :
array(3) {
["id"]=>
int(1)
["first_name"]=>
string(5) "Fritz"
["last_name"]=>
string(7) "Phantom"
}

bekommst kannst du deine klassse gar nicht testen und es kann auch nicht befüllt werden
 
Das ist in der Tat korrekt, wenn ich das ganze aber auslager und als normalen Code schreibe funktionierts anscheinend stimmt was mit meinem Klassenkonstrukt nicht.

Also es funktioniert jetzt, allerdings ist es falsch so wie es funktionert.
Denn in der Klasse db_handler gibt habe ich die Methode auch db_handler genannt und nun klappt es, das ist aber falsch. Eine andere Lösung habe ich noch nicht gefunden.
 
Zuletzt bearbeitet:
wenn du sonst nichts in deinem code hast dann fahlt die mal die datenbank verbindung


PHP:
$Select = new db_select();
$Select->db_connect(); // erst verbind
$Select->get_customer(); // dann kannst erst den sql absetzten
echo $Select->fist_name; // dann erst sind deine daten befüllt ... in deinem fall
echo $Select->last_name;

?>
 
Ich habe das Ganze mal so geschrumpft:
PHP:
class db_handler extends Config {

    function db_handler(){
    $connectionid = mysql_connect ($this -> dbserver, $this -> user, $this -> password);
        if (!mysql_select_db ($this -> dbname, $connectionid))
         {
         die ("Keine Verbindung zur Datenbank");
         }
         $sql = "SELECT ".
                        "first_name, last_name ".
            "FROM ".
            "customer ";

        $result = mysql_query ($sql);
        $data = mysql_fetch_array ($result);
        $this -> first_name = $data["first_name"];
        $this -> last_name = $data["last_name"];
    }
}
$db_handler = &new db_handler;
Allerdings ist das nicht das was ich haben wollte so wirklich.
Meine Absicht war eine Klasse db_handler zu haben nur für die Verbindung dann eine Klasse db_select oder wie auch immer wo der Select drin steht der später dynamisch verändert werden soll. Jetzt habe ich aus 2 eine Klasse gemacht was aber Mist ist weil ich so die Klasse nicht wieder verwenden kann da sie nicht allgemein gültig ist.
 
Zurück
Oben