Hasta hace no mucho solía hacer uso de proveedores específicos de extensiones de bases de datos para cada sistema de gestión de base de datos (SGBD). Cada uno con sus funciones, como por ejemplo las mysql_
para MySQL y las pg_
para PostgreSQL. Sin embargo esto supone complicarse la vida cuando se desarrolla algo que ha de ser compatible con varios SGBD, puesto que cada uno tiene sus funciones. Y ahí, si se cuenta con PHP 5 o superior, es cuando viene de perlas la extensión PHP Data Objects (PDO).
Esta extensión 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 php.net. Desarrollos más escalables y portables. Provee actualmente de once controladores, entre ellos MySQL, PostgreSQL, Oracle, SQL Server,.. aunque algunos de ellos aún en versión experimental.
La conexión se realiza con el constructor de la clase PDO:
$dsn = 'mysql:dbname=nombreBBDD;host=127.0.0.1'; $user = 'usuarioBBDD'; $password = 'contraseñaBBDD'; try { $conexion = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Fallo en la conexión: ' . $e->getMessage(); }
Donde en $dsn
se ha indicado que se utilice el controlador para MySQL, pero con pgsql
serviría para PostgreSQL. Puntualización aquí de que bastaría con tan sólo cambiar esa línea para posibilitar la portabilidad antes mencionada. Aunque hay posibilidad de pasarle al constructor un cuarto parámetro que indique opciones del controlador, yo prefiero después hacer uso del método setAttribute
para indicarle, al menos en el caso de PostgreSQL mientras desarrollo, que me muestre cualquier error que surja:
$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
para que me lance cualquier excepción que surja.
La consulta se suele enviar con el método query
, aunque hay otras maneras más avanzadas como el uso de bind variables que otro día describiré:
$sql = 'SELECT columna1, columna2 FROM unatabla'; foreach ($conexion->query($sql) as $fila) { print $fila['columna1']; print $fila['columna2']; }
esto extraería cada fila del resultado de la consulta y la iría imprimiendo. Pero no menos importante es cerrar la conexión para no andar despilfarrando recursos:
$conexion = null;
Aunque puestos a optimizar el asunto puede ser muy conveniente utilizar el patrón de diseño Singleton con PDO como describe Arley Triana Morín en Desarrollador Senior.