PD que ?, PDO !

En los principios de PHP solo teníamos librerías nativas para interactuar con bases de datos. La más conocida son las nativas de mysql (mysql_connect, mysql_query, mysql_*).  Dichas librerías son muy efectivas y funcionan perfectamente, pero podemos encontrarnos con dos cuestiones que pueden molestarnos.

– No son orientadas a objetos

– Son especificas y acoplan al RDBMS con nuestro código

Para solventar estos problemas deberíamos agregar bastante código a nuestra aplicación a fin de darle soporte a múltiples bases de datos y armar una abstracción orientada a objetos.

Recuerdo la primera vez que vi ADO.NET y JDBC, ambas librerías, en sus lenguajes respectivos, subsanaban los problemas aquí comentados; nosotros en PHP3 no teníamos nada parecido. Con el pasar del tiempo aparecieron algunas abstracciones como MDB (http://pear.php.net/package/MDB/redirected) y ADOdb las cuales pretendían solventar este problema.

Con la salida de PHP5 y el nuevo modelo de Objetos incorporado al lenguage se incorporó una librería llamada PDO (PHP Data Objects) la cual es un librería abstracta, orientada a objetos para interactuar con bases de datos.

PDO Definie básicamente es un conjunto de interfaces para interactuar con bases de datos, los proveedores de drivers simplemente deben implementar dichas interfaces para proveer soporte PDO a su RDBMS.

PDO proporciona una capa de abstracción acceso a datos, que significa que, independientemente de la base de datos que está utilizando, se utiliza las mismas funciones para realizar consultas y obtener datos. PDO no proporciona una abstracción base de datos; reescribe SQL o emular características faltantes. Debe usar una capa de abstracción en toda regla, si necesita esto, para esto pueden ver Doctrine o Propel.

Lo interesante es que si programamos todo medianamente estándar, y en los casos particulares añadimos la compatibilidad necesaría para las bases de datos a soportar, podemos cambiar de RDBMS muy fácilmente.

Ademas de todo esto, PDO incorporá ventajas de optimización, seguridad, transacciones, pooling de conexiones y varias cosas mas.

Aquí el manual de PDO.

http://www.php.net/manual/es/intro.pdo.php

Instalación

Esta librería viene nativamente dentro de PHP5 o superior (salvo que su versión de PHP no este compilado con el flag de pdo); lo que no viene por defecto son los drivers concretos de cada RDBMs, estos deben instalarse por separado y habilitarlos en el php.ini como una extensión dado que estos componentes son binarios (.so en Unixes y .dll en windows). Si tienen la suerte de trabajar sobre debían podrán ver los paquetes que tenemos en los repositorios mediante apt-cache search

php5-mysql – MySQL module for php5
php5-odbc – ODBC module for php5
php5-pgsql – PostgreSQL module for php5
php5-sqlite – SQLite module for php5
php5-sybase – Sybase / MS SQL Server module for php5
php5-oracle – Oracle module for php5

Solo basta con hacer un apt-get install y reiniciar el servidor web para tener disponible el driver. Si su base de datos poseen un driver que no esta en los gestores de paquetes simplemente deben descargar el binario y añadir la extensión en el php.ini (extension=/path/al/binario.so).
Para verificar su correcta instalación y los drivers disponibles phpinfo() al rescate, aparece en el listado de features.
php5-mysql – MySQL module for php5
php5-odbc – ODBC module for php5
php5-pgsql – PostgreSQL module for php5
php5-sqlite – SQLite module for php5
php5-sybase – Sybase / MS SQL Server module for php5
php5-oracle – Oracle module for php5solo

Los Objetos de PDO

PDO cuenta con dos objetos principales, PDO y PDOStatement, el primero es el encargado de manejar las cuestiones de conexión, el segundo el encargado de manejar las consultas. Para realizar la conexión a la base de datos, PDO requiere un DSN (Data Source Name) que es un string que contiene los parámetros de conexión. Para conectarnos a la base necesitamos crear una nueva instancia de la clase PDO, pasando como argumentos al constructor el DSN, usuario y contraseña; en otras palabras, el DSN es tipo una url pero para especificar a donde conectarnos.

El DSN de PDO sigue la siguiente forma.

DRIVER:hots=IP;dbname=NOMDB

Donde

DRIVER: depende de la base a conectarse, (mysql, pgsql, oci (oracle),ibm(db2))

IP: es la dirección ip del servidor a conectarnos o su nombre de dominio

NOMDB: es el nombre de la base a conectarse.

Un ejemplo de conexión sería

$dbh = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);

Deben tener en cuenta que mediante el objeto podremos realizar las operaciones con la base. Para desconectarse solo deben asignar null al objeto de conexión.

$dbh = null;

Consultas a la base

Las consultas se realizan a trabes del objeto de conexión y utilizando el método query. Este nos devuelve un arreglo con los resultado, lo que nos hace olvidar del fecth.

Veamos un ejemplo.

$res = $dbh->query(‘SELECT * from FOO’);
foreach($res as $row) {
print_r($row);
}

En el caso querer obtener el arreglo por separado para tratarlo de otra manera se puede utilizar el método fetchAll para asignar toda la consulta en un arreglo. Por ejemplo.

$res = $dbh->query(“SELECT * FROM persona”);
$res_arr = $res->fetchAll();

Si queremos ir obteniando de a uno los registros como arreglos podemos usar fetch, esto avanza el puntero interno de los resultados y al llegar al final devuelve falso.

Prepared Statement

La ventaja mas potente de PDO es la de poder crear Consultas Preparadas, o Prepared Statement. Esta fija el formato de la Consulta a una determinada manera y luego recibe los parámetros tal como nosotros especificamos. Esta separación del formato de la consulta y los parámetros evita el problema de la Injección SQL dado que es imposible realizarla en una consulta Preparada. Por otro lado este tipo de consultas otorgan al RDBMs mucha mejor facilidad de tratamiento de las consultas dado que pueden tener preparado el plan de ejecución de las mismas optimizando un poco el rendimiento general de la aplicación.

Para crear una consulta preparada se utiliza el Prepare de PDO, esa operación devolverá un Statement al cual mediante el método bindParam asociaremos los parámetros y mediante execute tendremos los resultados de la consulta. Si execute devuelve falso podremos saber si se produjo un error. Una vez realizado el método execute podremos tratar los resultados en el Statement.

Veamos un ejemplo.

Transacciones

Una transacción es un conjunto de operaciones que deben ser realizadas todas juntas o no debe realizarse ninguna. Para trabajar con transacciones debemos enviar señalizadores al RDBMS de como es el proceso, donde empieza (begin), cuando termina ok (commit) y si fallo (rollback) para que vuelva atrás los cambios realizados. En PDO contamos con dichos metodos para señalizar la operación de transacción.

Métodos provistos por PDO

PDO::beginTransaction – Inicia la Transacción.
PDO::commit – Confirma los Cambios y finaliza la transacción.
PDO::rollback – Deshace los cambios realizados y finaliza la transacción.

Ejemplo

Conclusión

PDO es muy ordenado y limpio para trabajar como pueden ver, es muy util para el trabajo cotidiano. Varios de los proveedores de drivers últimamente solo estan soportando drivers para esta interfaz. Su aprendizaje puede tomar una o dos tardes, es muy sencillo de utilizar y la ganancia es grande.

Mi romendación, comiencen a utilizar esta librería lo antes posible y olvidensé de mysql_connect (al menos por un rato).

Share