Ver Mensaje Individual
  #3 (permalink)  
Antiguo 30/08/2010, 03:03
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 9 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por portalmana Ver Mensaje
Bueno no tengo del todo claro lo de PDO, puesto que hace poco estoy investigando el tema....
Pero con respecto a tus inquietudes lo que tengo entendido y saque en limpio es lo siguiente:
1> Si es cierto, pero si usas las sentencias preparadas y aparte utilizas en tus consulta o ? o :categoria que son los placeholders o marcadores, que indican que en ese lugar va a ir un valor. En ese caso si la variable es sanada, no en el caso que ya pases la consulta directamente.

2> Generalmente en producción, se trata de no volcar errores por pantalla que puedan dar información de la estructura de tu base, pero si capturas todos los errores y los cambias por otro tipo de mensaje quizás no tengas problemas.

3> Lo que sacaría es el uso del sprintf de:
$query = sprintf("SELECT nombre FROM categorias");
No tiene mucho sentido pues no das formato ni insertas variables a la consulta.
Lo mismo que en $query = sprintf("INSERT INTO categorias (nombre) values ('$this->nombreCategoria')"); pues ya le pasas la variable
Generalmente se usa para consultas prefabricadas y tu solo le pasas los parametros...
En el segundo caso podrías variar por ejemplo
Código PHP:
Ver original
  1. $sql = "INSERT INTO categorias (nombre) values (%s) ";
  2. $query= sprintf( $sql, $this->nombreCategoria );

O puedes usar las consultas preparadas de PDO con los marcadores, que en el enlace que dejas te muestra como se hace.

4> En lo personal me parece mas practico tener una clase separada como la tienes.

5> Si utilizas una instancia, pues estas usando un patrón singleton, es decir tu no accedes directamente al constructor pues este es privado, entonces lo haces con DB::getInstance() que lo que hace es fijarse si ya se instancio la clase si es así te retorna la instancia que ya tiene si no genera la instancia y te la retorna...

Espero te sea de ayuda...
Saludos
Muchas gracias portalmana, no pude responder antes por problemas en la conexión ADSL. Me aclaraste las dudas que tenía. Mil gracias.

Para usar los datos de acceso, en lugar de escribirlos hardcore en la la clase, verdad que puedo tener una clase llamada configBD y cogerlos desde ahí, de la siguiente forma?

Es correcto hacerlo así, cambiaríais algo?

Código PHP:
Ver original
  1. class ConfigBD{
  2.     public $DBServer;
  3.     public $DBName;
  4.     public $UserName;
  5.     public $Password;
  6.    
  7.     function __construct($DBServer,$UserName,$Password,$DBName){
  8.         $this->DBServer=$DBServer;
  9.         $this->UserName=$UserName;
  10.         $this->Password=$Password;
  11.         $this->DBName=$DBName;
  12.     }
  13. }

Código PHP:
Ver original
  1. class db{
  2.     /*** Declare instance ***/
  3.     private static $instance = NULL;
  4.  
  5.     /**
  6.     *
  7.     * the constructor is set to private so
  8.     * so nobody can create a new instance using new
  9.     *
  10.     */
  11.     private function __construct() {
  12.       /*** maybe set the db name here later ***/
  13.     }
  14.  
  15.     /**
  16.     *
  17.     * Return DB instance or create intitial connection
  18.     *
  19.     * @return object (PDO)
  20.     *
  21.     * @access public
  22.     *
  23.     */
  24.     public static function getInstance() {
  25.  
  26.     if (!self::$instance)
  27.         {
  28.         $conexion = new ConfigBD("localhost","root","jupiter","codelab");
  29.         self::$instance = new PDO("mysql:host=$conexion->DBServer;dbname=$conexion->DBName",$conexion->UserName,$conexion->Password);; //asi funciona y con variables NO.
  30.         self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  31.         }
  32.     return self::$instance;
  33.     }
  34.  
  35.     /**
  36.     *
  37.     * Like the constructor, we make __clone private
  38.     * so nobody can clone the instance
  39.     *
  40.     */
  41.     private function __clone(){
  42.     }
  43.  
  44. } /*** end of class ***/
  45.  
  46. class Categoria{
  47.     private $nombreCategoria;
  48.    
  49.     // Listar todas las categorias de la base de datos
  50.     public function listarCategorias(){
  51.         $query = "SELECT nombre FROM categorias";
  52.         $comando = DB::getInstance()->prepare($query);
  53.         $comando->execute();
  54.  
  55.         while( $datos = $comando->fetch() ) {
  56.         // Imprimimos resultados
  57.         echo $datos[0].'<br />';
  58.         }
  59.     }
  60.  
  61.     // Agrega una nueva categoria
  62.     public function agregarCategoria($nombre){
  63.         $this->nombreCategoria=$nombre;
  64.         $sql = "INSERT INTO categorias (nombre) values (%s) ";
  65.         $query = sprintf( $sql, $this->nombreCategoria );
  66.         $comando = DB::getInstance()->prepare($query);
  67.         $comando->execute();
  68.     }
  69. }
  70. $cat = new Categoria();
  71. $cat->listarCategorias();
  72. ?>

Muchas gracias de antemano!

Última edición por neodani; 30/08/2010 a las 03:08