viernes, 15 de enero de 2010

PHP y PostgreSQL

En el presente post voy a explicar cómo utilizar una base de datos PosgreSQL ( http://www.postgresql.org) en programas desarrollados con PHP, una combinación perfecta para desarrollos utilizando productos de software libre. Aunque hasta hace poco, la sinergia más común era utilizar PHP con MySQL, la compra de Sun Microsystems por Oracle cuestiona la continuidad de MySQL como un producto completamente libre o que pueda desaparecer. Otra circunstancia que apoya estas hipótesis es que los principales desarrolladores y líderes de MySQL han abandonado el proyecto y han fundado otros proyectos libres tomando como referencia MySQL, creando así un fork, como puede ser MariaDB.

La opción más aconsejable sería PostgreSQL, una poderosa y veterana base de datos, nacida hace más de quince años en la Universidad de Berkeley, California, y que está disponible para casi cualquier sistema operativo, y que puede utilizarse en multitud de lenguajes de programación. Destaca por su estabilidad, mínimo mantenmiento y velocidad. Una relación resumida de características sería la siguiente:
- Compatible con ACID
- Compatible con ANSI SQL
- Integridad referencial
- Interfaces nativas para ODBC, JDBC, .NET, C, C++, PHP, Perl, TCL, ECPG, Python y Ruby
- Definición de reglas
- Vistas
- Procedimientos almacenados
- Unicode
- Secuencias
- API abierta
- Tipos de datos extensibles

PHP ( http://www.php.net) es un lenguaje de programación muy popular en Internet, y la mayor parte de empresas de hosting del planeta lo incluye en sus servicios. Es un lenguaje muy sencillo de usar, con una sintaxis similar a la de C, y que es interpretado por el servidor para generar páginas web dinámicas y acceder a recursos de red y locales, tales como ficheros, bases de datos, servicios web, comunicaciones, etc). PHP se instala, generalmente, sobre un servidor Apache o Internet Information Server (IIS).

No voy a describir el proceso detallado de instalación de PHP y de PostgreSQL (mirar la guía de instalación de cada uno de estos productos). Simplemente, indicaré que primero hay que instalar el servidor de aplicaciones (yo recomiendo Apache). A continuación, con el servidor de aplicaciones parado, instalar PHP de forma personalizada, indicando entre las opciones, que instale la extensión para PostgreSQL. Una vez instalado PHP, instalar PostgreSQL.

Tampoco voy a describir cómo utilizar el servidor de aplicaciones, programar en PHP o administrar o gestionar bases de datos en PostgreSQL (recomiendo bajaros la aplicación PgAdmin). Voy a meterme en harina, centrándome exclusiva y concretamente en el uso de Postgre desde PHP.


Conexión a la base de datos

El primer paso a realizar es conectarse a la base de datos. Para ello tenemos el comando “pg_connect”, el cual utilizaríamos de la siguiente manera:
<?php
$dbhost='localhost'; // servidor de PostgreSQL (nombre o DNS)
$dbport='5432'; // Puerto de PostgreSQL (por defecto 5432)
$dbname='midb'; // Nombre de la base de datos
$dbusr='miusuario'; // Nombre del usuario de base de datos
$dbpasw='mipassword'; // Contraseña de base de datos

$con = pg_connect("host=".$dbhost." port=".$dbport.
"dbname=".$dbname." user=".$dbusr." password=".$dbpasw);
if (!$con)
echo 'Se produjo un error al intentar conectar con la base de datos\n';
else {
pg_close($con);
}
?>

A la función "pg_connect" se le pasa una cadena con los parámetros de conexión:
- host=servidorPostgre
- port=puertoPostgre
- dbname=nombreBaseDatos
- user=usuarioBaseDatos
- password=contraseñaBaseDatos

Esta función retorna FALSE si hay algún problema en la conexión (base de datos caída o detenida, o si alguno de los parámetros de conexión es incorrecto). Si la conexión se produjo sin problemas, retornará un objeto de conexión a base de datos, que se utilizará para las siguientes acciones. En el código anterior, si se conecta bien, cerrará la conexión mediante la función "pg_close", a la que se pasa como parámetro el objeto de la conexión abierta.

Si la aplicación va a tener concurrencia en el uso de las bases de datos, se recomienda utilizar la base de datos en modo concurrente, ya que optimiza la creación y el uso de las conexiones. Para ello, en el archivo "php.ini" han de configurarse los siguientes parámetros:
- pgsql.allow_persistent - Valor "On"
- pgsql.max_persistent - Número máximo de conexiones abiertas. -1 es infinito.
- pgsql.max_links - Número máximo de conexiones a asignar.

Para hacer uso de la persistencia, la obtención de las conexiones se realizará mediante la función "pg_pconnect", cuya sintaxis es muy similar a su homónima "pg_connect".


Obtención de datos

PostgreSQL es una base de datos basada en el estándar SQL para su gestión. Para obtener datos se utiliza la sentencia SELECT, donde se especifican los campos y las tablas de donde obtener datos. En el siguiente ejemplo se obtienen todos los datos (campos y filas) de la tabla "trzuser":

$qry = pg_query($con, "select * from trzuser");

if (!$qry)
echo 'Error al ejecutar la query';
else {
$rows = pg_num_rows($qry);
echo "Filas: ".$rows;

while($tuple=pg_fetch_row($qry)) {
echo 'userid='.$tuple[0].' - ';
echo 'username='.$tuple[1].' - ';
echo 'usernick='.$tuple[2].'- ';
echo 'userpassword='.$tuple[3].' - ';
echo 'useradmin='.$tuple[4].' --- ';
}
}

Para lanzar una consulta a la base de datos se utiliza la función "pg_query". Se pasa como parámetros el objeto de conexión a la base de datos (que previamente hemos de obtener), y la consulta SQL. Esta función retornará FALSE si hay algún error o problema, o un objeto con el resultado de la consulta en caso de éxito (en el ejemplo se almacena en $qry).

Para conocer el número de registros que retorna la consulta SELECT, se utiliza la función "pg_num_rows", a la que se le pasa como parámetros el objeto del resultado de la consulta ($qry).

Cuando se obtiene el resultado, internamente hay un puntero posicionado justo antes de la primera fila. Con la función "pg_fetch" se mueve el puntero al siguiente registro o fila, retornando ésta. Si se hubiera alcanzado el final del resultado y no hubiera más registros, retornaría FALSE.

En el ejemplo se captura la fila en el objeto $tuple (tupla), en un bucle (while) que se repita mientras este objeto no tenga el valor FALSE. El objeto que recoge la fila es un array, en donde cada elemento de la matriz contiene el valor de cada campo, en el mismo orden de columnas de la consulta. Para acceder a cada valor se utiliza la referencia [nº matriz].


Actualización de datos

La actualización de datos conlleva, comúnmente, a crear, modificar o borrar datos de las tablas de la base de datos. Estas acciones las realizan las sentencias INSERT, UPDATE y DELETE. Estas sentencias se ejecutan como consultas de actualización, y como consultas también se ejecutan mediante la función "pg_query", la cual permite ejecutar una o varias consultas de actualización. En el caso de ser varias las consultas de actualización, éstas se deben separar mediante el carácter ";" (punto y coma.

El siguiente ejemplo muestra cómo insertar un registro en nuestra tabla:

$ins = "insert into trzuser (username, usernick, ".
"userpassword, useradmin) ".
"values ('Carlos Garcia', 'cgarcia', '1234', false)";

$qry = pg_query($con, $ins);

if (!$qry)
echo 'Error al ejecutar la query: '.$ins;
else {
$affected = pg_affected_rows($qry);
echo 'Filas afectadas: '.$affected;
}

La función "pg_affected_rows permite comprobar cúantas filas han sido afectadas por la consulta de actualización.


Conclusión
Desarrollar aplicaciones mediante PHP y PostgreSQL es muy fácil y potente. Con tener básicamente conocimientos acerca de HTML, PHP y SQL, es posible desarrollar una aplicación web completa sin grandes dificultades.

También es muy interesante utilizar PHP para realizar una capa de negocio en un sistema distribuido o Web, en donde la parte cliente (front-end) pueda ser una aplicación de escritorio (.NET, Adobe AIR, Delphi, etc.) o una aplicación RIA (Adobe Flex, Ajax, OponLaszlo). Es posible interconectar estas dos capas mediante HTTPServices o mediante servicios Web.

Para más información sobre estas técnicas, te recomiendo la documentación de PHP explícitamente dedicada a usar PostgreSQL: http://es2.php.net/manual/en/book.pgsql.php

Safe Creative #1001195345852