Anfänge mit OOP

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

  • Anfänge mit OOP

    Hallo,

    so also ich hab mich jetzt mal ein bischen in OOP eingearbeitet und meine erste kleine Klasse geschrieben. Allerdings habe ich die Datenbankverbindung mit in der Klasse drin, was ja auf Dauer nicht wirklich gut ist, da ich noch mehr Klassen benötige und nicht in jede Klasse die DB Connection drin haben möchte. Weiß allerdings im Moment nicht wirklich wie ich das realisiere. Hier mal meine Klasse:

    PHP-Code:
    class navigation {
        protected 
    $conn;
        protected 
    $user 'root';
        protected 
    $pass '';
        protected 
    $dbname 'top';
        protected 
    $host 'localhost';
        
        public function 
    __construct() {
            
    $this->conn mysql_connect($this->host$this->user$this->pass);
            
    mysql_select_db($this->dbname,$this->conn);
        }
        
       public function 
    getUni() {
            
    $sql "SELECT * FROM kategorie WHERE status = 1 ORDER BY id";
            
    $rs mysql_query($sql$this->conn);    
            
    $result = array();
            while(
    $row mysql_fetch_assoc($rs)) {
                
    $result[] = $row;
            }        
            return 
    $result;
        }
        
        public function 
    getArzt() {
            
    $sql "SELECT * FROM kategorie WHERE status = 2 ORDER BY id";
            
    $rs mysql_query($sql$this->conn);    
            
    $result = array();
            while(
    $row mysql_fetch_assoc($rs)) {
                
    $result[] = $row;
            }        
            return 
    $result;
        }
        
        public function 
    getPatient() {
            
    $sql "SELECT * FROM kategorie WHERE status = 3 ORDER BY id";
            
    $rs mysql_query($sql$this->conn);    
            
    $result = array();
            while(
    $row mysql_fetch_assoc($rs)) {
                
    $result[] = $row;
            }        
            return 
    $result;
        }
            

    protected $conn;
    protected $user = 'root';
    protected $pass = '';
    protected $dbname = 'top';
    protected $host = 'localhost';

    public function __construct() {
    $this->conn = mysql_connect($this->host, $this->user, $this->pass);
    mysql_select_db($this->dbname,$this->conn);
    }
    Dieser teil müsste ja ausgelagert werden. Nur wie genau damit ich dann auch in der anderen Klasse die Select Anfragen starten kann. Wer hat einen Hinweis für mich??

    gruß

    Evilknevil

  • #2
    Singleton

    Kommentar


    • #3
      Danke für den Link aber ein kleiner Codehinweis wäre im Moment bestimmt etwas einfacher zu verstehen.

      gruß

      evilknevil

      Kommentar


      • #4
        Dann such nach "PHP Singleton DB Klasse" oder sowas...

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          So bin schon mal einen Schritt weiter. Aber jetzt zum nächsten Problem:

          Hier meine Db Klasse:

          PHP-Code:
          class dbConnector {
            private 
          $connection NULL;
            private 
          $result NULL;

            private static 
          $uniqueInstance NULL;

            protected function 
          __construct() {}

            private final function 
          __clone() {}


            public static function 
          singleton() {
            if (
          self::$uniqueInstance === NULL) {
              
          self::$uniqueInstance = new dbConnector;
            }
              return 
          self::$uniqueInstance;
            }

            public function 
          connect($host$database$user$pass) {
              
          $this->connection mysql_connect($host,$user,$pass,TRUE);
              
          mysql_select_db($database$this->connection);
            }

            public function 
          disconnect() {
              if (
          is_resource($this->connection)) {
                
          mysql_close($this->connection);
              }
            } 
          Hier meine Klasse:

          PHP-Code:
          class TEST  {

          private 
          $connection;

              function 
          __construct(){
              require_once (
          'class.db.php');

              
          $this->connection dbConnector::singleton();
              
          $this->connection->connect('localhost','top''root''');
              }
              
              
              public function 
          getList() {
                  
          $sql "SELECT * FROM kategorie WHERE status = 1";
                  
          $recordSet mysql_query($sql,$this->connection);
                  
          $results = array();
                  while(
          $row mysql_fetch_assoc($recordSet)) {
                      
          $results[] = $row;
                  }
                  return 
          $results;
              }    
              

          So da kommt ne Fehlermeldung.

          mysql_query(): supplied argument is not a valid MySQL-Link resource

          Er bekommt also keine Verbindung zur DB. Liegt an dieser Zeile:

          $recordSet = mysql_query($sql,$this->connection);

          ich denke mal es liegt an $this->connection. Nur wie rufe ich das ganze richtiog auf damit er ne Verbindung zur DB bekommt?

          Danke schonmal

          Evilknevil

          Kommentar


          • #6
            http://www.php-resource.de/forum/sho...threadid=50454

            Kommentar


            • #7
              PHP-Code:
              class dbConnector {
                private 
              $connection NULL;
                
              // ...

              Die Mysql-Verbindung ist ja auch lediglich in der Klasse gekapselt. Du musst der mysql_query-Funktion aber genau diese Resource übergeben. Also entweder bastelst du dir deine Klasse so, dass du an die DB-Verbindung ran kommst, oder du bastelst dir gleich eine ganze DB-Klasse, so wie er hier das vor hat/hatte!

              Kommentar


              • #8
                Hallo,
                sry wegen Offtopic^^

                @PHP-Desaster
                Ich habs noch immer vor, schau mir nur atm paar Sachen an die ihr im Thread geschrieben habt. Versuch das alles abzuchecken und meine Kentnisse zu erweitern.

                Ich weiß atm nicht genau wie ich alles aufbauen soll.

                Kommentar


                • #9
                  Original geschrieben von hiro
                  Ich weiß atm nicht genau wie ich alles aufbauen soll.
                  grob gesagt erweiterst du deine klasse um die methode query($sql)
                  diese methode setzt den member $this->result in deiner db-klasse und gibt nichts zurück, bei einem fehler einfach eine exception werfen.

                  dann rufst du das ganze so auf (wobei der name connection irreführend ist):
                  $this->connection->query($sql);

                  "while($row = mysql_fetch_assoc($recordSet))" kapselst du dann auch als methode der db-klasse: $row=$this->connection->fetchRow()
                  die methode gibt dir dann ein array (oder auch result-object oder sonstwas) der aktuellen zeile oder false zurück.

                  Kommentar


                  • #10
                    Original geschrieben von 3DMax
                    "while($row = mysql_fetch_assoc($recordSet))" kapselst du dann auch als methode der db-klasse: $row=$this->connection->fetchRow()
                    die methode gibt dir dann ein array (oder auch result-object oder sonstwas) der aktuellen zeile oder false zurück.
                    ähm... also das Ergebnis ist für gewöhnlich ein eigenständiges Objekt, dementsprechend eher sowas
                    PHP-Code:
                    <?php
                    $result 
                    $db->query("SELECT * FROM tabelle");
                    while (
                    $row $result->fetch_assoc()) {
                      
                    print_r($row);
                    }
                    so würde es z.B. auch mit mysqli umgesetzt werden

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      Original geschrieben von ghostgambler
                      ähm... also das Ergebnis ist für gewöhnlich ein eigenständiges Objekt, ...
                      für gewöhnlich?
                      ich habe doch geschrieben, dass es sonstwas sein kann.

                      nur du schreibst: "$row = $result->fetch_assoc())" und das riecht stark nach array.

                      falsch verstanden - du mich - ich dich?

                      Kommentar


                      • #12
                        ok, ghostgambler ich hab's jetzt
                        du möchtest also grundsätzlich das result als objekt mit eigenen methoden zurückgeben.
                        kann man machen, muss man aber nicht.

                        gibst du das result-objekt als referenz zurück, so dass über das db-objekt wieder darauf zugegriffen werden kann?

                        Kommentar


                        • #13
                          Original geschrieben von hamstah
                          Danke für den Link aber ein kleiner Codehinweis wäre im Moment bestimmt etwas einfacher zu verstehen.
                          nagut, dann knall' ich mal meinen gestrigen code hier rein - nicht getestet, aber das grundgerüst sollte stimmen.
                          ist ein erweitertes singleton-pattern, das mehrere diffrenzierte instanzen zulässt.

                          frage mich aber nach wie vor, ob das resultset ein eigenständiges objekt sein sollte, wie ghostgambler vorgeschlagen hat, bin noch am grübeln.

                          PHP-Code:
                          require_once('DB/YaB_I_DB.php');
                          require_once(
                          'DB/YaB_DB_Exception.php');

                          class 
                          YaB_DB_MySQL implements YaB_I_DB
                           
                          {  
                            private static 
                          $instances=array();
                            
                            private 
                          $connection=false;
                            
                            private 
                          $result=false;

                            
                            protected function 
                          __construct()
                             {
                             }

                            private function 
                          __clone()
                             {   
                             }
                             
                            public static function 
                          getInstance($id='default')
                             {
                              if(!isset(
                          self::$instances[$id]))
                               
                          self::$instances[$id]=new YaB_DB_MySQL();
                               
                              return 
                          self::$instances[$id];
                             }
                             
                            public function 
                          connect($server$user$password$database=null)
                             {
                              
                          $this->connection=@mysql_connect($server$user$passwordtrue);
                              
                              if(!
                          is_resource($this->connection))
                               {
                                
                          $e='Failed to connect to database server'.$this->_getError();
                                throw new 
                          YaB_DB_Exception($e);
                               }          

                              if(!
                          is_null($database))
                               
                          $this->selectDB($database);  
                             }   
                             
                            public function 
                          selectDB($db)
                             {
                              if(!
                          is_resource($this->connection))
                               {
                                
                          $e="Not connected to database server, can't select database '{$db}'";
                                throw new 
                          YaB_DB_Exception($e);
                               }
                              
                              if(!
                          mysql_select_db($db$this->connection))
                               {
                                
                          $e="Can't select database '{$db}'".$this->_getError();
                                throw new 
                          YaB_DB_Exception($e);
                               }
                             }   

                            public function 
                          query($sql)
                             {
                              if(!
                          is_resource($this->connection))
                               {
                                
                          $e="Not connected to database server, can't query:\n{$sql}";
                                throw new 
                          YaB_DB_Exception($e);
                               }
                              
                              if(
                          is_resource($this->result))
                               
                          mysql_free_result($this->result);
                               
                              if(!
                          $this->result=mysql_query($sql$this->connection))
                               throw new 
                          YaB_DB_Exception("Invalid query:\n{$sql}".$this->_getError());
                             }

                            public function 
                          escape($str)
                             {
                              if(!
                          is_resource($this->connection))
                               {
                                
                          $e="Not connected to database server, can't escape: {$str}";
                                throw new 
                          YaB_DB_Exception($e);
                               }
                               
                              return 
                          mysql_real_escape_string($str$this->connection);    
                             }
                             
                            public function 
                          fetchRow()
                             {
                              if(!
                          is_resource($this->result))
                               return 
                          false;
                              
                              return 
                          mysql_fetch_assoc($this->result);
                             }

                            public function 
                          getID()
                             {
                              if(!
                          is_resource($this->connection))
                               {
                                
                          $e='Not connected to database server, can\\'t retrieve AUTO_INCREMENT ID';
                                throw new YaB_DB_Exception($e);
                               }

                              return mysql_insert_id($this->connection);   
                             }
                             
                            public function getNum()
                             {
                              //For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning 
                              //resultset, mysql_query() returns a resource on success, or FALSE on error.
                              if(is_resource($this->result))
                               return mysql_num_rows($this->result);
                               
                              //For other type of SQL statements, INSERT, UPDATE, REPLACE or DELETE, etc, 
                              //mysql_query() returns TRUE on success or FALSE on error.
                              if($this->result===true&&is_resource($this->connection))
                               return mysql_affected_rows($this->connection); 

                              return false;
                             }

                            private function _getError()
                             {
                              $is_connected=is_resource($this->connection);

                              $errno=($is_connected) ? mysql_errno($this->connection) : mysql_errno();
                              $errmsg=($is_connected) ? mysql_error($this->connection) : mysql_error();

                              return "\nMySQL-ERRNO: [{$errno}]\nMySQL-ERRMSG: [{$errmsg}]\n";
                             }
                           
                           
                           } 
                          das interface und die exception kneife ich mir mal.

                          Kommentar


                          • #14
                            Original geschrieben von 3DMax
                            ok, ghostgambler ich hab's jetzt
                            du möchtest also grundsätzlich das result als objekt mit eigenen methoden zurückgeben.
                            kann man machen, muss man aber nicht.
                            Es macht aber deutlich mehr Sinn - die Datenbankverbindung modelliert mal als eigenständiges Objekt und das Ergebnis dann auch ... ich weiß nicht, verträgt sich mit meinen Vorstellungen eher

                            gibst du das result-objekt als referenz zurück, so dass über das db-objekt wieder darauf zugegriffen werden kann?
                            öhm... nein?
                            Wozu sollte ich über das db-Objekt auf das Result zugreifen wollen?

                            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                            Wie man Fragen richtig stellt

                            Kommentar


                            • #15
                              Original geschrieben von ghostgambler
                              öhm... nein?
                              Wozu sollte ich über das db-Objekt auf das Result zugreifen wollen?
                              hm, naja, falls du an einer anderen stelle nochmals das letzte abfrageergebnis benötigst
                              dann kannst du per db-singleton bequem darauf zugreifen und musst nicht das reslut-objekt durchreichen.

                              Kommentar

                              Lädt...
                              X