0251 / 590 837 15
info@a-coding-project.de
;

Datenbankklasse Teil 2 (CMS)

In der Datenbankklasse unseres CMS geht es heute hauptsächlich um die Klasse MySQL lediglich kleine Änderungen der Klasse DataBase müssen noch gemacht werden.

Und genau damit fangen wir an. Wie im letzt en Beitrag geschrieben, hatte ich die abstrakte Klasse noch nicht gestet -> Ich hatte ja schließlich keine MySQL Klasse.

Da ich in der geerbten Klasse nicht auf private Vatiablen der Superklasse zugreifen kann, musste ich diese auf Public setzen. Das ist auch nicht weiter schlimm, denn Plugins & Co können sich die Daten so oder so aus der Config Datei ziehen.

Der neue Code der /system/classes/database.php sieht so aus:

<?PHP
  abstract class DataBase{
  
      public $Name     = '';
      public $Prefix   = '';
      public $User     = '';
      public $Password = '';
      public $Host     = '';
      public $Type     = '';
      
      public abstract function Execute($sql);
      public abstract function GetTables();
      public abstract function GetColumns($table);
      public abstract function ReadField($sql);
      public abstract function ReadRow($sql);
      public abstract function ReadRows($sql);
      public abstract function Connect();
      public abstract function Disconnect();
      
      public function __construct($config){
        include($config);
        $this->Prefix   = $dbpraefix;
        $this->Host     = $dbhost;
        $this->Password = $dbpassword;
        $this->User     = $dbuser;
        $this->Name     = $db;
        $this->Connect();
      }
  
  }
?>

Kommen wir zur Klasse MySQL. Dort werden die abstrakten Methoden umgesetzt. Die Verbindung wird in der privaten Variable $connection gespeichert. Der Tabellenprefix wird nun immer über {‚dbprefix‘} angegeben. Dieser wird automatisch in den Datenbankklassen ersetzt. Das hat den Vorteil, das wir nicht immer mit global $dbprefix arbeiten müssen.

Eine weitere Neuerung in unseren Datenbankabfragen ist, dass wir aus der Klasse nur noch Objekte zurückgeben.

Die neue Datenbankklasse liegt in /system/classes/mysql.php und hat den folgenden Quellcode:

<?PHP
  class MySQL extends DataBase{
    private $connection;

    public function Execute($sql){
      return mysql_query(str_replace("{'dbprefix'}",$this->Prefix,$sql));
    } 
    
    public function GetTables(){
      $res = mysql_query("SHOW TABLES");
        while($row = mysql_fetch_row($res)){
          $tables[] = $row[0];
        }
        sort($tables);
      return $tables;
    }
      
    public function GetColumns($table){
      $mysqlres = $this->Execute("SHOW COLUMNS FROM ".$table);
      while($row = mysql_fetch_object($mysqlres)){
        $res[] = $row;
      }
      return $res;
    }
      
    public function ReadField($sql){
      $res = $this->Execute($sql);
      $row = mysql_fetch_row($res);
      return $row[0];
    }
      
    public function ReadRow($sql){
      $res = $this->Execute($sql);
      return mysql_fetch_object($res);
    }
      
    public function ReadRows($sql){
      $mysqlRes = $this->Execute($sql);
      while($row = mysql_fetch_object($mysqlRes)){
        $res[] = $row;
      }
      return $res;
    }
      
    public function Connect(){
      $this->connection = mysql_connect($this->Host,$this->User,$this->Password);
      mysql_select_db($this->Name,$this->connection);
    }
      
    public function Disconnect(){
      mysql_close($this->connection);
    }
  }
?>

Der nächste Schritt wird der wohl brutalste Schritt, den wir bisher gemacht haben. Wir werden nämlich als nächstes die alte Datenbankverbindung entfernen. Dann wird das CMS erst mal überhaupt nicht funktionieren. Nach und nach werden wir dann die Klassen und Dateien auf das neue Datennbankmodell umstellen.

Kommentare

Johann Löwen schrieb am 06.03.2010:

Hi, wieso Greifst du auf die MySQL-Datenbank mit den veralteten Methoden zu? Wieso verwendest du nicht die Objektorientierte MySQL-Klasse http://de.php.net/manual/de/class.mysqli.php

Johann Löwen schrieb am 06.03.2010:

Wolltest du nicht mit "mysql_real_escape_string" schon in der Klasse direkt SQL-Injection verhindern?

Johann Löwen schrieb am 06.03.2010:

Der Link ist besser http://de.php.net/manual/de/book.mysqli.php

Abro schrieb am 07.03.2010:

Und genau das ist einer der Knackpunkte bei solchen Projekten: Abteilung Fertig, was gelernt - Neu schreiben. Darum dauert in der Professionellen Anwendungsentwicklung auch die Planungsphase immer länger als die Umsetzung. Sonst verliert man ettliche Mannmonate, wer kann sich das leisten. Don't try this at home =) Aber meinen ehrlichen Respekt für den Aufwand.

Stefan Wienströer schrieb am 08.03.2010:

Johann: Zu meiner Schande muss ich gestehen, dass ich mit mysqli noch nie etwas gemacht habe, es wird aber heute ein Update geben. mysql_real_escape_string wird in die Klasse nur als escape_string angegeben werden. Das Problem an der Sache ist, dass ich nicht einfach jeden SQL-String durchlaufen kann. Dafür müsste ich schon extra Funktionen für Insert, Update usw. anbieten. Dann würde man aber für ein simples Insert mehrere Zeilen verwenden müssten. @Abro: Da muss ich dir rechtgeben, ich hätte vorher etwas mehr planen sollen. Andererseits ist dies natürlich ein Tutorial an dem das 'was gelernt' ja auch eine Rolle spielt. Es dauert zwar länger, nur am Ende hat man für sich auch was davon.