Passer sous PDO
Publié: 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 !
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
2°) On va changer l'instanciation dans le fichier index
3°) On va changer les exécutions de requêtes dans tout les models :
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
J'ouvre le débat sur OpenCart / PDO.
Je comprends pas pourquoi OpenCart n'est pas encore sous PDO !
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