Pregunta

He estado jugando con PDO durante los últimos días, estoy trabajando en un pequeño sistema de CMS para enseñarme habilidades de OOP, pero aunque es solo un pequeño CMS, quiero que pueda manejar lo que sea la web puede lanzarle.

Esto es lo que se me ocurrió hasta ahora, voy a agregar una agrupación de conexiones al constructor para permitir grandes cantidades de conexiones simultáneas a pedido. Soy muy nuevo en estas cosas de OOP, así que quiero un pequeño consejo y crítica, sin duda he hecho algo terriblemente mal aquí.

Tomé la respuesta principal a Global o Singleton para la conexión de la base de datos? como diseño base, aunque he agregado un constructor privado, ya que quiero usar $ this- > dbConnectionInstance en toda la clase para que utilicen numerosas funciones auxiliares.

Muchas gracias por su tiempo, realmente agradeceré cualquier consejo que me puedan dar,

-Drew

// Usage Example: $dbconn = dbManager::getConnection();
//                $dbconn->query("SELECT * FROM accounts WHERE id=:id", "':id' => $id");

<?php

class dbManager {
    private static $dbManagerInstance;
    private $dbConnectionInstance;
    private $stime;
    private $etime;
    public $timespent;
    public $numqueries;
    public $queries = array();

    public static function getManager(){
        if (!self::$dbManagerInstance){
            self::$dbManagerInstance = new dbManager();
        }
        return self::$dbManagerInstance;
    }

    // Server details stored in definition file
    private function __construct($db_server=DB_SERVER, $db_user=DB_USER, $db_pass=DB_PASS, $db_params=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) {
        if(!$this->dbConnectionInstance)
        {
            try{
                $this->dbConnectionInstance = new PDO($db_server, $db_user, $db_pass, $db_params);
                $this->dbConnectionInstance->setAttribute(PDO::ATTR_PERSISTENT, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                $this->dbConnectionInstance = null;
                die($e->getMessage());
            }
        }
        return $this->dbConnectionInstance;
    }

    private function __destruct(){
        $this->dbConnectionInstance = null;
    }

    private function query($sql, $params = array()) {
        $this->queries[] = $sql;
        $this->numqueries++;
        $this->sTime = microtime();
        $stmt = $this->dbConnectionInstance->prepare($sql);
        $stmt->execute($params);
        $this->eTime = microtime();
        $this->timespent += round($this->eTime - $this->sTime, 4);
        return $stmt;
    }

}

?>

Gracias a los dos por sus sugerencias, ahora agregué la reversión y me comprometí con mi manejo de excepciones, solo estoy investigando el uso de consultas almacenadas, no estoy completamente seguro de lo que me dará.

¿Fue útil?

Solución

Parece bueno, agregaría la funcionalidad rollback , junto con las sugerencias de información almacenada / error de información almacenada (si está utilizando un RDBMS que admite transacciones):

try {
    $this->dbConnectionInstance->beginTransaction();
    $stmt = $this->dbConnectionInstance->prepare($sql);
    $stmt->execute($params);
    $this->dbConnectionInstance->commit();
}catch(PDOException $e){
    $this->dbConnectionInstance->rollback();
}

commit () , beginTransaction ()

EDITAR: se agregaron enlaces a continuación para obtener más información sobre las consultas almacenadas:

Otros consejos

El código que tiene no parece demasiado malo. sin embargo, si pudiera hacer un par de pequeños cambios (principalmente manejo de errores).

tanto las declaraciones de preparación como las de ejecución devolverán falso en caso de error. y puede acceder al error desde $ this- > dbConnectionInstance- > errorInfo () en su ejemplo anterior.

también si planea usar consultas grandes, sugiero usar una consulta almacenada en el búfer: PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY = > verdadero

parece un buen comienzo. Buena suerte en tu CMS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top