miércoles, 24 de diciembre de 2008

Simple Galeria de imagenes con PHP


En los ultimos dias estube buscando por internet una galeria de imagenes lo mas basica posible donde el usuario pudiera ver un conjunto de "vistas miniaturas" (preview) de las imagenes y seleccionar la que quisieran ver mas grande. Eso era todo.

En mi etapa de busqueda di con una libreria que hacia exactamente lo que yo queria, me parecio excelente, la pude conseguir en la pagina http://bolgallery.free.fr/. Esta libreria permite colocar una serie de imagenes en un directorio "images", a partir de estas imagenes la galeria genera las vistas en miniatura de las imagenes, ademas permite generar dos tipos de vistas miniatura que explicare mas adelante. Es muy facil de configurar e instalar.

Cuando vi esta galeria decidi realizarle unas mejoras para permitir el uso de multiples etiquetas sobre una foto, una base de datos para llevar estadisticas de la cantidad de veces que se ha visto una foto, subir las fotos remotamente, aplicar etiquetas, etc.


En resumen la galeria que mejore ofrece las siguientes funcionalidades:
  1. Permite asignar nuevas o viejas etiquetas a una fotografia.
  2. Permite agregar fotografias de manera remota y aplicarle las etiquetas dinamicamente.
  3. Permite visualizar conjuntos de imagenes a partir de la combinacion de una o mas etiquetas de manera simultanea, colocando la variable "labels" en el URL de la pagina igualada a las etiquetas deseadas separadas por comas. Ej: migaleria.php?labels=etiqueta1,etiqueta2,etiqueta3
  4. Genera dinamicamente las vistas previas de las fotografias subidas.
  5. Las vistas previas generadas pueden ser de dos tipos: Version a escala de la fotografia a visualizar o recorte aleatorio de una porcion de la fotografia (definido por el webmaster).
  6. Maneja estadisticas de las vistas o clicks que el usuario ha realizado para cad auna de las fotografias.
  7. Autenticacion de usuario para permitir que solo los usuarios autorizados (aministradores) puedan modificar las fotos. Para aprender mas sobre esto puedes ir a mi tutorial de autenticación de usuario.
Instalacion de la galería

Para su utilización no hace falta mas que colocar la carpeta "galeria" en cualquier directorio del servidor, la carpeta llamada "images" será donde se ubicarán todas las imagenes agregadas.

Luego se procede a crear la base de datos y tablas con el script bd.sql ubicado en el directorio raiz de la galeria.

El directorio donde se encontraría ubicada la galeria quedaria con los archivos index.php, admin.php, bd.sql, leeme.txt y las siguientes carpetas:

- images.
- autenticación.
- galeria_de_fotos.

Explicacion de los directorios:

-Images: Debe tener todos los permisos de escritura. Donde se irán guardando todas las imagenes de la galeria, las vistas previas de guardarán automaticamente dentro de este directorio en una carpeta llamada bolGallery.

- Autenticación: contiene todo el modulo para la logica de seguridad. esta carpeta no debe ser modificada. Contiene el archivo registro.php que tiene el formulario para la creación de un nuevo usuario, es importante mantener esta pagina bien oculta (o eliminarla una vez creado el usuario administrador) para que nadie pueda registrarse y modificar, subir o eliminar las fotos.

- Galeria_de_fotos: contiene dos paginas importantes:

1) index.php: Es el front de la galeria de imagenes, es decir, la pagina que verán lo usuarios finales, los que visiten la galeria, puede ser modificado a placer siempre que se mantenga la llamada a la funcion bolGallery del archivo bolGallery.php. El siguiente es un ejemplo de una llamada:
        include("bolGallery.php");
if(isset($_GET['labels']))
{
$array = split(",", $_GET['labels']);

bolGallery("../images/",$array, 6, 150, 150,1);
}
else
bolGallery("../images/",null, 6, 150, 150,1);

La funcion bolGallery recive los siguientes parametros:

a) URL de el directorio donde se encuentran las imagnes: esto no debe modificarse.
b) tablas de referencia: No debe modificarse.
c) cantidad de columnas que se quiere que tenga la galeria.
d) el ancho en pixeles de las vistas previas de la galeria.
e) el alto en pixeles de las vistas previas de la galeria.
f) un booleano que es "true" si se desea colocar una vista previa en tamaño escala de la imagen o "false" si se desea un recorte aleatorio de una porcion de la fotografia.

2) admin.php: El modulo de administrador, esa página no se debe modificar.

Espero que todo les funcione correctamente, cualquier duda no duden en entrar a mi pagina enviarme un correo a: aalejo@gmail.com. Para ver un ejemplo de la galeria en funcionamiento puedes hacer click aqui. Recuerda crearte un usuario para poder modificar las imagenes.


