PDO (PHP Data Objects). Capa de Abstracción de acceso a Bases de Datos (Primera parte)

PDO (PHP Data Objects) es una extensión nativa de PHP5, consiste en una interface uniforme para acceder a varias bases de datos. PDO provee una capa de abstracción de acceso a bases de datos (BD), que permite al desarrollador abstraerse de la BD de una aplicación. Así, si en alguna fase de desarrollo del proyecto se necesita cambiar de BD, esto no afectaría la lógica de la aplicación.


 


Actualmente los siguientes drivers implementan la Interface PDO:

Nombre del Driver --------- Base de Datos soportadas
PDO_DBLIB ------------------ FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD -------------- Firebird/Interbase 6
PDO_IBM --------------------- IBM DB2
PDO_INFORMIX ------------- IBM Informix Dynamic Server
PDO_MYSQL ----------------- MySQL 3.x/4.x/5.x
PDO_OCI ---------------------- Oracle Call Interface
PDO_ODBC ------------------- ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL ------------------ PostgreSQL
PDO_SQLITE ----------------- SQLite 3 and SQLite 2
PDO_4D ---------------------- 4D

Acceso a bases de datos en PHP5 con PDO

La extensión php_pdo para el trabajo con bases de datos esta compuesta por tres clases:

PDO: Representa una conexión entre PHP y un servidor de bases de datos.
PDOStatement: Representa una instrucción preparada y después que la instrucción es ejecutada, una result set.
PDOException: Representa un error lanzado por PDO.

La clase PDO

Sinopsis
2  PDO {
3  __construct ( string $dsn [, string $username
[, string $password [, array $driver_options ]]] )
4  bool          beginTransaction ( void )
5  bool          commit ( void )
6  mixed         errorCode ( void )
7  array         errorInfo ( void )
8  int           exec ( string $statement )
9  mixed         getAttribute ( int $attribute )
10  array        getAvailableDrivers ( void )
11  string       lastInsertId ([ string $name = NULL ] )
12  PDOStatement prepare ( string $statement 
[, array $driver_options = array() ] )
13  PDOStatement query ( string $statement )
14  string       quote ( string $string 
[, int $parameter_type = PDO::PARAM_STR ] )
15  bool         rollBack ( void )
16  bool         setAttribute ( int $attribute , mixed $value )
17  }
Métodos
  1. PDO::beginTransaction — Inicializa una transacción.
  2. PDO::commit — Commits una transacción.
  3. PDO::__construct — Crea una instancia PDO que representa una conexión a una base de datos.
  4. PDO::errorCode — Recupera el SQLSTATE asociado con la última operación en la base de datos.
  5. PDO::errorInfo — Recupera información extendida del error asociado con la ultima operación en la base de datos.
  6. PDO::exec — Ejecuta una instrucción SQL y retorna el número de filas afectadas.
  7. PDO::getAttribute — Recupera un atributo de conexión a base de dato.
  8. PDO::getAvailableDrivers — Retorna un array (arreglo) de los drivers disponibles en la extensión PDO.
  9. PDO::lastInsertId — Retorna el ID (identificador) de la última fila insertada o secuencia de valores.
  10. PDO::prepare — Prepara una instrucción para ejecución y retorna un objeto de tipo PDOStatement.
  11. PDO::query — Ejecuta una instrucción SQL, retornando un resul set como un objeto de tipo PDOStatement.
  12. PDO::quote — Quotes (Pone entre comillas simples un string) para uso en una query (consulta).
  13. PDO::rollBack — Rolls back una transacción.
  14. PDO::setAttribute — Modifica un atributo.
La clase PDOStatement

Sinopsis

