lunes, 2 de febrero de 2015

Postgresql y PHP

Como es sabido, se puede conectar una Base de Datos en Postgresql con PHP para poder  visualizarlo de manera Local (entiéndase en que un administrador de una Base de Datos quiera compartir la información con sus compañeros de trabajo usando para ello un Explorador Web). Para ello usamos el lenguaje PHP (otro es el ASPX), que es un lenguaje gratuito y que cuenta con un muy buena documentación y foros en la web, y se puede usar para escribir / codificar tan solo el Block de Notas (notepad.exe), habiendo otros editores de texto gratuitos (como el Notepad++ o el Rj TextEd entre otros).

Para los que no están familiarizados con el PHP, pueden usar el siguiente enlace:
http://php.net/manual/es/index.php

Y hay muchos más manuales en la Web

Instalación del PHP:
Para ello, instalamos el PHP, en mi caso, uso el paquete de AppServ:


Que al instalarlo, configura el Servidor Apache con el PHP, también viene con el MySQL como Base de Datos, pero se le puede quitar esta opción para solo quedarnos con el Postgresql.

Luego configuramos el PHP.ini para que reconozca el Postgresql

Configuración del PHP.ini (inicio/AppServ/Configuration Server/ PHP Edit the php.ini Configuration File)

Para el Postgresql:
Buscar en el PHP.ini:
;extension=php_pgsql.dll y quitarle (descomentamos) el punto y coma y quedara
extension=php_pgsql.dll

Luego reiniciar el Apache (inicio/AppServ/ Control Server by Service/ Apache Restart) y ya estará configurado el Postgresql con el PHP.

Para el  PHPExcel:

Adicionalmente instalaremos la librería de PHPExcel que permite crear un archivo Excel de la información que queramos exportarla


Para configurarlo, en el PHI.ini (mencionado y explicado líneas atrás), buscamos la línea:

zlib.output_compression = off  y la cambiamos por zlib.output_compression = on

Luego buscamos estas dos extensiones

;extension=php_xsl.dll
;extension=php_zip.dll

Quitamos (descomentamos) los puntos y comas y debe quedar de esta forma:

extension=php_xsl.dll
extension=php_zip.dll

Reiniciamos el servidor Apache (mencionado como hacerlo líneas atrás) y ya está listo.

Ejemplo de Uso:
Tenemos una Tabla con las Capitales del Perú en nuestra Base de Datos y queremos solo mostrar (y luego exportar a Excel) los que pertenezcan al departamento del Cusco. En este ejemplo se ve el uso tanto del PHP como del HTML para la creación de la Tabla y del Formulario que se mostrara (una buena web que explica sobre HTML es http://www.w3schools.com/html/).

La Tabla tiene la siguiente estructura:
NOMBDPTO: de tipo VARCHAR y contiene el nombre de los departamentos del Perú.
NOMBPROV: de tipo VARCHAR y contiene el nombre de las provincias del Perú.
NOMBDIST: de tipo VARCHAR y contiene el nombre de los distritos del Perú.

Pueden bajar el Shapefile de esta tabla para que lo puedan guardarlo en su Base de Datos desde ACA
Código PHP con Explicación (descárgala desde este ENLACE) Por problemas del Blogger, no se puede colocar bien el código en el Post, pero lo descargan en el ENLACE mencionado.

'; /*SALTO DE LINEA*/     
   }
   
   /*DEFINICION DE LA CONSULTA*/
   $DEPARTAMENTO = 'CUSCO';
   $SQL = 'SELECT nombdist, 
          ST_AREA(ST_TRANSFORM(the_geom,32719)) / 1000000 
          FROM "DISTRITOS_PERU" 
          WHERE nombdpto = '.chr(39).$DEPARTAMENTO.chr(39).
          ' ORDER BY nombdist'; 
   $RESULTADO_SQL = pg_query($SQL);    /*EJECUCION DE LA CONSULTA*/       
   
   /*IMPRESION DE LA CANTIDAD DE FILAS SEGUN LA CONSULTA*/       
   echo 'EL DEPARTAMENTO DE '.$DEPARTAMENTO . ' TIENE '.pg_num_rows($RESULTADO_SQL) .' DISTRITOS';

 ?>




  <?php echo $DEPARTAMENTO ?>

