Nous ne répondons seulement qu'aux sujets dont l'auteur a complété sa signature [Lire]


Passer sous PDO

Programmation, discussions et suggestions pour l'amélioration de OpenCart

Passer sous PDO

Messagepar acidline » 02 Avr 2010, 08:10

Bonjour à tous,

J'ouvre le débat sur OpenCart / PDO.

Je comprends pas pourquoi OpenCart n'est pas encore sous PDO ! :evil:

Abstraction déjà effectuée, efficacité, multi support.... bref les raisons sont nombreuses !!!

Pensez vous qu'il faille améliorer OpenCart en passant sous PDO ? Le projet n'en serait-il pas plus pertinent ?

J'apporte un début de solution

1°) Voilà une bien jolie classe qui facilite l'utilisation de PDO avec en prime un singleton sur celui-ci

Code: Tout sélectionner
/**
* PDO SINGLETON CLASS
*
* @author Tony Landis
* @link http://www.tonylandis.com
* @license Use how you like it, just please don't remove or alter this PHPDoc
*/
class sdb
{

   /**
   * The singleton instance
   *
   */
    static private $PDOInstance;
   private $debug = false;
     
   /**
   * Creates a PDO instance representing a connection to a database and makes the instance available as a singleton
   *
   * @param string $dsn The full DSN, eg: mysql:host=localhost;dbname=testdb
   * @param string $username The user name for the DSN string. This parameter is optional for some PDO drivers.
   * @param string $password The password for the DSN string. This parameter is optional for some PDO drivers.
   * @param array $driver_options A key=>value array of driver-specific connection options
   *
   * @return PDO
   */
    public function __construct($dsn, $username=false, $password=false, $driver_options=array())
    {
      
        if(!self::$PDOInstance) {
   
            try {
                self::$PDOInstance = new PDO($dsn, $username, $password, $driver_options);
            } catch (PDOException $e) {
                die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
            }
         }
           return self::$PDOInstance;     
    }
 
     public function debug($debug) {
      $this->debug = (boolean)$debug;
   }
 
   /**
   * Initiates a transaction
   *
   * @return bool
   */
   public function beginTransaction() {
      return self::$PDOInstance->beginTransaction();
   }

   /**
   * Commits a transaction
   *
   * @return bool
   */
   public function commit() {
      return self::$PDOInstance->commit();
   }

   /**
   * Fetch the SQLSTATE associated with the last operation on the database handle
   *
   * @return string
   */
   public function errorCode() {
      return self::$PDOInstance->errorCode();
   }

   /**
   * Fetch extended error information associated with the last operation on the database handle
   *
   * @return array
   */
   public function errorInfo() {
      return self::$PDOInstance->errorInfo();
   }

   /**
   * Execute an SQL statement and return the number of affected rows
   *
   * @param string $statement
   */
   public function exec($statement) {
      return self::$PDOInstance->exec($statement);
   }

   /**
   * Retrieve a database connection attribute
   *
   * @param int $attribute
   * @return mixed
   */
   public function getAttribute($attribute) {
      return self::$PDOInstance->getAttribute($attribute);
   }

   /**
   * Return an array of available PDO drivers
   *
   * @return array
   */
   public function getAvailableDrivers(){
      return self::$PDOInstance->getAvailableDrivers();
   }

   /**
   * Returns the ID of the last inserted row or sequence value
   *
   * @param string $name Name of the sequence object from which the ID should be returned.
   * @return string
   */
   public function lastInsertId($name) {
      return self::$PDOInstance->lastInsertId($name);
   }

   /**
   * Prepares a statement for execution and returns a statement object
   *
   * @param string $statement A valid SQL statement for the target database server
   * @param array $driver_options Array of one or more key=>value pairs to set attribute values for the PDOStatement obj
   returned
   * @return PDOStatement
   */
   public function prepare ($statement, $driver_options=false) {
      if(!$driver_options) $driver_options=array();
      return self::$PDOInstance->prepare($statement, $driver_options);
   }
   

   /**
   * Executes an SQL statement, returning a result set as a PDOStatement object
   *
   * @param string $statement
   * @return PDOStatement
   */
   public function query($statement) {
      if($this->debug === true) {
         echo '<pre>  <strong>queryFetchAllAssoc</strong> => '; var_dump($statement); echo '</pre>';
      }
      return self::$PDOInstance->query($statement);
   }

