ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
1418
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Registriert seit
    Dec 2001
    Ort
    Hannover
    Beiträge
    4.167
    Jetzt hab ich mich auch mal ein bissl an PHP-OOP gesetzt. Meine zweite Klasse ist eine Datenbank Klasse für MySQL. Soweit läuft alles ohne Fehlermeldung - irgendwie bekomme ich aber keine Ausgabe hin *schäm*.

    Was mache ich falsch, bwz. was könnte ich an der Klasse besser machen?

    Damit meine ich jetzt nicht zusätzliche Features - es ist absichtlich nur -> Verbindung, Abfrage, Verbindung beenden <- gedacht. Errorverwaltung folgt, wenn das hier läuft.

    Meine erste Klasse war zum lesen/schreiben aus/in eine Datei und das klappte ohne Probleme. Nur mit der Datenbank zoffe ich mich *g*

    Source als Dateianhang******
    Angehängte Dateien Angehängte Dateien
     
    Copy for free - Yet another page for free software with soures:
    • BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
    • W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
    • AppStarter (Somewhat like PortableApps launcher)
    • QuakeConsole (Show/Hide windows console with your tilde key)

    Also check my Github Account.

  2. #2
    Registriert seit
    Mar 2002
    Ort
    BRD
    Beiträge
    492
    Schreib das mysql_query mal wie folgt:

    PHP-Code:
        function db_mysql_query($db_query)
            {
            if(
    $this->db_cid)
                    { 
                    
    $result mysql_query($db_query,$this->db_cid);
            return 
    mysql_fetch_array($result);
        } 
    Evtl. würde ich das mysql_fetch_array jedoch in eine weitere Funktion setzen bzgl. dem umgang mit while-Schleifen sonst!
     

  3. #3
    Valentin- ist offline Mitglied Brokat
    Registriert seit
    Oct 2001
    Ort
    Mainz
    Beiträge
    337
    Neurodaemon wenn du willst schicke ich dir mal meine kannste
    dir einige Sachen anschauen..

    bye
     

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Hannover
    Beiträge
    4.167
    Erst mal danke für die ersten Antworten!

    @Sebastianus:
    Wenn ich das jetzt richtig verstehe:

    PHP-Code:
    _if($this->db_cid
    Wenn die aktuelle Verbindung geklappt hat, dann erst die Abfrage. Müßte dann nicht bei der Funktion db_mysql_dbselect($db_name) nicht die gleiche if-Abfrage hin?

    Das ist doch jetzt aber schon eine Fehlerabfrage, und die wollte ich eigentlich noch net einbauen

    PHP-Code:
                $result_=_mysql_query($db_query,$this->db_cid);
                
    return_mysql_fetch_array($result); 
    Das hier verstehe ich jetzt nicht ganz. Was ist der Unterschied zu meiner Urversion? Könntest Du ein wenig umfangreicher erklären? Warum mysql_fetch_array in eine andere Funktion?

    @Valentin:

    Danke für das Angebot, aber weitere Klassen werden mir nicht helfen. Ich versuche gerade zu verstehen, wie der ganze OOP-Kram mit Datenbankzeugs funktioniert. Wenn ich soweit bin, komme ich gerne darauf zurück
     
    Copy for free - Yet another page for free software with soures:
    • BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
    • W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
    • AppStarter (Somewhat like PortableApps launcher)
    • QuakeConsole (Show/Hide windows console with your tilde key)

    Also check my Github Account.

  5. #5
    Registriert seit
    Apr 2001
    Ort
    Hamburg
    Beiträge
    1.296
    Hallo!
    Ich würde die ganzen Verbindungssachen in den Konstruktor der Klasse reinpacken, damit die gleich initialisiert werden, wenn du eine Instanz der Klasse erstellst.
    Außerdem würde ich, wie aber schon gesagt, mysql_fetch_array() in eine weitere Funktion auslagern, da du mit deiner momentanen Version kein komplettes Record Set über mehrere Zeilen ausgeben könntest. Vorallem solltest du vermeiden, von außen auf die Eigenschaften der Klasse zu zugreifen. Das ist ganz böse****** Zwar ergibt sich bei PHP dadurch keine all zu große Gefahr, aber man sollte es sich gar nicht erst angewöhnen. Um deine Klasse variabler zu machen, würde ich dir noch raten, die Verbindungsdaten für deine Datenbank an den Konstruktor zu übergeben und nicht schon in der Klasse direkt anzugeben.
    So das sollte es erstmal gewesen sein.

    P.S. Wenn es sich um so wenig PHP Code handelt, kannst du ihn ruhig direkt hier im Board posten.
     
    --
    GNU/Linux - Weil man echte Freunde nicht kaufen kann

  6. #6
    Registriert seit
    Dec 2001
    Ort
    Hannover
    Beiträge
    4.167
    Ich habe gerade Schwierigkeiten dem ganz zu folgen. Kennt Ihr das, wenn Ihr jeden einzelnen Teil versteht, aber die Gesamtheit nicht?

    Ich habe noch ein wenig daran herumgebastelt, aber jede Klasse die ich mir mal angeschaut habe unterscheidet sich von den anderen obwohl sie das gleiche tun soll...

    Klasse:

    PHP-Code:
    <?php
    // database class
    class db_mysql{
        
    // connection vars
        
    var $db_host "localhost";
        var 
    $db_user "root";
        var 
    $db_pw   "";
        
    // more important vars
        
    var $db_cid;
        var 
    $result;
        var 
    $resnum// noch nicht nötig
        
    function db_mysql_connect(){
            
    $this->db_cid mysql_connect($this->db_host$this->db_user$this->db_pw);
        }
        function 
    db_mysql_dbselect($db_name){
            
    $this->db_name $db_name;
            
    mysql_select_db($this->db_name);
        }
        function 
    db_mysql_query($db_query){
            
    $this->db_query $db_query;
            
    $this->query mysql_query($this->db_query,$this->db_cid);
            
    /*if(substr($query, 0,6) == "SELECT") $this->resnum = mysql_num_rows($this->result);*/
            
    $this->result mysql_fetch_array($this->queryMYSQL_BOTH);
            return 
    $this->result;
        }
        function 
    db_mysql_close(){
            
    mysql_close($this->db_cid);
        }
    }

    ?>
    Instanz:

    PHP-Code:
    $dabatext = new db_mysql();
    $dabatext->db_mysql_connect();
    $dabatext->db_mysql_dbselect("default");
    $dabatext->db_mysql_query("SELECT * FROM `classtabletest` ORDER BY id ASC");
    $dabatext->db_mysql_close();
    print_r($dabatext->result); 
    Könnte mir jemand mit diese Zeilen so hinbiegen wie es 100%ig richtig ist? Es geht nicht darum, das ich eine Klasse brauchen würde, sondern darum das ich alles richtig verstehe. Diese Klasse und Instanzierung hier ist die Summe aller mir bisher vorgeworfenen Happen, die ich mir mit Lektüre von php.net und einigen Beispiel-Klassen zusammengeschustert habe.

    @Caminus:
    Wenn ich jetzt die Verbindungsdaten alle in den Konstruktor reinpacke, dann kann ich sie ja während des Aufrufens definieren (also so flexibel wie möglich halten), oder? Aber wie?

    Ich habe auch schon gemerkt, das ich kein komplettes record set über mehrere Zeilen bekomme (ist im Moment nur eine Zeile, oder?).

    Wie mache ich es denn anders, wenn ich hier momentan von aussen auf die Eigenschaften zugreife?

    Sorry, aber im Moment schwirrt mir echt die Rübe. Ich brauche doch nur ein richtiges Beispiel aus meinen Zeilen, damit ich vergleichen - und somit auch verstehen kann.
    Geändert von Neurodeamon (22.06.05 um 21:30 Uhr)
     
    Copy for free - Yet another page for free software with soures:
    • BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
    • W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
    • AppStarter (Somewhat like PortableApps launcher)
    • QuakeConsole (Show/Hide windows console with your tilde key)

    Also check my Github Account.

  7. #7
    Avatar von DarkSummer
    DarkSummer ist offline Mitglied Brokat
    Registriert seit
    Feb 2002
    Beiträge
    343
    Huhu! , das halt ich für zu umständlich , ich habs bei meiner klasse wenn ich caminus seins richtig gelesen hab so ähnlich gemacht

    ich hab n kontrucktor der die daten für die klasse speichert und danach bei jedem befehl damit die verbindung nicht dauerhaft an ist eine extra klasse die verbindet und true zurückliefert , das kann ich dann bei jeder sache überprüfn und am ende der function mit ner easy close funktion das ganze wider beenden spart meiner meinung nach zeit , zumindestens denk ich das immer , oder es kommt mir so vor

    hier n ausschnitt
    PHP-Code:
      function insert($tabele,$feld,$werte){
        if(
    $this->connect()){ 
    so denk ich mal is es auch net schlecht
     
    Wenn du denkst etwas zu Wissen, die auch Sicher bist so ist der beste weg der Entgegengesetzte der Anwendung des Wissen obwohl es Falsch sein kann als das Richtige zu verschweigen ...

  8. #8
    Registriert seit
    Dec 2001
    Ort
    Hannover
    Beiträge
    4.167
    Ich glaub ich schreib Suaheli oder so... irgendwie hab' ich das Gefühl, das mich keiner versteht.

    Es ist ja auch echt toll, das Ihr mir Verbesserungsvorschläge macht, was ich denn noch alles in die Klasse reintun soll, aber das will ich ja gar nicht - zumindest im Moment nicht.

    Die Klasse - so wie sie ist - habe ich zum laufen bekommen. Ich will doch nur wissen ob das Vorhandene so richtig ist, und wenn nicht, wie es richtig wäre (mit sichtbarem Beispiel).

    Nicht besser, oder mehr oder anders - sondern einfach nur: richtig <-> falsch.

    Die Klasse soll im Moment nur eine Verbindung herstellen, der Verbindung die ID zuweisen, Daten über den Query holen oder einfügen und dann die Verbindung mit der gleichen ID wieder schließen.

    Im Moment bekomme ich auch nur eine Zeile aus der Tabelle, aber das kommt wie die anderen Probleme erst dran, wenn ich die Klasse grundlegend verstanden habe.

    Mehr will ich doch gar nicht ...... *verzweifel*
    Geändert von Neurodeamon (16.06.05 um 20:35 Uhr)
     
    Copy for free - Yet another page for free software with soures:
    • BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
    • W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
    • AppStarter (Somewhat like PortableApps launcher)
    • QuakeConsole (Show/Hide windows console with your tilde key)

    Also check my Github Account.

  9. #9
    Registriert seit
    Apr 2001
    Ort
    Hamburg
    Beiträge
    1.296
    Hi Neuro!
    Solange die Klasse funktioniert, hast du schon mal nichts falsch gemacht. Allerdings kann man noch ne Menge verbessern.
    Ich geh einfach mal die einzelnen Methoden durch und versuche dir ein paar Ansatzpunkte zur Verbesserung zu zeigen.

    PHP-Code:
    <?php

    // database class

    class db_mysql{

        
    // connection vars

        
    var $db_host;
        var 
    $db_user;
        var 
    $db_pw;
        var 
    $db_name;

        
    // more important vars

        
    var $db_cid;
        var 
    $result;
        var 
    $resnum// noch nicht nötig

        
    function db_mysql$host$user$pw$name ) {
            
    $this->db_host $host;
            
    $this->db_user $user;
            
    $this->db_pw $pw;
            
    $this->db_name $name;
            
            
    $this->db_mysql_connect();
        }
        function 
    db_mysql_connect(){

            
    $this->db_cid mysql_connect($this->db_host$this->db_user$this->db_pw);
             
    mysql_select_db($this->db_name$this->db_cid);
        }
    Hier siehst du, dass der Konstruktor so deklariert wurde, sämtliche Daten zu übernehmen und die Klasseneigenschaften zu initialisieren.
    Der Konstruktor ruft dann gleich die Methode db_mysql_connect() auf, damit die Verbindung zur Datenbank hergestellt wird. Somit sparst du dir schon
    mal 3 Aufrufe aus dem Hauptprogramm, da alles über den Konstruktor geregelt wird.

    PHP-Code:

        
    function db_mysql_query($db_query){

            return 
    mysql_query($db_query,$this->db_cid);

            } 
    Nach dem Abschicken eines Querys würde ich mir die Resourcen ID als Rückgabewert ans Hauptprogramm übergeben lassen und von da aus eine weitere
    Methode, db_mysql_fetch_array oder ähnliches, abhängig vom Record Set in einer Schleife oder nur einfach, aufrufen.

    PHP-Code:
           function db_mysql_close(){

            
    mysql_close($this->db_cid);

        } 
    Ein expliziter Aufruf der Methode db_mysql_close() ist nicht nötig, da sämtliche offenen Streams am Scriptende automatisch geschlossen werden.
    Sieht zwar sauberer aus, ist aber nicht notwendig.
    PHP-Code:
    $db = new db_mysql("Server""User""Passwort""Datenbankname"); 
    Mit Erzeugung des Objekts besteht eine Verbindung zur Datenbank, die auf Querys wartet.


    So, ich hoffe, ich habe dir ein bisschen helfen können, falls nicht, einfach noch mal in Suaheli erklären
    Geändert von Patrick Kamin (11.04.03 um 23:37 Uhr)
     
    --
    GNU/Linux - Weil man echte Freunde nicht kaufen kann

  10. #10
    Registriert seit
    Dec 2001
    Ort
    Hannover
    Beiträge
    4.167
    Jaaaah******

    Genau das meinte ich******

    Danggee!! Und nein, ich frage nicht nochmal in Suaheli, denn Du hast auch in Suaheli geantwortet und ich hab kein Wort verstanden
     
    Copy for free - Yet another page for free software with soures:
    • BitUnlocker (Automatic unlock multiple Bitlocker secured drives - if you use the same password)
    • W7 ScrollZoom (Use Windows 7 zoom tool through your mouse wheel)
    • AppStarter (Somewhat like PortableApps launcher)
    • QuakeConsole (Show/Hide windows console with your tilde key)

    Also check my Github Account.

Thema nicht erledigt

Ähnliche Themen

  1. Eigene Klasse serialisieren
    Von Nob im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 16.09.09, 23:02
  2. zugriff auf eigene Klasse
    Von stefan-rw im Forum VisualStudio & MFC
    Antworten: 5
    Letzter Beitrag: 24.10.08, 14:12
  3. eigene Klasse in Form Klasse
    Von PinkoPalino im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 29.07.07, 20:23
  4. Eigene Klasse
    Von kerian im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 13.12.05, 08:04
  5. Eigene Klasse
    Von MaPa2701 im Forum Borland CBuilder und VCL
    Antworten: 1
    Letzter Beitrag: 13.10.05, 08:59