Ankündigung

Einklappen
Keine Ankündigung bisher.

OOP - Mysql Abfragen machen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • OOP - Mysql Abfragen machen

    Hallo zusammen

    Habs endlich mal geschafft, mich der Thematik OOP anzunehmen.
    An und für sich versteh ich soweit den aufbau, objekte erstellen usw...

    Ausser wenn man OOP mit mysql abfragen verbindet, seh ich noch nicht ganz,
    was am saubersten ist, was zu beachten ist usw.

    hab hier mal ein beispiel, es funktioniert an und für sich, aber möchte gerne wissen, ob das so "state of the art" ist...

    Code:
    <?php
    
    class Test {
    
    	private $db_server 		= "localhost";
    	private $db_name 		= "testdb";
    	private $db_user 		= "xxxx";
    	private $db_passwort 	= "xxxx";
    
    	public $posts			= NULL;
    
    	function __construct() {
    		if(MYSQL_PCONNECT($this->db_server,$this->db_user,$this->db_passwort) && MYSQL_SELECT_DB($this->db_name)) {
    			return true;
    		} else {
    			return false;
    		}
    	}
    
    	function dbQuery($table,$wparam) {
    		$result = mysql_query("SELECT Name, Position, SC FROM $table WHERE Position = '$wparam'");
    		while($row=mysql_fetch_assoc($result)) {
    			$this->posts[] = $row;
    		}
    	}
    
    }
    
    ?>
    und dann die abfrage:
    Code:
    <?php
    
    require_once("classes.php");
    
    $Do = new Test();
    
    //Dominic
    $Do->dbQuery("Steckbrief","Expert");
    
    foreach($Do->posts as $MA) {
    	foreach($MA as $madet) {
    		echo $madet.", ";
    	}
    	echo "<br />";
    }
    
    ?>
    mfG
    Andee


  • #2
    IMHO

    1. Man sollte keine DB Connection im constructor machen, sondern vor dem Aufruf prüfen ob Verbindung besteht und wenn nein, dann connecten.
    2. Deine Klasse kann nur von einer Tabelle lesen, geschickter wäre es vielleicht einfach einen SQl-String zu übergeben oder ein Objekt, das einen SQL-String rendert, ähnlich wies in vielen Frameworks gemacht wird.
    3. deine Klasse fetch immer ASSOC, vielleicht ein paar funktionen machen, die z.B. einzelne ergebnisse fetchen, alle, Paare, und was dir da sonst noch so einfallen kann.
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

    Kommentar


    • #3
      4. $Do->posts
      Zugriffe auf Properties sind nicht so das Mittel der Wahl bei der OOP
      5. $Do->posts
      Überhaupt stellt das eher eine Verschlimmbesserung dar. Bei mysql(i) kannst Du Datensätze einzeln fetchen, hier musst DU immer alles auslesen und kannst die Auswahl nur über die Schleife steuern, was bei großen Tabellen absolut übel ist. Die Performance frisst nämlich die DB-Abfrage
      6. private $db_server = "localhost";
      Keine Möglichkeit diese Daten zu ändern. Dein Objekt wird damit ein unflexibler Spezialist, was es nicht sein dürfte.

      "state of the art"
      Naja, es gibt viele Philosophien bei der OO, siehe auch 4.
      Relativer Konsens herrscht darüber, dass reine DB-Wrapper nicht viel bringen, erst recht nicht, wenn sie im Endeffekt die Funktionalität einschränken, wie Deine. Was ist mit
      - einzelnen Fetchings
      - reset der Ressource
      - last insert id
      ...
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Hab dir mal was schnell zusammen geschrieben, habs nicht getestet, und es fehlt noch ganz ganz viel Funktionalität dahinter, aber wenn du eine DB-wrapper schreiben willst, würde ich sowas in der Art machen, nur eben besser
        PHP-Code:
        <?php
        error_reporting
        (-1);


        class 
        Db {
            protected 
        $host$user$passwd$db;
            protected 
        $connection null;
            protected 
        $sql$dbResult;
            
            public function 
        __construct($host$user$passwd$db) {
                
        $this->host $host;
                
        $this->user $user;
                
        $this->passwd $passwd;
                
        $this->db $db;
            }
            
            private function 
        _connect() {
                
        $this->_connection mysql_connect($this->host$this->user$this->passwd);
                
        mysql_select_db($this->db);
            }
            
            public function 
        queryAll($sql) {
                
        $this->sql $sql;
                
        $this->_query();
                
                
        $tmp = array();
                while (
        $r mysql_fetch_array($this->dbResultMYSQL_ASSOC)) {
                    
        $tmp[] = $r;
                }
                return 
        $tmp;
            }
            
            public function 
        queryOne($sql) {
                
        $this->sql $sql;
                
        $this->_query();
                
                
        $res mysql_fetch_row($this->dbResult);
                return 
        $res[0];
            }
            
            private function 
        _query() {
                if (
        null === $this->connection) {
                    
        $this->_connect();
                }
                
        $this->dbResult mysql_query($this->sql);
                if (
        false === $this->dbResult) {
                    throw new 
        Exception('db error: ' mysql_error());
                }
            }
        }
        "My software never has bugs, it just develops random features."
        "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

        Kommentar


        • #5
          PHP-Code:
                  $res mysql_fetch_row($this->dbResult);
                  return 
          $res[0]; 
          Is it a bug or a feature? Der Methodenname ist doppeldeutig.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Feature.
            Ich denke fu meinst für die Row gibts dann noch ne Methode , zum Bleistift queryRow. Wenn du was anderes meinst, hab ich grad keine Ahnung was du willst...
            "My software never has bugs, it just develops random features."
            "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

            Kommentar


            • #7
              Hab grad gesehn, was macht eigentlich mysql_fetch_field? Wär das vielleicht besser angebracht hier? Hab ich noch nie benutzt und eben erst entdeckt
              Ah vergiss es, hab eben den Rückgabewert entdeckt, völliger kappes.
              "My software never has bugs, it just develops random features."
              "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

              Kommentar


              • #8
                Ja, fetchRow meinte ich.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Ja ich hab bei meinen Wrapper den ich mir gebaut habe immer:
                  getOne, getRow, getAll, getAssoc, getCol, getLastInsertedId, query, multipleInsert
                  und der Rest fällt mir grad nimmer ein!
                  Und außerdem:
                  Zitat von Paul.Schramenko Beitrag anzeigen
                  aber wenn du eine DB-wrapper schreiben willst, würde ich sowas in der Art machen, nur eben besser
                  "My software never has bugs, it just develops random features."
                  "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                  Kommentar


                  • #10
                    Und wie ich gesagt habe: "Relativer Konsens herrscht darüber, dass reine DB-Wrapper nicht viel bringen"

                    DB-Wrapper mögen die Bequemlichkeit fördern, gutes OOD sieht aber sicher anders aus.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Ja das stimmt wohl, ich persönlich mag sie.
                      "My software never has bugs, it just develops random features."
                      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                      Kommentar

                      Lädt...
                      X