Realizar una consulta a una base de datos MySQL desde PHP y presentarla es sencillo. El problema viene cuando debemos presentar 3000 registros y nos gustaría que el usuario no esperara hasta Nochebuena. En ese caso, se presenta un número menor de registros en la página (diez, viente) y se añaden enlaces para poder acceder a los demás. A esto se le llama paginación.
Mostrar los registros adecuados Para poder paginar debemos recibir en la página, además de los parámetros que reciba normalmente, uno que indique la página de resultados que deseamos obtener. Por defecto será 1 y lo llamaremos pag. Supongamos que tenemos una página que devuelve el nombre de todos los clientes de una empresa. La llamaremos, en un alarde de originalidad, clientes.php. Sería algo así:
<html>
<body>
<?php
$link = mysql_connect("localhost", "nobody");
mysql_select_db("mydb", $link);
$result = mysql_query("select nombre, apellidos from clientes", $link);
if (mysql_num_rows($result)){
echo "<table border = 1> n";
echo "<tr><td>Nombre</td><td>Apellidos</td></tr> n";
while ($row = mysql_fetch_array($result)) {
echo "<tr><td>".$row["nombre"].
"</td><td>".$row["email"]."</td></tr> n";
}
echo "</table> n";
}
else
echo "? No se ha encontrado ningún registro !";
?>
</body>
</html>Para poder soportar paginación debemos, primero, decidir cuantos registros presentamos por página (por ejemplo, 10) y recibir el número de página que debemos presentar. Hay dos maneras de obtener el número de registros totales y los registros que necesitamos para presentar la página. Nosotros utilizaremos dos consultas. En la primera obtendremos el total de registros de la tabla y, en la segunda, cogeremos sólo los registros que necesitamos haciendo uso de limit. Sustituiremos el código de la consulta por lo siguiente:
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("select count(*) from clientes", $link);
list($total) = mysql_fetch_row($result);
$tampag = 10;
$reg1 = ($pag-1) * $tampag;
$result = mysql_query("select nombre, apellidos from clientes
limit $reg1, $tampag", $link);Añadir los enlaces a otras páginas La primera labor que vamos a hacer es crear una función abstracta que reciba el número de registros que en total devuelve la consulta, el tamaño de página, el número de la página actual, y el texto del enlace hasta insertar el número de página. Este último parámetro puede resultar un poco confuso. Pongamos un ejemplo. Si en nuestra página recibimos ese número por el parámetro pag, si quisieramos ver la página 2 escribiríamos:
clientes.php?pag=2
Por lo tanto, como debemos quitar el número de página, nos quedará:
clientes.php?pag=<p>
La función deberá obtener primero el número total de páginas. Luego averiguará si existe una página anterior, escribiendo en enlace que va a esa página previa. Lo siguiente es escribir los enlaces a todas las páginas anteriores a la actual desde la 1. Luego escribe el número de la página actual, resaltado, pero sin enlace. Después escribe los números de las páginas posteriores y, finalmente, el enlace a la página posterior:
/* Funcion paginar
* actual: Pagina actual
* total: Total de registros
* por_pagina: Registros por pagina
* enlace: Texto del enlace
* Devuelve un texto que representa la paginacion
*/
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href="$enlace$anterior">?</a> ";
else
$texto = "<b>?</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href="$enlace$i">$i</a> ";
$texto .= "<b>$actual</b> ";
for($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href="$enlace$i">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href="$enlace$posterior">?</a>";
else
$texto .= "<b>?</b>";
return $texto;
}Además de incluir la función en nuestro script la tendremos que llamar después de cerrar la tabla:
echo paginar($pag, $total, $tampag, "clientes.phpópag=");
Y con esto ya tenemos un sistema de paginación que podremos utilizar en nuestras páginas.
La paginación de resultados es la única solución adecuada para poder mostrar al usuario los 4281 resultados que ha devuelto su búsqueda? ?pero como hacerloó
Bien, ya sabes lo que quieres. Quieres paginar resultados. ?Pero como hacerloó ?Cuantos resultados por páginaó ?Cuantas páginasó ?Y si resultan que me salen 1000 páginas? muestro un enlace a cada una de ellasó ?Solo muestro enlaces a las primeras 10 páginasó Y al cambiar de página? ?que hagoó ?debo volver a hacer la busquedaó Este artículo pretende dar respuesta a todas estas preguntas.
En realidad, paginar resultados es tan fácil como seguir los siguientes 3 pasos:
Paso 1Hacer una llamada a la base de datos para obtener el número total de resultados de la busqueda y asignar el resultado a una variable que llamaremos $total. Con MySQL la llamada debería ser algo así:
<?php $get = mysql_query(select count(*) from mitabla where ?); $total = mysql_result($get,0); ?>
Hacer otra llamada que devuelva los resultados de la busqueda, limitando los resultados devueltos mediante las variables $pp y $st. $pp define el número de resultados por páginas. $st define el número, del total de resultados, desde donde empezar a mostrar los resultados en la página actual.
Usando MySQL la llamada será algo así:
<?php
// obtener el valor de $st
if(isset($_GET[st])) {
$st = $_GET[st];
} else {
$st = 0;
}
// la llamada a base de datos
$get = mysql_query(select * from mitabla where ? limit .$st.,.$pp);
while($row=mysql_fetch_row($get)) {
// imprimir resultados
echo $row[0].
;
}
?>$st es una variable que se obtiene de la dirección de la página actual, por lo que su valor se debe obtener de la variable $_GET[?st?]. En la primera página de resultados $_GET[?st?] no esta definida, por lo que como puedes observar en el código superior tendremos que comprobarlo, y si resulta que no esta definida, tendremos que asignarle el valor 0.
Paso 3Aplicar la función paginacion() que se muestra a continuación. Esta función se encarga de imprimir una serie de enlaces a las páginas resultantes de la busqueda.
<?php
// resultados por pagina
$pp = 10;
// la función
function paginacion($total,$pp,$st,$url){
if($total>$pp) {
$resto=$total%$pp;
if($resto==0){
$pages=$total/$pp;
} else {
$pages=(($total-$resto)/$pp)+1;
}
if($pages>10){
$current_page=($st/$pp)+1;
if($st==0){
$first_page=0;
$last_page=10;
} else if($current_page>=5 && $current_page< =($pages-5)) {
$first_page=$current_page-5;
$last_page=$current_page+5;
} else if($current_page<5) {
$first_page=0;
$last_page=$current_page+5+(5-$current_page);
} else{
$first_page=$current_page-5-(($current_page+5)-$pages);
$last_page=$pages;
}
} else {
$first_page=0;
$last_page=$pages;
}
for($i=$first_page;$i< $last_page;$i++) {
$pge=$i+1;
$nextst=$i*$pp;
if($st==$nextst){
$page_nav .= <b>[.$pge.];
} else {
$page_nav .= <a href=".$url.$nextst.">.$pge.;
}
}
if($st==0) { $current_page = 1; } else { $current_page = ($st/$pp)+1; }
if($current_page< $pages) {
$page_last = <b>[<a href=".$url.($pages-1)*$pp.">>>>];
$page_next = [<a href=".$url.$current_page*$pp.">>];
}
if($st>0){
$page_first = <b>[<a href=".$url.0">< <<];
$page_previous = [<a href=".$url..($current_page-2)*$pp.">< ];
}
}
return "$page_first $page_previous $page_nav $page_next $page_last";
}
// mostrar resultado de la funcion
echo paginacion($total, $pp, $st, http://tudominio.com/mostrar.phpóst=);
?>Existen otras formas mas sofisticadas, pero vamos a mostrar una de las maneras mas sencillas de hacerlo. Lo primero es crear la carpeta que tendra las imagenes, en el ejemplo las imagenes estaran en:
imagenes/aleatorias
Posteriormente tendremos que renombrar las imagenes de la siguiente manera:
1.jpg, 2.jpg, 3.jpg, 4.jpg, etc.
Despues creamos el fichero aleatorias.php y metemos el siguiente codigo:
<?php $total = "11"; // Numero total de imagenes $extension = ".jpg";// Definimos la extension, puede ser .jpg, gif, bmp, etc. $carpeta = "imagenes/aleatorias";//Carpeta con las imagenes // De aqui para abajo no es necesario modificar nada $start = "1"; $random = mt_rand($start, $total); $image_name = $random . $extension; echo "<img src="$carpeta/$image_name" border="0">"; ?>
En este ejemplo, el script mostrara aleatoriamente una imagen entre el 1.jpg y el 11.jpg, pero puedes modificarlo .
Lo unico que falta por hacer, es colocar el siguiente codigo en la zona donde quereis que salga la imagen aleatoria. <?php include "aleatorias.php"; ?>
Puedes meter varias imagenes en distintas zonas, solamente es repetir el include para que salga una nueva imagen
Necesitamos un archivo de texto como nombres.txt: Julio Perez, julio@gmail.com, Guatemala Jose Lopez, jose@gmail.com, Mexico Enrique Marcos, enrma@gmail.com, Argentina Manuel Gomez, mangom@gmail.com, Mexico Julio Sanxhez, sanjo@gmail.com, Chile Carlos Lora, calor@gmail.com, Mexico
(No deje una línea vacía al final). En este caso los valores están separados por una coma, pero pueden serlo por espacios, tabuladores, comillas dobles, etcétera. Ahora el archivo nombres.php:
1:
2:<html>
3:<head>
4: <title>Leer archivo</title>
5: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6: <meta name="GENERATOR" content="Quanta Plus KDE">
7:</head>
8:<body bgcolor="#ffffff" text="#000000">
9:<table style="border: 2px dotted gray;margin-right:auto;margin-left:auto;">
10:<?
11:
12:$lines = file(nombres.txt);
13:
14:?>
15:
16:<tr style="text-align:center;background-color:#4a6890;color:#fff;">
17:<td>Nombre</td><td>Correo</td><td>Pais</td></tr>
18:
19:<?
20:foreach ($lines as $line_num => $line) {
21:
22: $datos = explode(",", $line);
23:?>
24: <tr>
25: <td> <?= $datos[0] ?></td>
26: <td style="background-color:#cccccc;"> <?= $datos[1] ?></td>
27: <td> <?= $datos[2] ?></td>
28: </tr>
29:<?
30: } //fin foreach
31:?>
32:</table>
33:
34:</body>
35:</html>En la línea 12, la función file() crea un array con las líneas del archivo nombres.txt. El resultado queda así:
Enviar un e-mail con PHP es muy sencillo, tan solo tenemos que utilizar la función mail. Pero cuando escribimos código HTML en el cuerpo del mensaje, este lo recibimos como texto y no como una página web, como querríamos. Esto tiene facil solución, solo necesitamos añadir la cabecera "Content-type: text/html" en el e-mail y el código que enviemos se interpretará como HTML. Veamos como:
AngelFire.com:<?php $codigohtml = <html> <head> <title>E-Mail HTML</title> </head> <body> <a href="http://www.webtaller.com">Ir a WebTaller </body>; $email = pepito@grillo.com; $asunto = E-Mail HTML; $cabeceras = "Content-type: text/htmlrn"; mail($email,$asunto,$codigohtml,$cabeceras); ?>
De esta forma, los e-mails que enviemos se verán como una página Web. En las cabeceras podemos añadir otras cosas, como por ejemplo si queremos especificar quien envía el e-mail haremos:
$cabeceras = "From: direccion@email.domrnContent-type: text/htmlrn"; De esta forma, el remitente del e-mail sería "direccion@email.dom"
Veremos gracias a este artículo como mediante javascript podemos lograr, eliminar las publicidades de la gran mayoría de los Hosting gratuitos de la red. He aquí unos cuantos ejemplos.
AngelFire.com:<script LANGUAGE="Javascript">
function ScreenIt(url,name,parm){
if(url.indexOf("/sys/popup_source.shtmlóCategory=")!=-1) return false;
return window.Xopen(url,name,parm);
}
window.Xopen=window.open;
window.open=ScreenIt;
</script><p align="center"> <iframe src width="1" height="1" marginwidth="0" marginheight="0" hspace="0" vspace="0"frameborder="0" scrolling="no">
Cómo cerrar sesión por inactividad o por cierre del navegador por parte del usuario.
Veremos como cerrar la sesión del usuario cuando:
El tiempo de inactividad del usuario supere "x" cantidad de tiempo (segundos, minutos, etc...).
El usuario cierre el navegador y abandone por completo nuestro sitio.
Algo que puede parecer muy obvio para unos y muy complejo para otros, pero que innegablemente muchos de nosotros nos hemos preguntado en algún momento: ?Cómo caducar una sesión en PHPó
Ahora veremos que tan sencillo es. Solo tendremos que:
Crear una nueva sesión que guarde una fecha y hora
Comprobar en nuestra capa de seguridad el tiempo transcurrido entre la sesión guardada y la hora actual
Actualizar la sesión o destruirla según corresponda
Lo primero que debemos hacer entonces, es crear la nueva sesión y asignarle como valor, la hora actual. Esto lo haremos en el momento que el usuario ingresa al sistema con sus datos de acceso.
<?
//vemos si el usuario y contraseña es váildo
if ($_POST["usuario"]=="miguel" && $_POST["contrasena"]=="qwerty"){
//usuario y contraseña válidos
session_name("loginUsuario");
//asigno un nombre a la sesión para poder guardar diferentes datos
session_start();
// inicio la sesión
$_SESSION["autentificado"]= "SI";
//defino la sesión que demuestra que el usuario está autorizado
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s");
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss
header ("Location: aplicacion.php");
}else {
//si no existe le mando otra vez a la portada
header("Location: index.phpóerrorusuario=si");
}
?>El segundo paso, será comprobar el tiempo transcurrido entre la fecha guardada y la hora actual en nuestra capa de seguridad y actuar en consecuencia.
Para hacerlo, tendremos que realizar un cálculo muy sencillo:
tiempo transcurrido = (hora actual - fecha guardada)
Y luego, restará saber si el tiempo transcurrido es mayor, menor o igual que el tiempo de caducidad de la sesión (representado como "x"):
si (tiempo transcurrido >= x), actúo en consecuencia a lo hallado
Para efectuar estos cálculos utilizaremos como unidad de tiempo el segundo. En nuestro ejemplo, caducaremos la sesión, transcurridos 10 minutos de inactividad (donde: 10*60 = 600 segundos). Para efectuar estos cálculos y tomar como unidad de medida el segundo, será necesario convertir las fechas a segundos. Para ello, utilizaremos la función strtotime.
Por lo tanto, calcularemos el tiempo transcurrido (tiempo transcurrido = (hora actual - fecha guardada)) de la siguiente manera:
<?
//iniciamos la sesión
session_name("loginUsuario");
session_start();
//antes de hacer los cálculos, compruebo que el usuario está logueado
//utilizamos el mismo script que antes
if ($_SESSION["autentificado"] != "SI") {
//si no está logueado lo envío a la página de autentificación
header("Location: index.php");
} else {
//sino, calculamos el tiempo transcurrido
$fechaGuardada = $_SESSION["ultimoAcceso"];
$ahora = date("Y-n-j H:i:s");
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));
//comparamos el tiempo transcurrido
if($tiempo_transcurrido >= 600) {
//si pasaron 10 minutos o más
session_destroy(); // destruyo la sesión
header("Location: index.php"); //envío al usuario a la pag. de autenticación
//sino, actualizo la fecha de la sesión
}else {
$_SESSION["ultimoAcceso"] = $ahora;
}
}
?>El uso de cookies es muy frecuente para cosas como recordar la contraseña de una area de usuarios, saber cuantas visitas hemos recibido de un mismo usuario o para distinguir a ese usuario entre otros muchos.
El uso de cookies en PHP es muy sencillo, para enviar cookies al usuario utilizaremos la función setcookie() pero no podemos llamar a esta función donde queramos. La función setcookie debe ser utilizada antes de cualquier salida al navegador, es decir, hay que usarla antes que cualquier echo o función que impriman algo en pantalla y antes de cualquier etiqueta HTML. Un fallo muy común es poner espacios o saltos de línea antes de "<?php" eso tampoco está permitido antes de llamar a la función setcookie.
La función setcookie toma esencialmente 3 parámetros, tiene más, pero estos son los básicos. El primero es el nombre de la cookie, el segundo el valor y el tercero el tiempo de expiración, es decir, en que fecha deberá el navegador del usuario borrar esa cookie. Por ejemplo:
setcookie("webtaller",1,time()+30*24*60*60);Con esta sentencia pondremos una cookie llamada webtaller, con el valor 1 y que expirará dentro de 30 días. También tenemos que tener en cuenta que la cookie no la tendremos disponible hasta que el usuario recargue la página.
Para leer una cookie lo podemos hacer con la variable $_COOKIE[nombrecookie]. Por ejemplo:
if(isset($_COOKIE[webtaller])) {
$_COOKIE[webtaller]++;
setcookie("webtaller",$_COOKIE[webtaller],time()+30*24*60*60);
} else {
setcookie("webtaller",1,time()+30*24*60*60);
}Con este pequeño script lo que hemos hecho es un contador de visitas por usuario. De esta forma sabremos cuantas visitas ha hecho el usuario a la página donde pongamos este código.
Para seleccionar datos aleatoriamente tenemos que tener en cuenta la normalización de SQL y que posiblemente no todas apliquen a algunos gestores de bases de datos.
En primera debemos tener en claro una simple sentencia en SQL para seleccionar datos.
select * from `tabla` order by `campo` DESC limit 0,10
Con esta sentencia en sql lo que estamos haciendo es seleccionar los datos de la tabla, que los ordene dependiendo del tipo campo y que tenga un límite de 10 campos. Es así como funciona una sentencia común en SQL.
Para obtener registros aleatorios o azarosos de una tabla se requiere tener la siguiente sentencia:
select * from `tabla` order by rand() DESC limit 0,10
Al igual nos mostrará 10 campos pero estos de manera aleatoria y de límite 10, esto es muy eficiente para hacer más dinámico nuestro sitio web y de más vistosidad y facilidad de acceso a la información.
Para unir esta sentencia con PHP para mostrar los resultados analicemos el siguiente código.
<?
## nos conectamos a mysql
include("conexion.php");
## Tomamos los datos aleatorios de la tabla
$query = mysql_query("select * from `tabla` order by rand() limit 0, 10");
## creamos un bucle para que nos muestre los resultados
while ($campo = mysql_fetch_array($query)){
echo $campo["campo"];
}
## liberamos memoria de la sentencia
mysql_free_result($query);
## finalizamos conexión
mysql_close();
?>El código PHP anterior nos muestra por pasos lo que se requiere para seleccionar los datos al azar, existen algunos artículos referidos en la cual este artículo depende. Entre ellos puedes visitar: "Conexión a MySQL", "Alternar filas de color con PHP", entre otros más asesores. También puedes visitar el manual de PHP.net de Funciones MySQL.
Mucho más sencillo de lo que uno imagina, es hacer que una sesión caduque en forma automática cuando el usuario cierre el navegador.
En principio, vamos a definir a que nos referimos con cerrar el navegador. El servidor entenderá que el usuario cerró el navegador cuando ya no se encuentre visitando ninguna de las páginas de nuestro sitio. Es decir, si un usuario que para navegar nuestro sitio abrió al menos 2 páginas en 2 ventanas diferentes, el servidor considerará que cerró el navegador cuando hasta la última ventana sea abandonada. Ya sea porque el usuario la cerró o porque fue hacia otro sitio que no es el nuestro.
Entonces, para que la sesión caduque al cerrar el navegador, habrá que, por un lado, forzar al php.ini a que propague la sesión solamente en cookies y por otro lado, asignarle a ésta, una duración cero.
Para forzar al php.ini hay dos formas: modificar el php.ini directamente o cambiar los valores desde nuestro script.
Opción 1Configurar el archivo de inicio de php (php.ini) en forma directa.
Si tienes acceso a este archivo, habrá que buscar y cambiar el valor a:
session.use_trans_sid = 0 session.use_only_cookies = 1
Esta última, justamente será la que indicará que la sesión debe propagarse solo a través de cookies.
Opción 2Cambiar la configuración del php.ini desde nuestro script php.
Esta opción consiste en forzar al php.ini desde nuestro script php (No todos los servidores tienen habilitada esta opción. Si el servidor no es propio, por las dudas, consulta con tu proveedor).
Para hacerlo, utilizaremos la función ini_set()
ini_set("session.use_trans_sid","0");
ini_set("session.use_only_cookies","1");Ahora solo restará, cambiar el parámetro de duración a la cookie de la sesión. Esto lo haremos en nuestro script con la siguiente instrucción:
session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0);
Con lo cual estaremos indicando una duración de 0 (cero) segundos. Esto significará que durará hasta que termine el script. Por fin, hemos llegado al código:
Cierre de sesión al cerrar el navegador en PHP: módulo de control de datos
Verás reflejados los cambios al script anterior, indicados en negritas. Estos cambios serán también los que se apliquen al módulo de seguridad. De todas formas, aquí te cargo los dos códigos.
//si es necesario cambiar la config. del php.ini desde tu script
ini_set("session.use_only_cookies","1");
ini_set("session.use_trans_sid","0");
//vemos si el usuario y contraseña es váildo
if ($_POST["usuario"]=="miguel" && $_POST["contrasena"]=="qwerty"){
//usuario y contraseña válidos
session_name("loginUsuario");
//asigno un nombre a la sesión para poder guardar diferentes datos
session_start();
// inicio la sesión
session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0);
//cambiamos la duración a la cookie de la sesión
$_SESSION["autentificado"]= "SI";
//defino la sesión que demuestra que el usuario está autorizado
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s");
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss
header ("Location: aplicacion.php");
}else {
//si no existe le mando otra vez a la portada
header("Location: index.phpóerrorusuario=si");
}
?> Cierre de sesión al cerrar el navegador en PHP: módulo de control de datos Verás reflejados los cambios al script anterior, indicados en negritas.
//si es necesario cambiar la config. del php.ini desde tu script
ini_set("session.use_only_cookies","1");
ini_set("session.use_trans_sid","0");
//iniciamos la sesión
session_name("loginUsuario");
session_start();
session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0);
//cambiamos la duración a la cookie de la sesión
//antes de hacer los cálculos, compruebo que el usuario está logueado
//utilizamos el mismo script que antes
if ($_SESSION["autentificado"] != "SI") {
//si no está logueado lo envío a la página de autentificación
header("Location: index.php");
} else {
//sino, calculamos el tiempo transcurrido
$fechaGuardada = $_SESSION["ultimoAcceso"];
$ahora = date("Y-n-j H:i:s");
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));
//comparamos el tiempo transcurrido
if($tiempo_transcurrido >= 600) {
//si pasaron 10 minutos o más
session_destroy(); // destruyo la sesión
header("Location: index.php"); //envío al usuario a la pag. de autenticación
//sino, actualizo la fecha de la sesión
}else {
$_SESSION["ultimoAcceso"] = $ahora;
}
}
?>