   /**
   * Execute query and return all rows in assoc array
   *
   * @param string $statement
   * @return array
   */
   public function queryFetchAllAssoc($statement) {
      if($this->debug === true) {
         echo '<pre><strong>queryFetchAllAssoc</strong> => '; var_dump($statement); echo '</pre>';
      }
      return self::$PDOInstance->query($statement)->fetchAll(PDO::FETCH_ASSOC);
   }

   /**
   * Execute query and return one row in assoc array
   *
   * @param string $statement
   * @return array
   */
   public function queryFetchRowAssoc($statement) {
      if($this->debug === true) {
         echo '<pre><strong>queryFetchAllAssoc</strong> => '; var_dump($statement); echo '</pre>';
      }
      return self::$PDOInstance->query($statement)->fetch(PDO::FETCH_ASSOC);   
   }

   /**
   * Execute query and select one column only
   *
   * @param string $statement
   * @return mixed
   */
   public function queryFetchColAssoc($statement) {
      return self::$PDOInstance->query($statement)->fetchColumn();   
   }

   /**
   * Quotes a string for use in a query
   *
   * @param string $input
   * @param int $parameter_type
   * @return string
   */
   public function quote ($input, $parameter_type=0) {
      return self::$PDOInstance->quote($input, $parameter_type);
   }

   /**
   * Rolls back a transaction
   *
   * @return bool
   */
   public function rollBack() {
      return self::$PDOInstance->rollBack();
   }

   /**
   * Set an attribute
   *
   * @param int $attribute
   * @param mixed $value
   * @return bool
   */
   public function setAttribute($attribute, $value ) {
      return self::$PDOInstance->setAttribute($attribute, $value);
   }
   
}


2°) On va changer l'instanciation dans le fichier index

Code: Tout sélectionner
// Database
try {
   $db = new sdb(DB_DRIVER.':host='. DB_HOSTNAME.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD, array());
   Registry::set('db', $db);
} catch(PDOException $e) {
   die( "Erreur ! : " . $e->getMessage() );
}
$db->debug(false);
$db->query("SET NAMES utf8");


3°) On va changer les exécutions de requêtes dans tout les models :

    $this->db->query(REQUETE) devient donc $this->db->exec(REQUETE)
    $TRUC->rows devient donc $TRUC->queryFetchAllAssoc(REQUETE)
    $TRUC->row devient donc $TRUC->queryFetchRowAssoc(REQUETE)

Il s'agit d'une réflexion du Vendredi matin, il manque quelques méthodes dans la classe PDO mais bon... c'est déjà mieux non ?

Nico
Avatar de l’utilisateur
acidline
Utilisateur enregistré
Utilisateur enregistré
 
Messages: 12
Inscription: 01 Avr 2010, 08:00

Re: Passer sous PDO

Messagepar GuinnessBoy » 02 Avr 2010, 15:55

Salut,
C'est pas une mauvaise idée. Surtout que ce sera une nécessité avec PHP 6. Et puis cela libère de la contrainte du SGBD.
Hummmm.... Open Cart avec une base postgres.... :D
A voir toutefois avec le concepteur pour ne pas trop éloigner la VF de l'original.
De passage si j'ai des demandes de clients concernant OpenCart.
Avatar de l’utilisateur
GuinnessBoy
Utilisateur enregistré
Utilisateur enregistré
 
Messages: 17
Inscription: 22 Mar 2010, 21:34
Localisation: Douarnenez BZH

Re: Passer sous PDO

Messagepar acidline » 07 Avr 2010, 08:38

Je suis d'accord avec vous !

C'est vrai que j'ai pas mal de proposition pour améliorer l'existant....

Je sais pas trop qui gère ça directement avec le Big Boss (Admin je pense) mais il faut vraiment améliorer pas mal de petit truc ...

J'en profite pour dire qu'il faut également faire un sérieux tri sur les extensions proposer car pour la plupart c'est vraiment pas top, voir inutile !!!

encore du travail pour les petits codeurs français ! ;)
Avatar de l’utilisateur
acidline
Utilisateur enregistré
Utilisateur enregistré
 
Messages: 12
Inscription: 01 Avr 2010, 08:00


Retourner vers Développement

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron