php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.05.2007, 17:17   #1 (permalink)
Erfahrener Benutzer
 
Registriert seit: 28.11.2004
Beiträge: 271
nieselfriem ist zur Zeit noch ein unbeschriebenes Blatt
Standard Zugriff auf Objekte anderer Klassen

Hallo!
Bisher habe ich ein Script mit drei Dateien.
1. Datei ist die Klasse für den Zugriff auf die Datenbank
2. Ist die Klasse für die Kontrolle und späteres Schreiben der Daten
3. ist einfach die index.php mit der Webseite

Mein Problem ist folgendes.
In meinem DB-Script wird ein object erstellt mit dem ich dann nur durch require zugriff auf die Methoden haben sollte. Jedoch geht das nicht sobald ich mich in eier Klasse bewegen
db-klasse:
PHP-Code:
<?
class mysql_db
{
    var 
$link=false;
    var 
$resid=false;
    var 
$doerror=false;
    var 
$host="localhost";
    var 
$user="root";
    var 
$passwd="";
    var 
$dbname="pepper";    

    function 
connect()
    {
        
$temp=@mysql_connect($this->host$this->user$this->passwd);
        
        if(!
$temp)
        {
            
$this->echoerror();
            return 
false;
        }
        
$this->link=$temp;
        
$temp =@mysql_select_db($this->dbname$temp);
        if(!
$temp)
        {
            
$this->echoerror();
            return 
false;
        }
        
        return 
$this->link;
    }
    
