martes, 29 de noviembre de 2011

Contador de visitas

Contador de visitas

Un pequeño plus que le podemos dar a nuestro Sitio Web es la incorporación de un contador de visitas que nos ayudará a saber cuántas veces han ingresado a ver nuestro Sitio Web, además de que si el Sitio Web es para una empresa, éste pequeño plus irá demostrando que la inversión realizada por la empresa ha valido la pena, si se ve que la cantidad de visitas va aumentando rápidamente.

El contador hace uso de COOKIES para "llevar la cuenta" de las visitas.

index.php
<?php
    session_start();
    $archivo = "contador.txt";
    $visitas = array(0 => "algo");
    if(file_exists($archivo)){
      $contador = file_get_contents($archivo);
      $visitas = $_COOKIE['visitas'];
      if(!$visitas)
        $contador ++;
    }else{
      touch($archivo);
      chmod($archivo, 0755);
      $contador = 1;
    }
    setcookie("visitas", 1, time() + 3600);
    file_put_contents($archivo, $contador);
?>


 <p align="center"><b>Usted es el visitante</b></p>
 <table border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
  <?php
   for($i = 0; $i <= 9; $i++)
     $numero[$i] = "$i.png";

   $longitud = strlen($contador);
   $hasta = 6 - $longitud;
   for($celda = 1; $celda <= $hasta; $celda++)
     echo '<td><div align="center"><img src="imagenes/' .$numero[0].'" /></div></td>';

   $hasta = $longitud - 1;
   for($celda = 0; $celda <= $hasta; $celda++){
     $num = substr($contador, $celda, 1);
     echo '<td><div align="center"><img src="imagenes/'. $numero[$num].'" /></div></td>';
   }
  ?>
  </tr>
 </table>

Este primer código debe ir en el principio del index.php debes crear un archivo .txt en la raíz del sitio o en la misma ubicación de la página que contenga el contador. La línea session_start(); es para mantener la sesión, en caso de usar sesiones.

La línea setcookie("visitas", 1, time() + 3600); se puede configurar el tiempo en segundos que deseas que la cookie esté viva en el navegador del visitante, en el ejemplo dura 1 día (3600 seg.).

El segundo código va el lugar de la página donde quieras que salga tu contador, aquí te muestro el resultado del segundo código:


Lo único que no te proporciono en este tutorial son las imágenes de los números, si deseas hacerlo con imágenes.

Espero que les sea útil este pequeño plus.

lunes, 28 de noviembre de 2011

Sesiones con PHP

Sesiones con PHP

Algo muy útil al momento de desarrollar una aplicación web es el uso de sesiones, que nos permiten mantener la información del usuario durante todo el tiempo que el navegador mantenga abierta nuestro sitio, incluso después.

Veremos una forma SIMPLE de crear una sesión de usuario, mantener la sesión y finalmente cerrarla.


El caso más común de uso de sesiones es el de LOGIN, y este será nuestro ejemplo a seguir:

index.php
<?php
 session_start();
?>

<html>
 <form method="post" action="login.php">
     Usuario
     <input type="text" name="usuario" id="usuario" />
     Contraseña
     <input type="password" name="contrasena" id="contrasena" />
     <input type="submit" id="login" value="Ingresar" />
 </form>
</html>

El código anterior es de nuestra página inicial (index) aquí solo pongo el código absolutamente necesario, si deseas puedes agregarle más cosas, ponerle estilo, etc.

La primera parte del código es php, este fragmento de código deberemos incluirlo SIEMPRE al INICIO de cada página en donde queremos que la información del usuario se mantenga con la sesión.  La segunda parte del código es simple html, no está demás decir que en el input de la contraseña debemos poner type="password" para que nos oculte los caracteres que ingresamos.

login.php
<?php
  session_start();
  $usuarioIng = $_POST['usuario'];
  $contrasenaIng = $_POST['contrasena'];

  $consulta="SELECT usuario, contrasena FROM usuario WHERE
          usuario='$usuarioIng' AND contrasena='$contrasenaIng'";
  $result = pg_query ( conPostgreSQL(), $consulta );
  pg_close (conPostgreSQL() );

  list ( $usuario, $contrasena ) = pg_fetch_array ( $result );

  if(strcmp($usuarioIng, $usuario)==0 && strcmp($contrasenaIng, $contrasena)==0) {
     $_SESSION['usuario'] = $usuarioIng;
     header ('Location: ../logeado.php');
 }else{
     echo "
El usuario o contraseña son incorrectos!";

 }
