Iniciación al PHP - Capítulo 3

Escrito por [Bolo]

Publicado: 1/08/2006
    Actualizado: 1/08/2006
   


Introducción

Para comprender el tutorial de nivel medio sobre php sería necesario tener unas nociones mínimas de este lenguaje o bien haber leído los tutoriales de iniciación al php I y II que encontraréis en la sección tutoriales de esta web.

0.- Uso de variables externas
1.- Encriptación de contraseñas con PHP
2.- Validación de cadenas
3.- Envio de e-mails
4.- Gestión de fechas
5.- Gestión de carga y descarga de ficheros

 

0.- Uso de variables externas

Las variables externas son aquellas que no van propiamente en el código de nuestro *.php, sino que se asignan externamente. Éstas son las variables tipo $_POST que son utilizadas en los formularios, por ejemplo el campo "nombre" cuya etiqueta se llama "name" sería la variable $_POST['name'].

Luego podemos encontrar las variables tipo $_GET que son menos seguras que las anteriores y son más propensas a vulnerabilidades, pero que a pesar de ello siguen siendo necesarias. Estas variables se utilizan para pasar variables de una url a otra como por ejemplo:

ejemplo.php?accion=1&id=error

En este ejemplo vemos como le pasamos la variable "accion" que esta igualada a 1, y la variable "id" que esta igualada a error.

1.- Encriptación de contraseñas con PHP

Realmente no tiene porqué ser una contraseña, de hecho es un simple texto sin más, pero el uso principal es para encriptar en las bases de datos esta contraseña para evitar vulneraciones de seguridad .

$password=md5($password);

Una vez ya encriptada la contraseña es cuando la puedes guardar en la base de datos, eso sí, si encriptamos la contraseña..., ¿luego cómo hacemos la verificación? Simple, como en nuestra base de datos tenemos la contraseña encriptada, tan sólo tendremos que encriptar de nuevo la contraseña que introduce el usuario y si coincide con la que tenemos en la base, es que es correcta.

