PDO

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

PDO

Beitrag von Megger » 18.10.2011, 17:14:48

Hi

Ich habe mich mal an das Thema PDO gewagt, bisher habe ich einen minimalen Aufbau erzeugt
/core/database/PDOHandler.php

Code: Alles auswählen

<?php
/**
* <!--
* This file is part of the adventure php framework (APF) published under
* http://adventure-php-framework.org.
*
* The APF is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The APF is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the APF. If not, see http://www.gnu.org/licenses/lgpl-3.0.txt.
* -->
*/
import('core::database', 'AbstractDatabaseHandler');
import('core::database', 'DatabaseHandlerException');
/**
* @author Tobias Lückel
* @version
* Version 0.1, 18.10.2011<br />
*/
 
class PDOHandler extends AbstractDatabaseHandler {

    public function __constuct() {
        $this->__dbLogFileName = 'pdo';
    }

    /**
     * @protected
     *
     * Provides internal service to open a database connection.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 10.02.2008<br />
     */
    protected function __connect()
    {
        $dsn = $this->getDSN();

        if ($this->__dbDebug == true) {
            $this->__dbLog->logEntry($this->__dbLogFileName,
                     '[MySQLiHandler::executeTextStatement()] Current DSN: ' . $dsn,
                     'DEBUG');
        }

        $this->__dbConn = new PDO($dsn, $this->__dbUser, $this->__dbPass);
        $this->__dbConn->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->initCharsetAndCollation();
    }

    /**
     * @protected
     *
     * Provides internal service to close a database connection.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 10.02.2008<br />
     */
    protected function __close()
    {
        $this->__dbConn = null;
    }

    /**
     * @public
     *
     * Executes a statement, located within a statement file. The place holders contained in the
     * file are replaced by the given values.
     *
     * @param string $namespace Namespace of the statement file.
     * @param string $statementName Name of the statement file (filebody!).
     * @param string[] $params A list of statement parameters.
     * @param bool $logStatement Indicates, if the statement is logged for debug purposes.
     * @return resource The database result resource.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 10.02.2008<br />
     */
    public function executeStatement($namespace, $statementName, array $params = array(), $logStatement = false)
    {
        // TODO: Implement executeStatement() method.
    }

    /**
     * @public
     *
     * Executes a statement applied as a string to the method and returns the
     * result pointer.
     *
     * @param string $statement The statement string.
     * @param boolean $logStatement Inidcates, whether the given statement should be
     *                              logged for debug purposes.
     * @return resource The database result resource.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 10.02.2008<br />
     */
    public function executeTextStatement($statement, $logStatement = false)
    {
        if ($this->__dbDebug == true || $logStatement == true) {
            $this->__dbLog->logEntry($this->__dbLogFileName,
                 '[MySQLiHandler::executeTextStatement()] Current statement: ' . $statement,
                 'DEBUG');
        }

        $result = $this->__dbConn->query($statement);

        $error = $this->__dbConn->errorInfo();
        $errno = $this->__dbConn->errorCode();

        if ((!empty($error) || !empty($errno)) &&
            $errno != 00000 && isset($error[1]) && isset($error[2])) {
            $message = '(' . $errno . ') '.print_r($error,true).' (Statement: ' . $statement . ')';
            $this->__dbLog->logEntry($this->__dbLogFileName, $message, 'ERROR');
            throw new DatabaseHandlerException('[PDOHandler->executeTextStatement()] ' . $message);
        }

        $this->__lastInsertId = $this->__dbConn->lastInsertId();

        return $result;
    }

    /**
     *
     */
    public function prepareStatement($statement) {
        return $this->__dbConn->prepare($statement);
    }

    /**
     * @public
     *
     * Fetches a record from the database using the given result resource.
     *
     * @param resource $resultCursor The result resource returned by executeStatement() or executeTextStatement().
     * @param int $type The type the returned data should have. Use the static *_FETCH_MODE constants.
     * @return string[] The associative result array. Returns false if no row was found.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 20.09.2009<br />
     * Version 0.2, 08.08.2010 (Added optional second parameter) <br />
     */
    public function fetchData($resultCursor, $type = self::ASSOC_FETCH_MODE)
    {
        if ($resultCursor == null) {
            return array();
        }

        if ($type === self::ASSOC_FETCH_MODE) {
            $return = $resultCursor->fetch(PDO::FETCH_ASSOC);
        } elseif ($type === self::OBJECT_FETCH_MODE) {
            $return = $resultCursor->fetch(PDO::FETCH_OBJ);
        } else {
            $return = $resultCursor->fetch(PDO::FETCH_BOTH);
        }

        if ($return === NULL) {
            return false;
        }
        return $return;
    }

    /**
     * @public
     *
     * Escapes given values to be SQL injection save.
     *
     * @param string $value The unescaped value.
     * @return string The escapted string.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 23.02.2008<br />
     */
    public function escapeValue($value)
    {
        // TODO: Implement escapeValue() method.
    }

    /**
     * @public
     *
     * Returns the amount of rows, that are affected by a previous update or delete call.
     *
     * @param resource $resultCursor The result resource pointer.
     * @return int The number of affected rows.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 24.02.2008<br />
     */
    public function getAffectedRows($resultCursor)
    {
        // TODO: Implement getAffectedRows() method.
    }

    /**
     * @public
     *
     * Returns the number of selected rows by the given result resource.
     *
     * @param $result The result resource.
     * @return int The number of selected rows.
     *
     * @author Christian Achatz
     * @version
     * Version 0.1, 12.03.2011 (Added missing interface method.)<br />
     */
    public function getNumRows($result)
    {
        // TODO: Implement getNumRows() method.
    }

    private function getDSN() {
        $dsn = '';
        switch (strtolower($this->__dbPDO)) {
            case 'mysql':
            case 'mysqli':
                if (isset($this->__dbSocket) && $this->__dbSocket != '') {
                    $dsn = 'mysql:unix_socket='.$this->__dbSocket;
                } else {
                    $dsn = 'mysql:host=';
                    if (isset($this->__dbHost)) {
                        $dsn .= $this->__dbHost;
                    } else {
                        $dsn .= 'localhost';
                    }
                    if (isset($this->__dbPort)) {
                        $dsn .= ';port='.$this->__dbPort;
                    }
                }
                $dsn .= ';dbname='.$this->__dbName;
                break;
        }
        return $dsn;
    }
}
?>
Damit das ganze lauffähig ist, müssen ein paar Änderungen vorgenommen werden.

Beim AbstractDatabaseHandler habe ich als Konfigurationsparameter noch Port, Socket und PDO eingefügt, wobei PDO eher eine Übergangslösung zum Testen ist. Die Parameter werden als protected definiert und innerhalb der init Methode dann nach Möglichkeit initialisiert.
/core/database/AbstractDatabaseHandler.php

Code: Alles auswählen

/**
    * <!--
    * This file is part of the adventure php framework (APF) published under
    * http://adventure-php-framework.org.
    *
    * The APF is free software: you can redistribute it and/or modify
    * it under the terms of the GNU Lesser General Public License as published
    * by the Free Software Foundation, either version 3 of the License, or
    * (at your option) any later version.
    *
    * The APF is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU Lesser General Public License for more details.
    *
    * You should have received a copy of the GNU Lesser General Public License
    * along with the APF. If not, see http://www.gnu.org/licenses/lgpl-3.0.txt.
    * -->
    */

   import('core::logging', 'Logger');

   /**
    * @package core::database
    * @class AbstractDatabaseHandler
    * @abstract
    *
    * Defines the scheme of a database handler. Forms the base class for all database
    * abstraction layer classes.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1, 10.02.2008<br />
    * Version 0.2, 07.08.2010 (Added *_FETCH_MODE constants and optional second fetchData() parameter)<br />
    */
   abstract class AbstractDatabaseHandler extends APFObject {
   
      const ASSOC_FETCH_MODE = 1;
      const OBJECT_FETCH_MODE = 2;
      const NUMERIC_FETCH_MODE = 3;
      
      /**
       * @protected
       * @var boolean Indicates, whether the handler is already initialized or not.
       */
      protected $__isInitialized = false;

      /**
       * @protected
       * @var string Database server.
       */
      protected $__dbHost = null;

      /**
       * @protected
       * @var int Database port
       */
      protected $__dbPort = 0;

      /**
       * @protected
       * @var string Database user.
       */
      protected $__dbUser = null;

      /**
       * @protected
       * @var string Password for the database.
       */
      protected $__dbPass = null;

      /**
       * @protected
       * @var string Socket for teh database
       */
      protected $__dbSocket = null;

      /**
       * @protected
       * @var string Database Type for the PDO Connection
       */
      protected $__dbPDO = null;

      /**
       * @protected
       * @var string Name of the database.
       */
      protected $__dbName = null;

      /**
       * @protected
       * @var boolean Indicates, if the handler runs in debug mode. This means, that all
       * statements executed are written into a dedecated logfile.
       */
      protected $__dbDebug = false;

      /**
       * @protected
       * @var resource Database connection resource.
       */
      protected $__dbConn = null;

      /**
       * @protected
       * @var Logger Instance of the logger.
       */
      protected $__dbLog = null;

      /**
       * @protected
       * @var string Name of the log file. Must be defined within the implementation class!
       */
      protected $__dbLogFileName;

      /**
       * @protected
       * @var int Auto increment id of the last insert.
       */
      protected $__lastInsertID;

      /**
       * @protected
       * @var string Indicates the charset of the database connnection.
       *
       * For mysql databases, see http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
       * for more details.
       */
      protected $__dbCollation = null;

      /**
       * @protected
       * @var string Indicates the collation of the database connnection.
       * 
       * For mysql databases, see http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
       * for more details.
       */
      protected $__dbCharset = null;

      /**
       * @public
       *
       * Implements the init() method, so that the derived classes can be initialized
       * by the service manager. Initializes the handler only one time.
       *
       * @param array $initParam Associative configuration array.
       *
       * @author Christian Achatz
       * @version
       * Version 0.1, 10.02.2008<br />
       */
      public function init($initParam){

         if($this->__isInitialized == false){

            // set server host
            if(isset($initParam['DB.Host'])){
               $this->__dbHost = $initParam['DB.Host'];
            }

            // set server port
            if(isset($initParam['DB.Port'])){
                $this->__dbPort = $initParam['DB.Port'];
            }

            // set user name
            if(isset($initParam['DB.User'])){
               $this->__dbUser = $initParam['DB.User'];
            }

            // set password
            if(isset($initParam['DB.Pass'])){
               $this->__dbPass = $initParam['DB.Pass'];
            }

            // set socket
             if(isset($initParam['DB.Socket'])) {
                 $this->__dbSocket = $initParam['DB.Socket'];
             }

             // set PDO param
             if(isset($initParam['DB.PDO'])) {
                 $this->__dbPDO = $initParam['DB.PDO'];
             }

            // set name of the database
            $this->__dbName = $initParam['DB.Name'];

            // set debug mode
            if(isset($initParam['DB.DebugMode']) && ($initParam['DB.DebugMode'] == 'true' || $initParam['DB.DebugMode'] == '1')){
               $this->__dbDebug = true;
            }

            // set connection charset and collation
            if(isset($initParam['DB.Charset'])){
               $charset = trim($initParam['DB.Charset']);
               if(!empty($charset)){
                  $this->__dbCharset = $charset;
               }
            }
            if(isset($initParam['DB.Collation'])){
               $collation = trim($initParam['DB.Collation']);
               if(!empty($collation)){
                  $this->__dbCollation = $collation;
               }
            }

            $this->__dbLog = &Singleton::getInstance('Logger');
            $this->__isInitialized = true;
            $this->__connect();

         }

      }
    ...
    ...
    ...
 
Die Konfigurationsdatei hat ein paar zusätzliche "Felder" bekommen

Code: Alles auswählen

[PDO_MySQL]
DB.Host = "localhost"
DB.User = "username"
DB.Pass = "geheim"
DB.Socket = "/tmp/mysql5.sock"
DB.Name = "databasename"
DB.Type = "PDO"
DB.DebugMode = "true"
; sets the charset of the connection, the result, and the database
DB.Charset = "utf8"
; sets the collation of the connection and the database
DB.Collation = "utf8_general_ci"
DB.PDO = "MySQL"
Damit man den DSN String für PDO zusammenbauen kann, wird DB.PDO benötigt. Allerdings finde ich das nicht wirklich super den Parameter so mitzugeben, aber eine eigene Konfigurationsdatei nur für PDO finde ich auch blöd.

Damit kann man im Grunde genommen alle möglichen Datenbanksystem ansteuern, PDO stellt allerdings keine eigene Syntax wie z.B. Doctrine zur Verfügung, d.h. man muss die Statements selber den Gegebenheiten des jeweiligen Datenbanksystems anpassen.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 18.10.2011, 21:37:12

Hi Tobi,

kannst du noch den fehlenden Code posten? ;) Hast du dir mal das "Interface" des AbstractDatabaseHandler hinsichtlich Konsolidierung mit PDO angesehen oder deute ich dein Statement richtig, dass das Interface so auch für PDO passt?
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 18.10.2011, 21:47:31