Continuar leyendo...

jueves, 4 de diciembre de 2008

Video Tutorial - Contador de usuarios online con PHP


En este caso quiero seguir con la tana de contaores, en esta oportunia decidi implementar un contador de usuarios online, es decir, este contador nos puede decir con relativa certeza cuantos usuarios se encuentran navegando en nuestra página actualmente.

La implementacion de este contador decidi hacerla de dos maneras, con archivos de texto o con una base de datos MySQL. A todos los que lean este articulo, que no es mucha gente :( , les recomiendo ampliamente la opcion de la base de datos, pero como a veces es costoso alojar una pagina web en un servidor con MySQL, les dejo el ultimo recurso de implementar el contador con archivos de texto.

Para implementar el contador vamos a cumplir con dos premisas principales:
  1. Borrar usuarios con registro obsoleto es nuestra primera accion, si ha pasado mucho tiempo sin dar señales de vida, entonces debemos eliminarlo de la lista hasta que vuelva a aparecer.
  2. Registrar o actualizar usuario, todos los clientes que dan señales de vida son incluidos automaticamente en el archivo de texto o base de datos (Si el usuario ya existia entonces solo se actualiza la fecha).



Contador con archivos de texto
Primero vamos a implementar el contador con archivos de texto, vamos a crear una pagina llamada uactivos.php que va a contener el siguiente código:

Código uactivos.php

<?php


// Usuarios activos con PHP sin utilizar bases de datos


//IP del usuario

$id = $_SERVER [ 'REMOTE_ADDR' ];


// Tiempo en segundos en que expira la sesión.

$fin_session = 600;


//Archivo que contiene los usuarios y tiempo

$archivo = "usuarios.txt";


//Si el archivo no existe lo creo

if(!file_exists($archivo))

{

$a = fopen($archivo, "w");

fclose($a);

}


$arr = file($archivo);

$contenido = $id.":".time()." ";


for ( $i = 0 ; $i < sizeof($arr) ; $i++ )

{

$tmp = explode(":",$arr[$i]);

if (( $tmp[0] != $id ) && (( time() - $tmp[1] ) < $fin_session ))

{

$contenido .= $id.":".time()." ";

}


}

$fp = fopen($archivo,"w");

fputs($fp,$contenido);

fclose($fp);

$array = file($archivo);


$USUARIOS_ACTIVOS = count($array);


?>

<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td><p>&nbsp;</p>

<p>Usuarios activos (online) con PHP.</p></td>

</tr>

<tr>

<td height="170" align="center" valign="top"><p align="left"><br />

<br />

<br />

<h1><?php echo "Hay ".$USUARIOS_ACTIVOS." usuarios activos"; ?></h1>

</p>

<p align="left">&nbsp;</p>

<p align="left"></p>

<p align="center">Alejandro Sánchez - <a href="http://internetdeveloping.blogspot.com/">http://internetdeveloping.blogspot.com/</a></p></td>

</tr>

</table>

Lo primero que hacemos es almacenar en una variable $ip la direccion del host (usuario) que esta accediendo a nuestra página, esto lo hacemos con una variable de servido que ya viene predefinida en PHP, $_SERVER [ 'REMOTE_ADDR' ]. Luego procedemos a decidir cuanto tiempo queremos que pase un usuario sin dar señales de vida (realizando acciones dentro de la pagina) para que lo consideremos como offline o inactivo, el tiempo que consideremos no debe ser ni muy grande ni muy pequeño, y por supuesto que va ajustado al tipo de pagina que nosotros estemos desarrollando ya que hay paginas donde los usuarios deben obligatoriamente estar actuando dentro de la pagina mientras hay otras paginas donde hay grandes lecturas o tutoriales que no requieren e mucha interaccion con el usuario. En este ejemplo decidi poner 600 segundos como un simple numero que me parecio sensato.

El siguiente paso es verificar si el archivo donde queremos almacenar los atos de los usuarios existe o si debemos crearlo, con la funcion file_exists() de PHP podemos averiguar si el archivo especificao existe. Esto lo hacemos con el siguiente coigo:

if(!file_exists($archivo))
{
$a = fopen($archivo, "w");
fclose($a);
}
La funcion file() nos permite leer todo el contenido de un archivo y almacenar cada line en una casilla diferente de un arreglo. En este caso, una nueva linea en el archivo representa un nuevo usuario en la pagina, por lo que esta funcion nos cae como anillo al dedo.

$arr = file($archivo);
Una vez que tenemos toda la informacion en el arreglo procedemos a recorrerlo realizano una division que transforma la lina de texto original en dos sub cadenas, el operador ":" es el encargado de marcar la separacion entre la primera y la segunda cadena de caracteres.

$tmp = explode(":",$arr[$i]);
El arreglo $tmp ahora contiene las dos subcadenas que representan lo sigueinte, la primera representa el IP de el usuario y la segunda el instante en el tiempo en que se registro, debemos verificar que no se ha cumplido su tiempo establecido para dar señales de vida, ya que de lo contrario debemos eliminarlo del archivo de texto.

Ahora procedemos a actualizar el archivo con los nuevos IP de usuarios y a imprimir pon pantalla la cantidad de usuarios en linea.

Contador con BD MySQL
Ahora procedemos a crear el contador con base de datos, la logica planteada sera practicamente la misma, son los detalles de carpinteria los que voy a explicar:

Script para la creacion de la tabla usuarios_activos.php
CREATE TABLE `usuarios_activos` (
`id` bigint(20) NOT NULL auto_increment,
`ip` varchar(11) NOT NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3

Como en este caso estamos trabajando con una base de datos vamos a utilizar las funciones mysql_query, mysql_num_row y mysql_fetch_row.

Luego de registrar el IP y el tiempo en que expira la sesion, el siguiente paso es borrar de la BD todos los registros que tienen un tiempo mayor al tiempo de expiracion (desde que se registraron). Asi garantizamos que no hay ningun usuario obsoleto y podemos proceder a registrar el usuario actual (si es que el mismo no pertenede ya a la tabla de usuarios online), si el ya pertenece entonces le actualizo su hora de registro para que pueda ser considerado mas tiempo como usuario activo.

UActivo.php

<?php

require('conexion.php');

// Usuarios activos con PHP sin utilizar bases de datos


//IP del usuario

$id = $_SERVER [ 'REMOTE_ADDR' ];


// Tiempo en segundos en que expira la sesión.

$fin_session = 600;


mysql_query("DELETE FROM usuarios_activos WHERE time_to_sec(NOW())-time_to_sec(time) > ".$fin_session);


$results = mysql_query("SELECT * FROM usuarios_activos WHERE ip='".$id."'");


if(mysql_num_rows($results)==0)

{

mysql_query("INSERT INTO usuarios_activos VALUES('','".$id."',NOW())");


}


$results = mysql_query("SELECT count(*) FROM usuarios_activos WHERE ip='".$id."'");

$row = mysql_fetch_row($results);


?>

<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td><p>&nbsp;</p>

<p>Hola mundo en PHP, el codigo en este lenguaje debe incluirse entre las etiquetas &lt;?php ?&gt; y para imprimir por pantalla debe usarse la funcion &quot;echo&quot; seguida de la variable, numero o string que se desea imprimir.</p></td>

</tr>

<tr>

<td height="170" align="center" valign="top"><p align="center"><br />

<br />

<br />

<span class="style6"><h1><?php echo "Hay ".$row[0]." usuarios activos"; ?></h1></span></p>

<p align="left">&nbsp;</p>

<p align="left"></p>

<p align="center">Alejandro Sánchez - http://internetdeveloping.blogspot.com/</p></td>

</tr>

</table>

Aqui les dejo un video tutorial sobre el tutorial que acabo de explicar (o intentar explicar), espero que les aclare mejor sobre el tema, cualquier pregunta no duden en preguntarme escribiendome a mi correo aalejo@gmail.com o por este mismo blog.
Parte 1 (Archivo de texto)

Parte 2 (MySQL)



Continuar leyendo...

Video Tutorial - Contador de visitas UNICAS con PHP


Continuando con la tanda de contadores, he decidido publicar la implementacion de un contador de visitas únicas. "Visita unica" significa que un usuario que entra a la pagina web por segunda, tercera o cuarta vez, etc. No es tomado en cuenta por el contador, ya que la primera vez que el usuario ingreso ya fue registrada su visita.

Este tipo de contadores permite acercarnos mucho mas a la realidad actual de nuestra pagina web, ya que en el caso de los contadores simples, la informacion que estos registran no puede ser confiable dado que pueden ocurrir recargas de paginas, visitas repetidas, etc. Y estas no son diferenciadas por los contadores estandar.

Para empezar el tutorial debemos crear una BD en MySQL llamada "contador_visitas_unicas", en esa base de atos vamos a agregar la siguiente tabla:
CREATE TABLE `visitas` (
`id` int(4) unsigned NOT NULL auto_increment,
`direccion_ip` varchar(16) default NULL,
`fecha` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;
Como pueden ver, la tabla contiene tres campos: ID, Direccion IP y Fecha. Vamos a enfocarnos en los ultimos dos datos, dado que el primero no es realmente necesario. En el campo Direccion IP de esta tabla, es donde vamos a almacenar el identificador unico de cada computadora (su IP).

Tambien vamos a usar una columna llamada "Fecha" donde vamos a registrar el dia en que fue almacenada la ip, ya que las visitas unicas son por dia, si el ultimo registro fue hace mas de un dia, entonces podemos volver a regstrarlo.

Debemos entonces conectarnos a la base de datos, para eso vamos a crear un archivo llamado conexion.php que vamos a importar a la página con la funcion "require()" donde estemos desarrollando y necesitemos conexion con la base de datos:

Código conexion.php



<?php

/* conexion ****************/

// conectamos al servidor MySQL

$link = mysql_connect('localhost', 'root', '');

if(!$link) {

die("Error al intentar conectar: ".mysql_error());

}

// seleccionamos la base de datos

$db_link = mysql_select_db('contador_visitas_unicas', $link);

if(!$db_link) {

die('Error al intentar seleccionar la base de datos'. mysql_error());

}

/* fin conexion ************/


?>

Una vez realizada la conexion, debemos crear el archivo "contador.php", en este archivo esta toda la logica de la página:

Código conexion.php

<?php

//Sript hecho por Alejandro Sanchez

//www.internetdeveloping.blogspot.com


//Me conecto a la BD

require('conexion.php');


//Devuelve el numero de visitas a partir de una fecha en especifico

function contarVisitas($aniodesde, $mesdesde, $diadesde )

{

$sql="select count(*) from visitas

where fecha >= '$aniodesde-$mesdesde-$diadesde'";

$result= mysql_query($sql);

if($row = mysql_fetch_array($result))

{

return $row[0];

}

else

return(0);

}


//Imprime todas las visitas

function imprimirVisitas()

{

$sql="select direccion_ip, fecha from visitas";

$result= mysql_query($sql);

while($row = mysql_fetch_row($result))

{

echo "fecha: " . $row[1] . " | Direccion ip ---> " . $row[0] . "<br>";

}

}


//Esta funcion solo registra una visita si ese mismo dia el usuario no ha entrado ala pagina

function registrarVisita($IDUSER)

{

/* --------------------------------------------------

Primero hacemos una consulta para ver si ese mismo

usuario ya está registrado el día de hoy.

------------------------------------------------- */

$sql="select * from visitas

where direccion_ip='$IDUSER'

and fecha=CURDATE()";


$result= mysql_query($sql);



if(mysql_num_rows($result)==0) // Registrar la visita

{

$sql="INSERT INTO visitas VALUES(NULL,'$IDUSER',CURDATE())";



mysql_query($sql);

}

}


registrarVisita($_SERVER [ 'REMOTE_ADDR' ]);

?>

<style type="text/css">

<!--

.style6 {font-size: 24px;

font-family: Georgia, "Times New Roman", Times, serif;

font-weight: bold;

}

-->

</style>

<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td><p>&nbsp;</p>

<p>Contador de visitas unicas, los visitantes repetidos seran ignorados, hasta el dia siguietne.</p></td>

</tr>

<tr>

<td height="170" align="center" valign="middle"><p align="left"><br />

<br />

</p>

<?php

echo "Hasta ahora haz recibido un total de ".contarVisitas(2007, 10, 03 )." visitas unicas por dia";

echo "<BR><BR>Detalles de visitas: <br>";

imprimirVisitas();

?>

<p align="left"></p>

<p align="center">Alejandro Sánchez - <a href="http://internetdeveloping.blogspot.com/">http://internetdeveloping.blogspot.com/</a></p></td>

</tr>

</table>

En este archivo podemos destacar principalmente tres funciones:
  • contarVisitas(Año, Mes, Dia), recibe una fecha y devuelve todas las visitas unicas que han habido en la página desde esa fecha:
Para realizar esa consulta debemos utilizar las funciones mysql_query y mysql_fetch_array que nos proporciona el framework de PHP.
  • imprimirVisitas() Imprime el IP y la fecha de todas las visitas unicas que ha tenido la pagina hasta la fecha.
  • registrarVisita(Direccion IP), esta es la funcion mas importante, primero realiza una consulta en la base de datos sobre el usuario con la IP proporcionada en los parametros de la funcion y cuya fecha sea del mismo dia que hoy. Si el resultado de esta consulta es vacio entonces se procede a insertar al usuario, de lo contrario no se hace nada, porque ya el usuario fue registrado en otra visita anterior en este dia.
A continuación les dejo un video tutorial con todo lo que acabo de explicar durante este tutorial, cualquier duda no duden en escribir! estamos para servir! :) aalejo@gmail.com.



Tambien les dejo el codigo fuente y un ejemplo funcionando:


Continuar leyendo...