Ejecutar procedimientos almacenados de PosgreSql con Php

En este artículo aprenderemos a ejecutar desde PHP, funciones de PostgreSql que nos devuelven un recordset. Para ello será necesario antes que nada la creación tanto de la tabla como de la función, como vimos en el artículo:  “Procedimientos almacenados en PostgreSql”.

Php nos proporciona una extensión para PostgreSql con la que podremos ejecutar funciones y consultas a la base de datos, así mismo podremos ejecutar algunas operaciones adicionales al servidor. La documentación completa la podrás leer aquí. Será necesario que habilites tal extensión en el  archivo php.ini si desarrollas en Widows o de otra manera que recompiles php incluyendo la extensión para postgresql.

Una vez que hemos habilitado la extensión comenzaremos a codificar. Vamos a crear un archivo pruebas.php en el directorio de tu elección en el árbol de directorios de tu servidor web. Como yo uso Apache he colocado un directorio llamado postgres directamente en httpdocs.

Lo primero será establecer la conexión a postgres, para ello usaremos pg_connect que de acuerdo a la documentación nos pide una cadena de conexión donde establezcamos servidor, puerto, usuario y password del servidor de base de datos.

$CadenaConexion = "host=localhost port=5432 dbname=Pruebas user=user password=pass";
$Psgcon = pg_connect($CadenaConexion);

Una vez establecida la conexión a nuestro servidor postgres, pg_connect nos devuelve un enlace al servidor que asignaremos a la pariable: $Psgcon. Después,   para usar parámetros como lo hicimos en mysql, usaremos pg_prepare para establecer la sentencia a ejecutar indicando los parámetros que recibirá:

$statement = pg_prepare($Psgcon, "sp_damepaises", 'SELECT * FROM sp_damepaises($1)');

Como nos indica la documentación, si prepare se ejecuta de manera satisfactoria nos devolverá un enlace a la sentencia o false en caso contrario. Lo siguiente será ejecutar la sentencia preparada y obtener el resultado para mostrarlo en pantalla. Para esto usaremos las funciones pg_execute y pg_fetch_all. Con la primera enviaremos la sentencia al servidor para su ejecución y con la segunda asignaremos a un arreglo los datos devueltos por la función:

$ValParam = array("DAMETODOS");
$recordset = pg_execute($Psgcon, "sp_damepaises", $ValParam);
$arrRegistros =pg_fetch_all($recordset);

Agregaremos print_r($arrRegistros); para visualizar el resultado en nuestro navegador:

 

Si vemos el código fuente esto nos será mostrado:

Ahora, vamos a darle una mejor vista a los registros devueltos por el servidor. Para ello añadiremos lo siguiente a nuestro script:

echo "<table><tr><td>Columna1</td><td>columna2</td>";
foreach($arrRegistros as $key=>$value) {
echo "<tr>";
foreach($value as $keyname=>$valuename)
echo "<td>$valuename</td>";
echo "</tr>";
}
echo "</table>";

Obteniendo el siguiente resultado:

Como pueden observar en el listado de países, PostgreSql nos ha devuelto los nombres de país que incluían acento con caracteres extraños. Esto se debe a que  no establecimos la codificación de caracteres que usaremos y en mi caso pg_connect tomó por default UTF-8. La manera de corregir esto es agregando la codificación de caracteres que usaremos en nuestra aplicación desde el inicio de la conexión. Para incluir soporte a los acentos, la ñ y demás caracteres usados en el español usaremos la codificación: iso-8859-1 indicándolo en nuestra cadena de conexión.

$CadenaConexion = "host=localhost port=5432 dbname=Pruebas user=user 
                   password=pass options='--client_encoding=iso-8859-1'";

Lo que nos dará como resultado lo siguiente:

 

Y bueno, como pueden notar, ejecutar funciones de postgresql desde php es realmente tan sencillo como para mysql. Este es el  código completo del artículo:

<?php

$CadenaConexion = "host=localhost port=5432 dbname=Pruebas user=user password=pass options='--client_encoding=iso-8859-1'";
$Psgcon = pg_connect($CadenaConexion);
$statement = pg_prepare($Psgcon, "sp_damepaises", 'SELECT * FROM sp_damepaises($1)');

$ValParam = array("DAMETODOS");
$recordset = pg_execute($Psgcon, "sp_damepaises", $ValParam);
$arrRegistros =pg_fetch_all($recordset);

echo "<table border='1' with='300px'><tr bgcolor='#04B404'><td>Columna1</td><td>columna2</td>";
foreach($arrRegistros as $key=>$value) {
echo "<tr>";
foreach($value as $keyname=>$valuename)
echo "<td>$valuename</td>";
echo "</tr>";
}
echo "</table>";

?>

4 Comments

  1. Amigo, mil gracias. Esta introducción me ha sido de gran utilidad. Estoy comenzando en php y procedimientos almacenados. Hasta pronto. Seguiré leyendo tu pagina.

Deja un comentario