Habe vom AbstractDatabaseHandler nur das gepostet, was ich verändert habe, d.h. die Variablen und die initMethode den Rest habe ich erstmal so gelassen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 18.10.2011, 21:52:08

Und der PDOHandler? ;)
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 18.10.2011, 22:14:38

Ohhh da habe ich wohl Strg+V vergessen :D

Habe es ergänzt

Edit:
Wenn ich code=php verwende, dann verschwindet der Code einfach
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 18.10.2011, 23:47:28

Hmm, das ist komisch. Ich werde das Board jedoch ohnehin in den nächsten Tagen aktualisieren, vielleicht ist es dann besser.

Danke schon mal für deine Arbeit, ich schau's mir zeitnah an.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 11.04.2012, 15:21:00

Hier mal eine aktuelle Version der ganzen Geschichte

(Habe es bei PasteBin eingefügt, da es hier verschwindet, wenn man es in PHP Tags einschließt)
http://pastebin.com/KYpAvjHj

Weitere nötige Anpassungen
- Konfiguration erhält den neun Parameter 'db.PDO', damit der PDOHandler weiß, womit er sich verbinden soll bzw. welcher DBDriver verwendet werden soll
- Dem AbstractDatabaseHandler muss dieser neue Parameter mitgeteilt werden

Es handelt sich nur um die nötigsten Ausschnitte des AbstractDatabaseHandler (Variablen und init()-Methode)

Code: Alles auswählen

/**
 * @package core::database
 * @class AbstractDatabaseHandler
 * @abstract
 *
 * Defines the scheme of a database handler. Forms the base class for all database
 * abstraction layer classes.
 *
 * @author Christian Achatz
 * @version
 * Version 0.1, 10.02.2008<br />
 * Version 0.2, 07.08.2010 (Added *_FETCH_MODE constants and optional second fetchData() parameter)<br />
 * Version 0.3, 11.04.2012 (Added support for PDO database connection - Tobias Lückel (megger))<br />
 */
abstract class AbstractDatabaseHandler extends APFObject {

   const ASSOC_FETCH_MODE = 1;
   const OBJECT_FETCH_MODE = 2;
   const NUMERIC_FETCH_MODE = 3;

   /**
    * @protected
    * @var boolean Indicates, whether the handler is already initialized or not.
    */
   protected $__isInitialized = false;

   /**
    * @protected
    * @var string Database server.
    */
   protected $__dbHost = null;

   /**
    * @protected
    * @var string Database user.
    */
   protected $__dbUser = null;

   /**
    * @protected
    * @var string Password for the database.
    */
   protected $__dbPass = null;

   /**
    * @protected
    * @var string Name of the database.
    */
   protected $__dbName = null;