<!-- DEFINICION DEL FORMULARIO PARA LA EJECUCION DEL BOTON "Excel"
IDDISTRITOÁREA (km2)
-->
 
setActiveSheetIndex(0)->setCellValue("A1" , "ID" );         
   $MI_EXCEL->setActiveSheetIndex(0)->setCellValue("B1" , "DISTRITO" );         
   $MI_EXCEL->setActiveSheetIndex(0)->setCellValue("C1" , "AREA (km2)" ); 
   
   /*LLENADO DEL ARCHIVO EXCEL CON LOS DATOS DEL RESULTADO DE LA CONSULTA*/
   For($i=0; $isetActiveSheetIndex(0)->setCellValue( $CELL , $i + 1 );         
         }Else{
            $MI_EXCEL->setActiveSheetIndex(0)->setCellValue($CELL  , $DATO_DISTRITO[$j - 1]);                 
         }
      }
   }


   $ARCHIVO = 'MI_EXCEL';/*NOMBRE DEL ARCHIVO EXCEL*/
   $RUTA = $_SERVER['DOCUMENT_ROOT'].'/';/*RUTA DEL SERVIDOR LOCAL*/
   
   /*CREACION DEL ARCHIVO EXCEL*/
   $objWriter = PHPExcel_IOFactory::createWriter($MI_EXCEL, 'Excel2007');  
   $objWriter->save($RUTA.$ARCHIVO.'.xlsx' );        
   
}
Function ConectaBD()/*FUNCION QUE CONECTA A LA BASE DE DATOS*/
{
 
   $host = 'localhost';/*NOMBRE DEL SERVIDOR / HOST */
   $port = 5432; /*PUESTO*/
   $database = 'MI_BASE_DE_DATOS'; /*NOMBRE BASE DE DATOS*/
   $user = 'postgres'; /*USUARIO*/
   $password = 'MI_PASSWORD'; /*PASSWORD*/

   /*ESTABLECIMIENTO DE LA CONECCION*/
   $coneccion = 'host=' . $host . ' port=' . $port . ' dbname=' . $database . 
   ' user=' . $user . ' password=' . $password;
   
   $estado_coneccion = @pg_connect ($coneccion); /*EL ARROBA (@) EVITA MENSAJES DE ERRORES*/
   
   Return $estado_coneccion; /*DEVUELVE LA CONECCION*/

}
 ?>
La mayor parte del código esta con comentarios explicando su funcionamiento, pero haremos énfasis en:
   $SQL = 'SELECT nombdist, 
          ST_AREA(ST_TRANSFORM(the_geom,32719)) / 1000000 
          FROM "DISTRITOS_PERU" 
          WHERE nombdpto = '.chr(39).$DEPARTAMENTO.chr(39). ' ORDER BY nombdist';
 

Esta sentencia es lo mismo que si escribimos en el Query del Postgresql

SELECT nombdist, 
         ST_AREA(ST_TRANSFORM(the_geom,32719)) / 1000000 
         FROM "DISTRITOS_PERU" 
         WHERE nombdpto = 'CUSCO' ORDER BY nombdist;

Se nota entonces que en la variable $SQL esta toda la sentencia SQL. Notese también el que la variable $DEPARTAMENTO esta donde debería estar la palabra CUSCO y que el chr(39) representa la comilla simple de ‘CUSCO’. En otras palabras:

chr(39).$DEPARTAMENTO.chr(39) = 'CUSCO'



Este es el resultado:
 

























Esperando que sea útil este Post, será hasta el otro mes.

 
ª