?>

En este código recuperamos los datos enviados por el form en el index.php y los almacenamos en las variables con estos dos datos realizamos una consulta a la base de datos seleccionando el usuario y la contraseña, podemos seleccionar más campos pero los necesarios son esos dos.

Después guardamos el resultado de la consulta en las variables $usuario y $contrasena para compararlos con los datos ingresados usando la función strcmp() de PHP, esta función compara los strings tomando en cuenta mayúsculas y minúsculas y nos devuelve 0 si los strings son idénticos.

Sí el usuario y la contraseña son idénticos encontces creamos la sesión con $_SESSION['usuario'] y le asignamos el nombre del usuario que se está logeando y enviamos un header() para que nos redireccione a la página que nosotros deseamos, en este caso a logeado.php

NOTA: si te da problemas en la línea del header() chequea que no envíes espacios en blanco antes del header, te recomiendo uses este código igual a como te lo presento.

Lo único que debes cambiar es conPostgreSQL() por la función o variable en donde tengas tu conexión a la base de datos.

logeado.php
<?php
 session_start();
 echo "Bienvenido $_SESSION['usuario'] usted se ha logeado con éxito";
?>

En este código siemplemente le damos la bienvenida al usuario que se a logeado, pueden ver como se puede usar la variable $_SESSION[], ésta únicamente contendrá un valor SÍ y SOLO SÍ primero ponemos  session_start();


Con estos dos archivos ya podemos iniciar una sesión para mantener la información del usuario durante toda su visita a nuestro sitio.

Ahora veremos el proceso de cerrar la sesión (más fácil aún).


cualquierPagina.php
<?php
 session_start();
 echo "Bienvenido $_SESSION['usuario'], usted se ha logeado con éxito";
 echo '<a href="php/cerrarSesion.php" value="Cerrar Sesion">Cerrar Sesión</a>';
?>

Aquí necesitamos hacer referencia a nuestro archivo .php que vaya a cerrar la sesión.


cerrarSesion.php
<?php
 if (!$HTTP_POST_VARS['Cerrar Sesion']) {
   session_start();
   session_unset();
   session_destroy();
   header('Location: ../index.php');
 }
?>

En este archivo .php simplemente verificamos si se ha enviado el valor "Cerrar Sesion" para proceder a cerrar la sesión para finalmente redirigir con header() a la página que nosotros deseemos, en este caso a index.php

Espero que haya sido útil este sencillo tutorial sobre sesiones con PHP.






Guardar y Mostrar imágenes con PostgreSQL y PHP


Guardar y Mostrar imágenes con PostgreSQL y PHP


Una gran incógnita que tuve al momento de hacer una aplicación con PostgreSQL fue cómo guardar y cómo mostrar imágenes desde la base con PHP y noté que no hay mucha información VALIOSA en internet como para poder solucionar este inconveniente. A continuación les muestro un método que logré encontrar y adaptar para poder implementarlo en cualquier parte de nuestra aplicación.
Antes que hagamos cualquier cosa, debemos habilitar (si no lo tenemos)  los dll de GD en el php.ini, deben descomentar (quitar el ;) de php_bz2.dll, php_gd2.dll y php_gettext.dll tal como lo muestra la siguiente imagen:


Una vez que hayas realizado esto, debes reiniciar el Apache y listo, podrás trabajar con imágenes.

Crear los campos en la base
Para guardar la imagen en la base necesitamos 4 campos:

    CREATE TABLE imagen
    (

      id serial NOT NULL,
      nombre character varying(100),
      archivo bytea,
      tipo character varying(100),
      tamano double precision,
      CONSTRAINT imagen_pkey PRIMARY KEY (id )
    )

Lo en que se ven en negrita son los campos obligatorios, el campo id nos sirve para hacer la consulta en la base buscandola con el id.  El campo id tiene el tipo serial que nos sirve para que se vaya incrementando en 1 automáticamente.