A pesar de ello, no se solventan del todo los problemas de seguridad de datos, ya que a menos de utilizar SSL ( o transmisión segura, la típica web con Https:// ) es posible que una tercera persona esté escuchando los datos enviados en texto plano y que se encriptan en el servidor. Está la posibilidad de disponer de Javascript MD5 y de esta forma ya se encripta la contraseña en el ordenador del cliente.

 

2.- Validación de cadenas

La función capaz de validar cadenas se puede aplicar a muchos campos y situaciones, pero sin duda en páginas web el más usado es para comprobar que la casilla "e-mail" de un formulario está rellenada correctamente. Es una función muy sencilla que no requiere grandes explicaciones.

eregi ("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$" ,$mail)

Lo que hace dicha función es verificar que la variable $mail se corresponde con el patrón comparado, en este caso se permite cualquier texto (incluyendo guiones ) seguido de una @ seguido de nuevo por un texto, separado luego por un "." y que por último como mínimo hay 2 caracteres más no númericos. Si $mail tiene las características explicadas, la función eregi() devuelve true, si por el contrario no coincide el formato, devuelve false.

 

3.- Envio de e-mails

Hoy en día todas las páginas web usan este servicio para poder estar en contacto con los internautas, ya sea mediante el típico enlace "mailto" o bien mediante formularios. Yo me voy a basar en este último que es el que a nivel de programación nos interesa. Para ello voy a comentar un simple "recomiéndanos a un amigo".

<form method="post" action="recomendar.php?accion=enviar" name="recomienda">
<b>Recomienda este sitio</b><br><br>
Tu Nombre: <input type="text" name="n_remitente" size="10"><br>
Tu E-mail: <input type="text" name="e_remitente" size="20"><br>
Nombre de tu amigo: <input type="text" name="n_destinatario" size="10"><br>
E-mail de tu amigo: <input type="text" name="e_destinatario" size="20"><br><br>
<input type="submit" value="Recomendar">

</form>

No voy a comentar el formulario, puesto que para ello ya hay otros tutoriales. A continuación voy a poner un ejemplo de cómo debe configurarse el e-mail para que llegue a buen recaudo.

// recojo las variables que vienen desde el formulario
$n_destinatario = $_POST['n_destinatario'];
$e_destinatario = $_POST['e_destinatario'];
$n_remitente = $_POST['n_remitente'];
$e_remitente = $_POST['e_remitente'];

// si los campos no están vacíos
if ($n_destinatario != "" && $e_destinatario != "" && $n_remitente != "" && $e_remitente != "") {
$url = "http://www.ayuda-internet.net";
$nombre_del_sitio = "Página de #Ayuda_Internet";
$asunto = $n_remitente . " te recomienda este sitio";
$mensaje = "Hola " . $n_destinatario . ":<br>";
$mensaje .= $n_remitente . " te recomienda que visites <b>" . $nombre_del_sitio . "</b>.<br>";
$mensaje .= "En: <a href='" . $url . "'>" . $url . "</a><br><br>";

//indica que el mail se envía en formato HTML

$encabezado = "From:".$e_remitente."\nReply-To:".$e_remitente."\n";
$encabezado .= "X-Mailer:PHP/".phpversion()."\n";
$encabezado .= "Mime-Version: 1.0\n";
$encabezado .= "Content-Type: text/html";

//envía el mensaje

mail($e_destinatario,$asunto,$mensaje,$encabezado);

Es muy simple, las primeras líneas son para configurar quién es el remitente, el destinatario, el asunto y el mensaje mediante la concatenación de cadenas. Lo que llama la atención es el $encabezado, si, bien esto es para que los mails lleguen a buen recaudo, es una forma de conseguir enviar mails pero en vez de en texto plano en formato html. Lo único editable del $encabezado es el nombre de la variable $e_remitente, el resto no lo modifiquéis, o tendréis serios problemas.

Por último, llega la función mail() como podéis ver es muy simple, tan sólo hay que pasarle los parámetros que como se puede apreciar en el código, el orden es el siguiente: destinatario, asunto, mensaje, encabezado.

 

4.- Gestión de fechas

Para poder gestionar fechas con PHP existe la función time() que lo que hace es almacenar la fecha y hora actual en segundos desde el 1 de Enero de 1970. Es lógico que un formato en segundos sea totalmente incómodo para las personas, así que para solucionar este pequeño percance usamos la función date() que por medio de una sentencia le fijas un formato.

$lafecha=$resultados['time'];
$lafecha=date("j/m/y g:i A",$lafecha);

j = representación numérica del día
m = representación numérica del mes
y = representación numérica del año
g = formato de 0 a 12
i = minutos

A = formato AM i PM

5.- Gestión de carga y descarga de ficheros

La necesidad de controlar todos los archivos que tenemos en un servidor (o nuestro espacio web) se hace inevitable para poder controlar el espacio de nuestro sitio web, para ello tenemos la posibilidad de utilizar una función para gestionar la subida al servidor (copy()) y otra para borrar el archivo del servidor (unlink()) sin necesidad de tener que acceder vía ftp. El único inconveniente de este método, es que la función copy() está limitada a un cierto tamaño del fichero.

Primeramente deberíamos montar un formulario donde declararemos el tipo de documento, en este caso un fichero, aquí os muestro un pequeño ejemplo:

<form method="post" action="archivos.php?accion=upload" enctype="multipart/form-data" name="form1">
<input name="userfile" type="file">
<input type="submit" value="Upload">
</form>

 

Como podéis observar hago uso de la variable externa accion para llamar a nuestro php. Y en enctype declaro que son datos lo que vamos a enviar. Por último comentar de este código que donde se declara el tipo de documento, debemos poner "file", es muy importante, de esta forma incluso tendremos opción a la típica ventana para cargar archivos.

Bien, vamos a copiar nuestro archivo al servidor (upload) y para ello, en nuestro código denominado "accion=upload" tendremos que poner algo así:

$userfile=$HTTP_POST_FILES['userfile']['name'];

$db_conexion= mysql_connect("$sql_host", "$sql_usuario", "$sql_pass") or die("No se pudo conectar a la Base de datos") or die(mysql_error());

mysql_select_db("$sql_db") or die(mysql_error());

if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) {
copy($HTTP_POST_FILES['userfile']['tmp_name'],"docs/$userfile" );
$subio = true;
}

if($subio) {
mysql_query("INSERT INTO $sql_archivos values('','$userfile')") or die(mysql_error());
header ("Location: $pag?accion=ok");
} else {
//echo "El archivo no cumple con las reglas establecidas";
header ("Location: $pag?accion=error");
}

die();
mysql_close();

Voy a explicar este fragmento de código para los que aún no vean como funciona.

Primeramente lo que hacemos es asignar a la variable $userfile el archivo cargado del formulario mediante las variables externas $HTTP_POST_FILES. Luego con la función is_uploaded_file() nos devuelve true o false, dependiendo de si el archivo en cuestión ha sido cargado con éxito (fijaoos bien, de momento no hemos subido el archivo, está en una carpeta temporal del server), en caso de ser así, utilizamos la función copy() donde el primer parámetro que le asignamos es el archivo ubicado en la carpeta temporal, y posteriormente le indicamos en qué ruta queremos que se nos copie.

La siguiente condición es para guardar los datos del archivo en una base de datos, en este caso sólo guardo el nombre, y si os fijáis el primer campo de esa consulta esta vacío, eso es debido a que esa tabla tengo el primer campo definido como autonumérico. Por último, redirecciono con la función: header ("Location: $pag?accion=ok"); y cierro la conexión con la base de datos.

 

Perfecto, ya tenemos nuestro pequeño sistema para subir archivos, pero ahora viene cuando queremos que un archivo deje de estar presente en nuestro servidor y además deje de salir en nuestra web como archivo disponible. Para ello haremos uso de la tabla que gestionabamos antes, $sql_archivos.

Deberemos cargar un enlace o botón que haga referencia al archivo en concreto, para ello usaremos su ID que como dije antes era el campo definido como autonumérico. Y el enlace debe ser el siguiente:

<a href="archivos.php?accion=borrar&id=$archivo[ID]">

De esta forma lo que hacemos es pasarle la ID del archivo que queremos borrar ( con la acción a realizar ).

 
if ($_GET['accion']=="borrar"){
$id_borrar= $_GET['id'];
$db_conexion= mysql_connect("$sql_host", "$sql_usuario", "$sql_pass") or die("No se pudo conectar a la Base de datos") or die(mysql_error());
mysql_select_db("$sql_db") or die(mysql_error());
$archivo_consulta = mysql_query("SELECT ID,name FROM $sql_archivos where id=$id_borrar") or die(mysql_error());
$archivo=mysql_fetch_array($archivo_consulta);
$archivo=$archivo['name'];
$ruta="docs/";
$filename="$ruta$archivo";
unlink($filename);
mysql_query("DELETE FROM $sql_archivos WHERE id=$id_borrar") or die(mysql_error());
mysql_close();

header("Location: archivos.php");
exit;

}

Como se puede apreciar, asignamos la ID del archivo en cuestión y mediante una consulta a la base de datos verificamos cual es el nombre de ese archivo. Cuando ya tenemos la ruta completa de la ubicación del archivo, junto al nombre de éste llamamos a la función unlink() que ésta hace borrar al archivo y posteriormente lo borramos de la base de datos.

Nota: Si no lo borrasemos de la base de datos, se seguiría mostrando en nuestra página web y luego al intentar borrarlo de nuevo nos produciría un error. (Normal, estamos intentando borrar un archivo que no existe)

 

Bienvenidos al maravilloso mundo de la programación.

Saludos, [BoLo]