    function 
query($sql)
    {
        if (!
$this->link)
        {
            if(
$this->doerror)
            {
                echo (
"[b]Nicht verbunden![/b]</br>");
                return 
false;
            }
        }
        if (
$this->resid) @mysql_free_result($this->resid);
        
$resultmysql_query($sql$this->link);
        if(!
$result$this->echoerror();
        
$this->resid=$result;
        return 
$result;
                    
    }
    
    function 
echoerror()
    {
        if (!
$this->doerror) return;
        if (!
mysql_errno()) return;
        echo (
"<font color=\"red\">[b]".mysql_errno());
        echo (
": ".mysql_error() ."[/b]</font>
"
);
    }
    
    function 
data()
    {
        if (!
$this->link)
        {
            if(
$this->doerror)
            {
                echo (
"[b]Nicht verbunden![/b]</br>");
                return 
false;
            }
        }
        
        if (!
$this->resid)
        {
            if (
$this->doerror)
                echo (
"[b]Keine Abfrage![/b]</br>");
            return 
false;    
        }
        
$result=mysql_fetch_array($this->residMYSQL_BOTH);
        
$this->echoerror();
        return 
$result;
    }
   
    function 
echoquery($sql)
    {
    
$this->query($sql);
    echo(
"<table border celpadding=\"3\"><tr>");
    
$index=0;
    echo(
"<th>record</th>");
    
while (
$field=mysql_fetch_field($this->resid))
        echo(
"<th>$field->name</th>");
    echo (
"</tr>\n");
    
$rec=0;
    while (
$row=$this->data())
    {
        
$rec++;
        echo(
"<tr><td>$rec</td>");
        for(
$i=0;$i<mysql_num_fields($this->resid); $i++)
            echo(
"<td>".htmlentities($row[$i])."</td>");
        echo (
"</tr>\n");
    }
    echo (
"</table>");
    }

    function 
set_doerror($boolvalue)
    {
        
$this->doerror=$boolvalue;
    }
    
    function 
mysql_db()
    {
        
$this->connect();
    }
}

    
$db = new mysql_db;            
    
    

?>
Kontrollscript
PHP-Code:
<?    
    
require('mysql_db.php');
    class 
registrieren
    
{
         private 
$cname;
         private 
$cvorname;
         private 
$cfirmenname;
         private 
$cpass;
         private 
$cconf;    
         private 
$cmail;
         private 
$cstrasse;
         private 
$chausnr;
         private 
$cplz;
         private 
$cort;
         private 
$ctel;
         private 
$cfax;
         private 
$dbconf;
            
         
        function 
registrieren($name$vorname$firma,$pass$conf$mail$strasse$hausnr$plz$ort$tel)
        {
            
$this->cname=$name;
            
$this->cvorname=$vorname;
            
$this->cfirmenname=$firma;
            
$this->cpass=$pass;
            
$this->cconf=$conf;
            
$this->cmail=$mail;
            
$this->cstrasse=$strasse;            
            
$this->chausnr=$hausnr;
            
$this->cplz=$plz;
            
$this->cort=$ort;
            
$this->ctel=$tel;
            
$this->cfax=$fax;
        }
        function 
checkdatas()
        {
            
            
            
            
$ok=true;
            
$fehlerfeld=array();
            
$db->query("SELECT count(*) from Kunde where email=$this->cmail");
            list(
$anzahl)=$db->data();
                                    
            if (!isset(
$this->cname) || !is_string($this->cname) || trim($this->cname)=="")
            {
                
$ok=false;
                
$fehlerfeld[]="Geben Sie bitte den Namen an!\n";
            }
            
            
            if (!isset(
$this->cvorname) || !is_string($this->cvorname) || trim($this->cvorname)=="")
            {
                
$ok=false;
                
$fehlerfeld[]="Geben Sie bitte den Vornamen an!\n";
            }
            ...
        function 
writedatas()
        {
            
            
$db->query("INSERT INTO Kunde ($this->cname,$this->cvorname, $this->cfirmenname, $this->passwort, $this->cmail, $this->cstrasse, $this->chausnr, $this->cplz, $this->cort, $this->ctel, $this->cfax"); //Feherlder zeiel 47
        
}
Jedoch wird dann die Fehlermedlung "Call to a member function query() on a non-object in /opt/lampp/htdocs/kontakt/registerclass.php on line 47" erzeugt. Diese Meldung kommt nach dem ich mich belesen hatte immer dann wenn das Objekt noch nicht erzeugt sei und man auf die Methoden zugreifen wolle. Ich habe das Objekt doch schon in der Datenbankklasse erzeugt.
Was muß ich machen um dies in mene Klasse zu bekommen?

Gruß niesel
nieselfriem ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 13.05.2007, 17:38   #2 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.015
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nieselfriem,

das kann ich auch nachvollziehen. Im Konstruktor der Klasse "registrieren" initialisierts du die Variable "dbconf" mit einer Instanz von "mysql_db" und in der Methode "checkdatas()" versuchst du auf die interne Variable "db" zuzugreifen. Die gibt es aber nicht, da nicht initialisiert.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 13.05.2007, 18:00   #3 (permalink)
Erfahrener Benutzer
 
Registriert seit: 28.11.2004
Beiträge: 271
nieselfriem ist zur Zeit noch ein unbeschriebenes Blatt
Standard

nee das ist ein fehler, das war nur zu experiemtellen zwecken drinn-->korrigiert
nieselfriem ist offline  
Alt 13.05.2007, 18:06   #4 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.015
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nieselfriem,

du hast jetzt Korrekturen gemacht, die nicht produktiv sind und das ganze noch "falscher" machen.

Wenn du deine MySQL-Klasse in der Klasse "registrieren" verwenden möchtest, macht es nur Sinn, wenn du dort auch eine Instanz zur Verfpgung stellt. Du kannst das beispielsweise so machen:

PHP-Code:
<?php
[..]
        function 
checkdatas()
        {
             [..]
             
$db = new mysql_db();

             
$ok=true;
             
$fehlerfeld=array();
             
$db->query("SELECT count(*) from Kunde where email=$this->cmail");
             list(
$anzahl)=$db->data(); 
            
             [..]
?>
Ein

PHP-Code:
<?php
 $db 
= new mysql_db;     
?>
ausserhalb der Klasse macht keinen Sinn und verleitet nur dazu irgendwo dann ein unsauberes

PHP-Code:
<?php
   
[..]
   global 
$db;
   [..]
?>
einzufügen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 13.05.2007, 18:20   #5 (permalink)
Erfahrener Benutzer
 
Registriert seit: 28.11.2004
Beiträge: 271
nieselfriem ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ahso!

das heist also. ich muß meine db-Klasse mit require einbinden und wenn ich sie in der entprechenden php-datei verwenden möchte bzw. in einer klasse muß ich immer ein neues objekt erzeugen.
Das das objekt in der db-Klasse erzeugt wird habe ich aus einem buch. Dies macht man so also nicht!
nieselfriem ist offline  
Alt 13.05.2007, 23:12   #6 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.015
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nieselfriem,

Zitat:
das heist also. ich muß meine db-Klasse mit require einbinden und wenn ich sie in der entprechenden php-datei verwenden möchte bzw. in einer klasse muß ich immer ein neues objekt erzeugen.
Du musst überall dort, wo du eine Instanz benötigst diese verfügbar machen. Da wir hier im Anfänger-Forum sind wollte ich nichts von Singleton erzählen, aber du fragst ja explizit...
Du hast in der Datei, in der sich deine MySQL-Klasse befindet diese am Ende instanziiert um eine Instanz dieser Klasse verfügbar zu haben. Wenn du das so löst, bist du gezwungen die Instanz entweder am Verwendungsort neu zu erstellen (new mysql_db()) oder die bereits vorhandene Instanz mit

PHP-Code:
<?php
   
[..]
   global 
$db;
   [..]
?>
in der gewünschten Methode verfügbar zu machen. Letzteres ist - wie beschrieben - unschön. Aus diesem Grund verwendet man hier das Singleton-Pattern, das die Möglichkeit bietet, überall, wo benötigt, eine Instanz eines Objekts verfügbar zu machen. Damit wird sichergestellt, dass es nur genau eine Instanz des angegebenen Objekts gibt, dieses aber überall verfügbar ist. In Quelltext gegossen sieht das dann so aus:

PHP-Code:
<?php
[..]
        function 
checkdatas()
        {
             [..]
             
$db = &Singleton::getInstance('mysql_db');

             
$ok=true;
             
$fehlerfeld=array();
             
$db->query("SELECT count(*) from Kunde where email=$this->cmail");
             list(
$anzahl)=$db->data();
            
             [..]
?>
Als Singleton-Implementierung kannst du beispielsweise die aus dem CHM-File nehmen. Du kannst dir diese aber auch selbst implementieren. Zum Download gibt es meine unter http://christian.zierpflanzenberatun...mo_package.zip im Ordner apps/core/singleton/. Diese einfach per require() einbinden und gemäß der API-Dokumentation nutzen.


Zitat:
Das das objekt in der db-Klasse erzeugt wird habe ich aus einem buch. Dies macht man so also nicht!
Diesen Satz verstehe ich nicht...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 13.05.2007, 23:58   #7 (permalink)
Erfahrener Benutzer
 
Registriert seit: 28.11.2004
Beiträge: 271
nieselfriem ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja ich hatte ursprünglich die instanz der klasse mysql_db ja schon direkt in der mysql_db.php erzeugt. Diese Art und weise wurde mir in einem Buch so gezeigt. Deshalb dieser Satz mit dem Buch

n8 niesel
nieselfriem ist offline  
Alt 14.05.2007, 12:48   #8 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.015
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nieselfriem,

das ist richtig, die Instanz ist dann schon erzeugt. Nur nützt dir das erst mal nichts, weil der Gültigkeitsbereich dieser Variable nur bis an die Grenzen einer Klasse/Funktion reicht. Um die Instanz dort verfügbar zu machen müsste man diese Variable aus dem globalen Scope "importieren", was unsauber ist. Am besten du hälst dich an Singleton, das garantiert dir eine saubere Lösung. Solltest du dazu Hilfe brauchen, einfach Bescheid geben!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. 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
Referenzen auf Objekte innerhalb eines Arrays PHP-Fortgeschrittene 6 31.08.2009 17:06
Klassen sinnvoll nutzen, Grundlegendes nikosch PHP-Fortgeschrittene 1 30.09.2006 22:08
Fragen zu Klassen Kein Genie PHP Tipps 2006 3 08.05.2006 11:25
Sessions an includete Klassen übergeben Dr_Enquinox PHP Tipps 2006 4 29.04.2006 10:25
mit html klassen definieren und in php ausgeben PHP-Fortgeschrittene 4 16.01.2006 10:31
Objekte vergleichen PHP-Fortgeschrittene 4 08.12.2005 16:20
objekte und klassen notyyy PHP Tipps 2005-2 2 24.10.2005 17:44
Objekte in Klassen PHP Tipps 2005-2 1 20.08.2005 09:23
Fehler abfangen in Klassen PHP Tipps 2005-2 26 25.06.2005 19:26
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
Klassen PHP Tipps 2005 5 09.04.2005 18:51
Klassen in Klassen verwenden PHP Tipps 2005 5 23.02.2005 14:08
Projekte nachträglich auf Klassen und Objekte umstellen??? PHP-Fortgeschrittene 7 10.12.2004 15:33
ich raffe opp nicht :( ! eQuin PHP-Fortgeschrittene 16 04.11.2004 11:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
auf klasse zugreifen require, php objekte in klassen, auf array aus anderer klasse in klasse zugreifen php, function doerror($sql = \\), zugriff auf klasse ohne instanzierung php, singleton object über klasse verfügbar machen, objekte an klassen übergeben, php zugriff klasse, zugriff auf objekte in einem array, zugriff auf objekte innerhalb eines array, php zugriff auf objekte, mysql klasse in anderere datei nutzen, php class klasse registrieren, objekte einer klasse in andere klasse

Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.




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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.