   /**
    * @protected
    * @var string Port for connection.
    */
   protected $__dbPort = null;

   /**
    * @protected
    * @var string Socket for connection.
    */
   protected $__dbSocket = null;

   /**
    * @protected
    * @var string Database type for pdo connection
    */
   protected $__dbPDO = null;

   /**
    * @protected
    * @var boolean Indicates, if the handler runs in debug mode. This means, that all
    * statements executed are written into a dedicated logfile.
    */
   protected $__dbDebug = false;

   /**
    * @protected
    * @var resource Database connection resource.
    */
   protected $__dbConn = null;

   /**
    * @protected
    * @var Logger Instance of the logger.
    */
   protected $__dbLog = null;

   /**
    * @protected
    * @var string Name of the log file. Must be defined within the implementation class!
    */
   protected $__dbLogFileName;

   /**
    * @protected
    * @var int Auto increment id of the last insert.
    */
   protected $__lastInsertID;

   /**
    * @protected
    * @var string Indicates the charset of the database connection.
    *
    * For mysql databases, see http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
    * for more details.
    */
   protected $__dbCollation = null;

   /**
    * @protected
    * @var string Indicates the collation of the database connection.
    *
    * For mysql databases, see http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
    * for more details.
    */
   protected $__dbCharset = null;

   /**
    * @public
    *
    * Implements the init() method, so that the derived classes can be initialized
    * by the service manager. Initializes the handler only one time.
    *
    * @param array $initParam Associative configuration array.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1, 10.02.2008<br />
    * Version 0.2, 11.04.2012 (Added support for PDO database connection - Tobias Lückel (megger))<br />
    */
   public function init($initParam) {

      if ($this->__isInitialized == false) {

         // set server host
         if (isset($initParam['DB.Host'])) {
            $this->__dbHost = $initParam['DB.Host'];
         }

         // set user name
         if (isset($initParam['DB.User'])) {
            $this->__dbUser = $initParam['DB.User'];
         }

         // set password
         if (isset($initParam['DB.Pass'])) {
            $this->__dbPass = $initParam['DB.Pass'];
         }

         // set name of the database
         $this->__dbName = $initParam['DB.Name'];

         // set port
         if (isset($initParam['DB.Port'])) {
            $this->__dbPort = $initParam['DB.Port'];
         }

         // set socket
         if (isset($initParam['DB.Socket'])) {
            $this->__dbSocket = $initParam['DB.Socket'];
         }

         // set database type for pdo connection
         if (isset($initParam['DB.PDO'])) {
             $this->__dbPDO = $initParam['DB.PDO'];
         }

         // set debug mode
         if (isset($initParam['DB.DebugMode']) && ($initParam['DB.DebugMode'] == 'true' || $initParam['DB.DebugMode'] == '1')) {
            $this->__dbDebug = true;
         }

         // set connection charset and collation
         if (isset($initParam['DB.Charset'])) {
            $charset = trim($initParam['DB.Charset']);
            if (!empty($charset)) {
               $this->__dbCharset = $charset;
            }
         }
         if (isset($initParam['DB.Collation'])) {
            $collation = trim($initParam['DB.Collation']);
            if (!empty($collation)) {
               $this->__dbCollation = $collation;
            }
         }

         $this->__dbLog = &Singleton::getInstance('Logger');
         $this->__isInitialized = true;
         $this->__connect();

      }

   }
 
Es handelt sich nur um die nötigsten Ausschnitte des AbstractDatabaseHandler (Variablen und init()-Methode)

Die Implementierung ist bisher noch nicht komplett getestet

Anwendung:
Konfigurationsdatei

Code: Alles auswählen

[PDO_MySQL]
DB.Host = "localhost"
DB.User = "user"
DB.Pass = "pass"
DB.Socket = "/tmp/mysql5.sock"
DB.Name = "database"
DB.Type = "PDO"
DB.DebugMode = "true"
; sets the charset of the connection, the result, and the database
DB.Charset = "utf8"
; sets the collation of the connection and the database
DB.Collation = "utf8_general_ci"
DB.PDO = "MySQL"

Code: Alles auswählen

$connectionManager = $this->getServiceObject('core::database', 'ConnectionManager');
$dbDriver = $connectionManager->getConnection('PDO_MySQL');
 
Getestet habe ich es bisher folgendermaßen:

Code: Alles auswählen

$connectionManager = $this->getServiceObject('core::database', 'ConnectionManager');
$dbDriver = $connectionManager->getConnection('PDO_MySQL');
$textStatement = "SELECT Feld1, Feld2 FROM Tabelle WHERE ID = :TabelleId";
$tabelleStatement = $dbDriver->prepare($textStatement);
$tabelleStatement->execute(array(':TabelleId' => 1));

//$row = $tabelleStatement->fetch(PDO::FETCH_OBJ) wäre auch möglich
while ($row = $dbDriver->fetchData($tabelleStatement, AbstractDatabaseHandler::OBJECT_FETCH_MODE)) { 
   ...
}
 
Bisher habe ich es nur für MySQL implementiert, aber um andere Datenbanktreiber zu unterstützen muss man für diese die getDSN()-Methode anpassen, sodass ein passender DSN zurückgeliefert wird!
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 11.04.2012, 21:30:34

Hallo Tobi,

danke für deine Arbeit. Hälst du es für eine gute Idee, der init() zukünftig ein Configuration-Objekt als Parameter mitzugeben? Dann könnte man sich die konkrete Initialisierung im ConnectionManager sparen und für den PDOHandler entsprechend ausimplementieren. Diese Änderung betrifft zwar zunächst alle Treiber, ist aber trotzdem für die Zukunft einfacher.

Nachteil ist natürlich, dass sich jeder Treiber selbst um die Service-Manager-Mechanismen (--> isInitialized) kümmern müsste. Der Nacheil wiegt aber für mich nicht so stark, denn er geht ohnehin die konkrete Implementierung an, nicht die abstrakte.

EDIT: zudem liegt mir die Optimierung der Signatur schon lange am Herzen. :) Hier könnten wir als zwei Fliegen mit einer Klappe schlagen und etwas aufräumen.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 12.04.2012, 16:16:05