2  PDOStatement implements Traversable {
3  bool    bindColumn ( mixed $column , mixed &$param 
[, int $type [, int $maxlen [, mixed $driverdata ]]] )
4  bool    bindParam ( mixed $parameter , mixed &$variable 
[, int $data_type [, int $length
[, mixed $driver_options ]]] )
5  bool    bindValue ( mixed $parameter , mixed $value 
[, int $data_type ] )
6  bool    closeCursor ( void )
7  int     columnCount ( void )
8  bool    debugDumpParams ( void )
9  string  errorCode ( void )
10 array   errorInfo ( void )
11 bool    execute ([ array $input_parameters = array() ] )
12 mixed   fetch ([ int $fetch_style = PDO::FETCH_BOTH
      [, int $cursor_orientation = PDO::FETCH_ORI_NEXT 
[, int $cursor_offset = 0 ]]] )
13 array   fetchAll ([ int $fetch_style = PDO::FETCH_BOTH 
[, int $column_index [, array $ctor_args = array() ]]] )
14  string fetchColumn ([ int $column_number = 0 ] )
15  mixed  fetchObject ([ string $class_name 
[, array $ctor_args ]] )
16  mixed  getAttribute ( int $attribute )
17  array  getColumnMeta ( int $column )
18  bool   nextRowset ( void )
19  int    rowCount ( void )
20  bool   setAttribute ( int $attribute , mixed $value )
21  bool   setFetchMode ( int $mode )
22  }
Métodos
  1. PDOStatement->bindColumn — Sustituye el valor de una columna de la base de datos a una variable PHP.
  2. PDOStatement->bindParam — Sustituye el valor de un parámetro (argumento), a el nombre de variable especificada.
  3. PDOStatement->bindValue — Sustituye un valor como parámetro.
  4. PDOStatement->closeCursor — Cierra el cursor, habilitando la instrucción a ser ejecutada otra vez.
  5. PDOStatement->columnCount — Retorna el numero de columnas en el result set.
  6. PDOStatement->debugDumpParams — Dump un commando SQL preparado.
  7. PDOStatement->errorCode — Recupera el SQLSTATE asociado con la última operación realizada en la base de datos.
  8. PDOStatement->errorInfo — Recupera información de error extendida asociada con la ultima operación realizada en la base de datos.
  9. PDOStatement->execute — Ejecuta una instrucción preparada.
  10. PDOStatement->fetch — Recupera la siguiente fila de una result set.
  11. PDOStatement->fetchAll — Retorna un array conteniendo todas las filas del resul set.
  12. PDOStatement->fetchColumn — Retorna una única columna de la siguiente fila de un result set.
  13. PDOStatement->fetchObject — Recupera la siguiente fila y la retorna como un objeto.
  14. PDOStatement->getAttribute — Recupera una atributo.
  15. PDOStatement->getColumnMeta — Retorna metadatos de una columna en un resul set.
  16. PDOStatement->nextRowset — Avanza a la siguiente Rowset en un multi-rowset.
  17. PDOStatement->rowCount — Retorna el numero de filas afectadas por la última instrucción SQL.
  18. PDOStatement->setAttribute — Modifica un atributo.
  19. PDOStatement->setFetchMode — Modifica el valor por defecto para recuperar datos de la base de datos para la instrucción actual.
Los pasos básicos para interactuar con una base de datos desde PHP son los siguientes:

1. Conectar con el servidor de bases de datos.
2. Enviar la instrucción SQL a la base de datos.
3. Obtener y procesar los resultados.

A continuación vemos los métodos concretos con los que realizaremos estas operaciones:

1. Conectar con el servidor de bases de datos (Crear el objeto PDO):

Descripción
PDO::__construct ( string $dsn [, string $username 
[, string $password [, array $driver_options ]]] )

Lista de parámetros

DNS: (Data Source Name), contiene la información requerida para conectarse a la base de datos.
username: El nombre de usuario. Este parámetro es opcional para algunos PDO drivers .
password: La contraseña. Este parámetro es opcional para algunos PDO drivers.
driver_options: Una llave=>valor del arreglo de opciones con driver de conexión especifico.

Valores retornados

En caso de éxito retorna un objeto PDO.

Errores/Excepciones

PDO::__construct() dispara un PDOException si el intento de conexión a la base de datos falla.

2. Enviar la instrucción SQL a la base de datos:

Descripción

PDOStatement PDO::query ( string $statement )

PDOStatement PDO::query ( string $statement , 
int $PDO::FETCH_COLUMN , 
int $colno )

PDOStatement PDO::query ( string $statement , 
int $PDO::FETCH_CLASS,
  string $classname ,
array $ctorargs )

