php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 24-07-2007, 13:41
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard Vererbung von Klassen?

Hallo,

ich habe ein Klasse MYSQL - sie ist die Hauptlkasse.
Dann hab ich eine Klasse LOGIN die die Klasse MYSQL erbt.

Also

class mysql {
}

class login extends mysql {
}

soweit so gut.

Jetzt hab ich 2 Fragen...

1. Frage:

Wenn ich im Konstruktor die Datenbankverbindung in der Klasse MYSQL aufbaue, scheint diese dann in der Instanz der LOGIN-Klasse nicht vorhanden zu sein!
Gibts da eine Lösung oder muss ich in der LOGIN-Klasse eine neue Instanz der MYSQL-Klasse bilden.
Hätte es aber gern so, da die Verbindung für alle Unterklassen da ist. Geht das?

Also, ich stell in der Klasse MYSQL eine Verbindung her, und rufe dann in der Klasse LOGIN die Funktion db::sql_query() auf.
Hier ist die Verbindung dann scheinbar nicht mehr da!

2. Frage:

Kann ich aus der Unterklasse LOGIN auf eine Variable der Klasse MYSQL zugreifen - ohne extra dafür eine Funktion zu erstellen, die ich dann DB::ZeigVariable() angezeigt bekomme?

Danke!
Mit Zitat antworten
  #2 (permalink)  
Alt 24-07-2007, 13:46
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

2) parent::fkt()
1) ich würde einen Konstruktor für die Kindklasse anlegen, welche den Konstruktor der Elternklasse mit entsprechenden Werten aufruft.
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #3 (permalink)  
Alt 24-07-2007, 13:52
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Hier ist die Verbindung dann scheinbar nicht mehr da!
Nein, du vererbst ja keine Instanz der Klasse.

1) Hier könnte ein Singelton dir weiterhelfen. Dann hast du immer eine Version der Klasse MySQL (ohne Vererbung).
2) Nur wenn die Variable schon im Entwurf der Klasse definiert ist.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #4 (permalink)  
Alt 24-07-2007, 14:02
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

zu 2. Ich will aber keine Funktion aufrufen, sonder auf eine Variable zu greifen.


zu 1.

das Problem ist das ich das Handle der mysql-verbindung verliere. Das singleton stellt doch dann auch nur wieder eine neue instanz auf, das wäre ja dann eine weiter sql-verbindung. das wäre für die performance nicht grad so toll, oder versteh ich da was falsch?
Mit Zitat antworten
  #5 (permalink)  
Alt 24-07-2007, 14:03
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

vgl. http://www.it-academy.cc/article/146...QL+Klasse.html

die idee ist es, die resource der verbindung als (u.u. statische) eigenschaft der mysql klasse zu speichern und z.b. mittels singleton zu initialisieren. alle unterklassen können dann im konstruktor den parent-konstruktor aufrufen, der die instanz anlegt und weiter über parent::$connection auf die db zugreifen. so werden instanzen aller klassen des laufenden skripts die selbe verbindung zur db nutzen.

andererseits - rtfm zu mysql_connect. die idempotenz dieser funktion besteht darin, auch bei mehreren aufrufen nur eine verbindung zu nutzen (s. vierten parameter).

Geändert von penizillin (24-07-2007 um 14:05 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 24-07-2007, 14:24
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
zu 2. Ich will aber keine Funktion aufrufen, sonder auf eine Variable zu greifen.
parent::Variable - wie gesagt nur für Variablen die nicht zu einer Instanz gehören.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #7 (permalink)  
Alt 24-07-2007, 14:35
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke. denn sinn versteh ich schon, aber die umsetzung nicht ganz. ich muss also, bei aufruf der select-funktion die resource-id an die select-funktion mit übergeben!? eigentlich ist diese ja schon drin definiert, oder?

so sieht meine sql-klasse aus. wie müsste ich die umändern?

PHP-Code:
<?php
    
class db {
    
        protected   
$host         'localhost';
        protected   
$user         'root';
        protected   
$pass         '';
        protected   
$dbname       'cnet';
        protected   
$connection   NULL;
        public      
$numquerys    0;
        public      
$numrows      0;
    
        
/**
         *  Konstruktor
         */
        
function __construct()
        {
            
// MySQL Verbindung herstellen
            
if (!$this->connect())
                die (
mysql_error($this->connection));
        }

        
/**
         *  Destruktor
         */
        
function __destruct()
        {
            
// MySQL Verbindung schließen
            
if (!mysql_close($this->connection))
                die (
mysql_error($this->connection));
        }

        
/**
         *  Stellt eine MySQL-Verbindung her
         */
        
protected function connect()
        {
            
// Verbindnung herstellen
            
$this->connection mysql_connect($this->host$this->user$this->pass);
            if (!
$this->connection)
            {
                return 
0;
            }
            
// Datenbank auswählen
            
if (!mysql_select_db($this->dbname))
            {
                return 
0;
            }
            return 
1;
        }

        
/**
         *  Führt eine SQL-Query aus (INSERT,UPDATE,DELETE...)
         */
        
public function query($statment)
        {
            if (
$this->connection)
            {
                
$result = @mysql_query($statment$this->connection);
                if (
$result)
                    
$this->numquerys++;
                else
                    echo 
$statment.'<br />'.mysql_error($this->connection);
                return 
$result;
            }
        }

        
/**
         *  Führt eine SQL-Select aus (SELECT)
         */       
        
public function select($statment)
        {
            echo 
'>>>'.$this->connection.'<<<';
            if (
$this->connection)
            {
                
$arrReturn = array();
                
$this->numrows 0;
                
$result = @mysql_query($statment$this->connection);
                if (
$result)
                {
                    
$this->numquerys++;
                    while (
$arrData = @mysql_fetch_array($result))
                    {
                        
$arrReturn[] = $arrData;
                        
$this->numrows++;
                    }
                }
                else
                {
                    echo 
$statment.'<br />'.mysql_error($this->connection);
                    return 
0;
                }
                return 
$arrReturn;
            }
        }

        
/**
         *  Gibt die Anzahl des letzten gefundenen Treffers zurück
         */
        
public function numrows()
        {
            return 
$this->numrows;
        }

        
/**
         *  Gibt die Anzahl des letzten gefundenen Treffers zurück
         */
        
public function numquerys()
        {
            return 
$this->numquerys;
        }

        
        
/**
         *  Wechselt die Datenbank
         */
        
public function changedb($database)
        {
            if (
$this->connection)
                if (!
mysql_select_db($database))
                {
                    die (
mysql_error($this->connection));
                    return 
0;
                }
                else
                {
                    return 
1;
                }
        }

    }
?>

und in der LOGIN-Klasse gibt es Funktion die die Select-Funktion aufruft, aber eben die Resource fehlt. Wie müsste die aussehen?


PHP-Code:
class login extends db {
...
        public function 
login($username,$password)
        {
           
$arrResult parent::select("SELECT userid,active FROM users 
WHERE (username='"
.$username."' AND password='".md5($password)."') LIMIT 1");
           echo 
parent::numrows(); // Zum test eine ausgabe
        
}
...


Geändert von TriphunEM (26-07-2007 um 13:03 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 24-07-2007, 14:40
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

sieht doch gut aus.. nur noch den parent konstruktor aufrufen nicht vergessen.

p.s. nicht parent::select.. this->select war schon richtig.
Mit Zitat antworten
  #9 (permalink)  
Alt 24-07-2007, 14:41
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
rtfm zu mysql_connect.
Zitat:
Für den Fall, dass ein zweiter Aufruf von mysql_connect() mit den gleichen Argumenten erfolgt, wird keine neue Verbindung aufgebaut, sondern die Verbindungs-Kennung der schon bestehenden Verbindung zurückgeliefert. Der Parameter neue_Verbindung beeinflusst dieses Verhalten und mysql_connect() öffnet immer eine neue Verbindung, sogar dann, wenn mysql_connect() zu einem früheren Zeitpunkt mit den gleichen Parametern aufgerufen wurde.
Oder so. Und jetzt löscht du erstmal den unnützen Code daraus. (Denk daran im Konstruktor von login parent::__construct ( ) aufzurufen.)
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #10 (permalink)  
Alt 24-07-2007, 19:45
frido37
 Newbie
Links : Onlinestatus : frido37 ist offline
Registriert seit: Jun 2005
Beiträge: 23
frido37 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wofür brauchst du deine "SQL-Klasse"?
Es gibt doch creole oder PDO oder ADODB oder oder oder ...
Mit Zitat antworten
  #11 (permalink)  
Alt 24-07-2007, 21:05
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von frido37
Wofür brauchst du deine "SQL-Klasse"?
Es gibt doch creole oder PDO oder ADODB oder oder oder ...
Das ist keine gute Philosophie, wenn du mich fragst. Seiner "SQL-Klasse" fehlt ohne Zweifel noch so einiges, um an die von dir genannten heranzukommen. Aber Übung macht den Meister, und zur Übung sind Fertigprodukte nur bedingt geeinget.
Für den Fall, dass die programmiertechnische Umsetzung zwecks Übung hier nicht gefragt ist, sondern nur nach der bestmöglichen Lösung gesucht wird, ziehe meine Behauptung natürlich zurück.
Mit Zitat antworten
  #12 (permalink)  
Alt 25-07-2007, 20:32
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke. es klappt soweit alles.

aber das Problem ist, da ich trotzdem mit $this-> auf eine Funktion der oberklasse zugreifen muss. ist natürlich blöd, weil ich dann jeder funktion einer Klasse einen eindeutigen namen geben muss, sonst kommt man durch einander!

gibts da ne möglichkeit?

also sprich, das ich eine funktion einer oberklasse mit klassenname+funktionsname ansprechen kann? aber trotzdem die resource, wie oben besproche, behalte???
Mit Zitat antworten
  #13 (permalink)  
Alt 25-07-2007, 22:28
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
gibts da ne möglichkeit?
Nein, so nicht, aber bei zwei zusammengeführten Klassen sollte das kein Problem sein oder? Und ohne Bezug vererben sollst du sowieso nicht.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:49 Uhr.