Guardar la imagen
Para el proceso de ingresar las imágenes necesitamos de dos archivos, uno (.html o .php) desde el cual enviaremos la información y otro (.php) que procesará la información.

index.html
<html> 
  <form method="post" enctype="multipart/form-data" action="insImg.php"> 
    Archivo 
    <input type="file" name="foto" /> 
    <input type="submit" name="enviar" id="enviar" value="Guardar" /> 
  </form> 
</html> 

ingImg .php
      //Datos de imagen 
     $tipoImg = $_FILES ["foto"] ["type"];
     $nomTemp = $_FILES ["foto"] ["tmp_name"];
     $tamano = $_FILES ["foto"] ["size"];
     $nomImg = basename ( $_FILES ["foto"] ["name"] );

    // Contenido del archivo
     $fp = fopen ( $nomTemp, "rb" );
     $buffer = fread ( $fp, filesize ( $nomTemp ) );
     fclose ( $fp );

    // Escapa el contenido del archivo para ingresarlo como bytea 
    $buffer = pg_escape_bytea ( $buffer );
    $query="INSERT INTO imagen (nombre, archivo, tipo, tamano)
            VALUES ('$nomImg','$tipoImg','$tamano','$buffer')";

    pg_query(conPostgreSQL(),$sqlDir)
      or die("Error: ".pg_errormessage(conPostgreSQL()));

    pg_close(conPostgreSQL());

El primer código es del form que usamos para enviar la información, se debe tomar en cuenta la propiedad enctype="multipart/form-data" ya que ésta es la que nos permite enviar archivos mediante el form.

Otro punto a tomar en cuenta es la propiedad type="file" de la etiqueta input la cual nos muestra el cuadro de texto con el boton "Examinar" para buscar el archivo.


El segundo código es el que va a procesar la imagen para guardarla en la base, es una recuperación de variables como cualquier otra que hayamos hecho antes en PHP, la diferencia está en el proceso que le damos antes de insertarlos en la base.

Deben cambiar conPostgreSQL() por la función o la varible que contenga su conexión a la base de datos.

Mostrar la imagen
Para mostrar la imagen en la página necesitamos igualmente 2 archivos .php uno para mostrar como tal la imagen y otro para extraerla de la base.

download.php
   //Recupera el id pasado como parámetro
  $id = $_REQUEST ['id'];

  //Recupera el archivo en base al ID
  $sql="SELECT nombre, coalesce(archivo,'-1') FROM imagen

        WHERE id=$id";
  $result=pg_query(conPostgreSQL(),$sql) 

           or die ("Error: ".pg_last_error());

  //Recupera los atributos del archivo
  list($nomImg,$img)=pg_fetch_array($result);
  pg_free_result($result);

  if($img == -1)
    die( 'No existe el archivo para mostrar o bajar' );
 

  //Inicia la transacción
  pg_query(conPostgreSQL(), "begin");
  pg_close(conPostgreSQL()); 


  //Hace el proceso inverso a pg_escape_bytea, para que el archivo esté en su estado original
  $file=pg_unescape_bytea($img);

  //Envío de cabeceras
  header("Content-Disposition:attachment; filename=\"$nomImg\"");


  //Imprime el contenido del archivo
  print $file;


mostrarImagen.php 
  $idImg = idUsuario($_SESSION['usuario']);
  echo '<img src="php/download.php?id='.$idImg.'" />';
                   
 La variable $idImg la puedes obtener de varias formas, buscandola en la base por medio de otro dato que tengas en la tabla, o un SELECT a toda la tabla en caso de que quieras mostrar todas las imagenes, en mi caso, obtengo el id por medio de la función idUsuario($_SESSION ['usuario'])
que tiene como parámetro el usuario y me devuelve el ID del usuario.

Este último código como pueden ver se lo puede insertar prácticamente en cualquier parte, en una tabla, dentro de un <a>, etc.

Espero que este tutorial les haya servido para despejar sus dudas.

SW utilizado:
  • Windows 7 SP1  x86
  • PostgreSQL 9.1.1
  • Apache - version 2.2.20 (Instalado con StackBuilder de PostgreSQL)
  • PHP - version 5.3.8 (Instalado con StackBuilder de PostgreSQL)