PDOStatement PDO::query ( string $statement , 
int $PDO::FETCH_INTO ,
object $object )

Lista de parámetros

Instrucción SQL.

Valores retornados

PDO::query()
retorna un objeto PDOStatement.

3. Obtener y procesar los resultados.

Descripción
mixed PDOStatement::fetchObject ([ string $class_name 
[, array $ctor_args ]] )

Lista de parámetros

class_name: Nombre de la clase a crear, por defecto utiliza stdClass.
ctor_args: Elementos de este arreglo son pasados al constructor.

Valores retornados

Retorna una instancia de la clase requerida, con el nombre de las propiedades correspondiente a los nombres de las columnas o false in caso de un error.

Ejemplo completo

  1. <?php  
  2.  /* 1. Conexión a la base de datos */  
  3.   
  4.  $dsn = 'mysql:dbname=noticias;host=127.0.0.1';  
  5.  $user = 'dbuser';  
  6.  $password = 'dbpass';  
  7.  try  
  8.     {  
  9.       $dbh = new PDO($dsn$user$password);  
  10.     }  
  11.      catch (PDOException $e)  
  12.      {  
  13.        echo 'Connection failed: ' . $e->getMessage();  
  14.      }  
  15.    
  16.  /* Creación la tabla noticias */  
  17.   
  18.  $dbh->query('CREATE TABLE IF NOT EXISTS `noticia` (  
  19.              `id` int(11) NOT NULL AUTO_INCREMENT,   
  20.              `titulo` varchar(50) NOT NULL,   
  21.              `texto` varchar(500) NOT NULL,   
  22.               PRIMARY KEY (`id`)  
  23.             )   
  24.             ENGINE=InnoDB    
  25.             DEFAULT CHARSET=utf8 AUTO_INCREMENT=2');  
  26.   
  27.  /* Insertando datos en la tabla noticias */  
  28.   
  29.  $dbh->query("INSERT INTO `noticia` (`titulo`, `texto`)   
  30.               VALUES ('PHP5 ''PHP5 y la POO.')");  
  31.   
  32.  /* 2. Enviar la instrucción SQL a la base de datos */  
  33.   
  34.  $resulset = $dbh->query('SELECT   `titulo`,`texto`   
  35.                           FROM     `noticia`   
  36.                           ORDER BY `titulo`');  
  37.   
  38.  /* 3. Obtener y procesar los resultados */  
  39.   
  40.  $noticia = $resulset->fetchObject();  
  41.  echo $noticia->titulo;  
  42.  echo $noticia->texto;  
  43.  ?>  

Conclusión

PDO cumple con una premisa del diseño Orientado a Objetos:

“No dependas de implementaciones concretas, solo de implementaciones abstractas”[1]

PDO es una implementación abstracta, un paso a mejorar el performance de nuestras aplicaciones con desarrollos más portables y escalables.

Artículos relacionados
  1. PDO (PHP Data Objects). Capa de Abstracción de acceso a Bases de Datos utilizando el Patrón de diseño Singleton (Segunda parte)

Referencias Bibliográficas

[1] Enrique Place, (mayo 25, 2006). «Comentarios sobre: "¿Cual es la mejor capa de abstracción?"». Consultado el 1 de octubre del 2009.

Bibliografía


Colaboradores de Wikipedia. Capa de abstracción [en línea]. Wikipedia, La enciclopedia libre, 2009 [fecha de consulta: 17 de julio del 2009]. Disponible en <http://es.wikipedia.org/w/index.php?title=Capa_de_abstracci%C3%B3n&oldid=28148126>.

2 comentarios:

  1. hola dos cosas:

    primero que me parecen excelentes tus artículos,
    y segundo que tiene un pequeño error en el script.
    en la linea nº4
    Connection failed: SQLSTATE[42000] [1049] Unknown database 'dbtest'

    $dsn = 'mysql:dbname=dbtest;host=127.0.0.1';

    debe ser

    $dsn = 'mysql:$dbname=$dbtest;host=127.0.0.1';

    asi funciona ;)

    gracias por todo

    ResponderEliminar
  2. Muy buena tu explicación, tan buena como tus artículos....

    Gracias nuevamente

    ResponderEliminar