Klingt interessant!

Aber die Initialisierung würde doch im AbstractDatabaseHandler bleiben, oder?

Wäre aber auf jeden Fall sinnvoll wenn man noch andere Implementierungen hat und diese andere bzw. weitere Konfigurationsparameter benötigt!
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 12.04.2012, 20:56:51

Die grundlegende Initialisierung der Parameter würde im AbstractDatabaseHandler bleiben, die spezifische jedoch in die konkrete Implementierung verschoben werden. So erreichen wir eine bessere Einhaltung von SoC. Soll ich einen Vorschlag posten?
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 12.04.2012, 21:03:12

Das Problem ist nur der Aufruf von __connect in der init()-Methode, aber ansonsten klingt es vernüftig
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 13.04.2012, 17:27:31

Hi Tobi,

ich habe den Code nun lokal bei mir eingebaut und entsprechend meinen Beschreibungen umgestaltet. Aktuell teste ich das noch und checke es am Wochenende für einen Test ein. Passt das für dich?
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 13.04.2012, 17:40:07

Ja kein Problem
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: PDO

Beitrag von dr.e. » 13.04.2012, 19:01:27

Hallo Tobi,

ich habe die Änderungen nun eingecheckt (Revision #1696). Schau dir meine Änderungen mal an und gib mir Feedback, ob das aus deiner Sicht so passt. Effektiv habe ich das Refactoring doch nicht so krass betrieben, damit ich die Signaturen nicht zu sehr ändere.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: PDO

Beitrag von Megger » 16.04.2012, 11:04:12

Hi

An sich passt die Änderung so, gefällt mir und erhalte auch keine Fehler in meiner Testanwendung!
Nur einen kleinen Fehler -> "const SEVERITY_DEBUG = 'DEBUG';" fehlt in der Klasse LogEntry
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast