Autor: David
Hace poco tuve que hacer un sistema que me permitiera enviar archivos adjuntos en un correo enviado desde la web. Hay muchas webs donde hay ejemplos para hacer esto, yo encontré este, no sé exactamente donde pero ahí va.
Primero la función de envío.
PHP:
-
function form_mail($sPara, $sAsunto, $sTexto, $sDe)
-
{
-
$bHayFicheros = 0;
-
$sCabeceraTexto = "";
-
$sAdjuntos = "";
-
-
if ($sDe)$sCabeceras = "From:".$sDe."\n";
-
else $sCabeceras = "";
-
$sCabeceras .= "MIME-version: 1.0\n";
-
-
foreach ($_FILES as $vAdjunto)
-
{
-
if ($bHayFicheros == 0)
-
{
-
$bHayFicheros = 1;
-
$sCabeceras .= "Content-type: multipart/mixed;";
-
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";
-
-
$sCabeceraTexto = "----_Separador-de-mensajes_--\n";
-
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
-
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";
-
-
$sTexto = $sCabeceraTexto.$sTexto;
-
}
-
-
if($vAdjunto["size"]> 1048576){
-
return false;
-
}
-
-
if ($vAdjunto["size"]> 0)
-
{
-
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
-
$sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";;
-
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
-
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";
-
-
$oFichero =
fopen($vAdjunto["tmp_name"],
'r');
-
-
-
-
}
-
}
-
-
if ($bHayFicheros)
-
$sTexto .= $sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
-
return(mail($sPara,
$sAsunto,
$sTexto,
$sCabeceras));
-
}
Luego el formulario que recoge los datos
HTML:
-
<form name="formulario" action="enviar.php" method="post" enctype="multipart/form-data">
-
<input type="text" name="nombre"> Nombre
<br />
-
<input type="text" name="email"> E-mail
<br />
-
<input type="text" name="asunto"> Asunto
<br />
-
-
-
-
<input type="file" name="adjunto"> Archivo adjunto
<br />
-
<input type="submit" name="submit" value="Enviar">
-
</form>
Por último el código que procesa el formulario.
PHP:
-
if($_POST['submit']){
-
$namefrom=$_POST['nombre'];
-
$emailfrom='admin@dominio.com';
-
$emailto=$_POST['email'];
-
$subject=$_POST['asunto'];
-
$mensaje = "\nNombre: ".$namefrom."\n\n".$_POST['comentarios'];
-
//llamamos a la funcion de envio
-
form_mail($emailto,$subject, $mensaje, $emailfrom);
-
}
Salu2
Autor: David
Hoy os explicaré un pequeño truco para aquellos que se inician con PHP, se trata de mostrar la información de forma más bonita. Al hacer consultas en la base de datos para mostrar un listado al usuario podemos colorear alternativamente las filas para que no haya un cansancio visual al leer.
Al colorear alternativamente evitamos que el lector se pierda al leer un listado demasiado extenso.
Para ello utilizamos una simple operación matemática que nos proporcione el resto de la división $i%2 (siendo % el resto de la división). La variable $i será un contador de filas, al dividirlo por 2, obtendremos alternativamente el valor 1 y valor 0 como resto de la división.
PHP:
-
echo '<table width="100%" border="0">';
-
-
echo '<td><b>Usuario</b></td>';
-
echo '<td><b>Email</b></td>';
-
echo '<td><b>Fecha Registro</b></td>';
-
-
-
-
$i++;
-
if($i%2==0){$class='style="background-color:#f3f3f3;"';}
-
else{$class='style="background-color:#cccccc;"';}
-
-
echo '<td '.
$class.
'>'.
$row['username'].
'</td>';
-
echo '<td '.
$class.
'>'.
$row['email'].
'</td>';
-
echo '<td '.
$class.
'>'.
$row['fecha_reg'].
'</td>';
-
-
}
-
Salu2
Autor: David
Hoy vamos a ver algo que puede resultar muy útil, he titulado "leer archivo excel", aunque el ejemplo que voy a poner no es exactamente con un archivo excel, sino con un csv creado desde excel. PHP proporciona una función que permite leer este tipo de archivos fgetcsv
PHP:
-
<?php
-
$fp =
fopen ("archivo.csv",
"r");
-
//bucle while que se ejecutará mientras haya filas que leer
-
while (( $data =
fgetcsv ( $fp ,
10000 ,
";" )) !==
FALSE ) {
-
//mostramos los datos de cada fila
-
foreach($data as $row) {
-
echo $row.
' ';
-
}
-
-
}
-
?>
De esta forma podríamos por ejemplo adaptar el script para insertar esos datos en nuestra base de datos, y podriamos crear un sistema que nos permitiera por ejemplo actualizar un catálogo y tienda online mediante un archivo csv que habriamos manipulado desde Excel.
Salu2
Autor: David
Hoy vamos a hablar acerca de la redimensión de imágenes. Hay muchas cosas que decir acerca de esto, de hecho podríamos escribir un libro porque este tema da mucho que hablar por la gran cantidad de opciones y configuraciones que hay que tener en cuenta.
Básicamente tenemos dos opciones a la hora de redimensionar, la más común pero limitada es la librería GD que viene normalmente instalada en todos los servidores junto con PHP, y luego tenemos ImageMagick que últimamente se está empezando a ver en los nuevos servidores que nos porporcionan los ISP.
En el caso de la librería GD, debemos tener en cuenta que consume muchos recursos del servidor, por lo que es bastante lento. Esto provoca que si el archivo de origen es muy grande tengamos problemas de memoria memory_limit y tiempo de ejecución max_execution_time. Podemos modificar los valores del php.ini o mediante el archivo .htaccess, pero aún así no podremos aplicar esta librería para archivos más grandes de 1 ó 2 MB.
Otra limitación es que no podemos utilizar un archivo TIFF como base, aunque la librería soporta bastantes formatos gif, jpeg, png, ... En caso de necesitar redimensionar archivos TIFF o con un gran tamaño deberemos utilizar Imagemagick.
A continuación incluyo un ejemplo para redimensionar una imagen jpeg con la librería GD que ha sido subida mediante un upload de archivos. El script redimensionará la imagen a un ancho máximo de 200 píxeles y la copiará a la carpeta que especifiquemos.
PHP:
-
$anchura_maxima = 200; //ancho máximo en pixeles
-
$nombre_temporal = $_FILES['foto']['tmp_name'];
-
$nombre_archivo = $_FILES['foto']['name'];
-
-
-
//calculo de altura
-
$ratio = ($datos[0] / $anchura_maxima);
-
$altura = ($datos[1] / $ratio);
-
-
$img = @imagecreatefromjpeg($nombre_temporal);
-
$thumb = imagecreatetruecolor($anchura_maxima,$altura);
-
imagecopyresampled($thumb, $img, 0, 0, 0, 0, $anchura_maxima, $altura, $datos[0], $datos[1]);
-
ImageJPEG($thumb, "fotos/".$nombre_archivo,75); //copiamos la imagen JPG con compresión 75
-
imagedestroy($thumb);
-
imagedestroy($img);
Salu2
Autor: David
En esta ocasión vamos a ver lo sencillo que es tener un sistema multilingüe para nuestra web. Sólo debemos incorporar el siguiente código al inicio de todas las páginas.
PHP:
-
//si no existe la variable lang:
-
//comprobamos si existe la cookie
-
//en caso contrario asignamos idioma del navegador
-
$lang=$_GET['lang'];
-
if($lang==false){
-
if($_COOKIE["lang_cookie"]){$idioma=$_COOKIE["lang_cookie"];}
-
else{
-
$navegador=
substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],
0,
2);
-
if($navegador=='en'){$idioma='en';}
-
elseif($navegador=='fr'){$idioma='fr';}
-
else{$idioma='es';}
-
}
-
}
-
else{
-
if($lang=='en'){$idioma='en';}
-
elseif($lang=='fr'){$idioma='fr';}
-
else{$idioma='es';}
-
}
-
//enviamos cookie para mantener la selección del usuario
-
-
-
Este código lo que hará en primer lugar es asignar un idioma a los usuarios nuevos, que será el idioma principal que tenga su navegador. Esto supongo que ya sabréis donde se cambia, pero por si acaso, sólo es necesario ir a Herramientas -> Opciones de Internet -> Idiomas, en nuestro navegador.
Luego podemos poner las típicas banderitas de idiomas con un enlace a cualquier página o $PHP_SELF, incluyendo la variable "lang" con el idioma que proceda. Por ejemplo:
HTML:
-
<a href="index.php?lang=es">Español
</a><br>
-
<a href="index.php?lang=fr">Français
</a><br>
-
<a href="index.php?lang=en">English
</a>
Con la variable $idioma que retorna el script, podemos hacer después un include al archivo de idioma en cuestión, que contrendrá las traducciones de los contenidos:
PHP:
-
include("languages/".$idioma.".php");
Ejemplo de archivo de idioma español, es.php:
PHP:
-
define('HEADER_TITLE',
'Inicio');
-
define('CONTENT',
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua<br><br>');
-
define('FOOTER',
'© 2008 bitacoraweb.com');
-
...
Salu2
Autor: David
El otro día comentaba como hacer un upload de archivos, hoy vamos a ver como podemos descargar esos archivos, forzando la descarga y además como podemos esconder la URL física del archivo.
Primero voy a poner un ejemplo de la primer parte, creamos un archivo download.php:
PHP:
-
<?php
-
//direccion real del archivo
-
$url='archivos/'.$_GET['file'];
-
-
header ("Content-Disposition: attachment; filename=".
$_GET['file'].
"\n\n");
-
header ("Content-Type: application/octet-stream");
-
-
-
-
?>
Con este ejemplo ya estariamos forzando la descarga de un archivo que se encuentra en el directorio "archivos", para descargarlo simplemente lo llamariamos así:
HTML:
-
<a href="download.php?file=mi_archivo.jpg">Descargar
</a>
Este código podemos mejorarlo de forma que no incluyamos el nombre físico (filename) del archivo en la variable, por ejemplo incluyendo un ID de archivo que luego transformaremos en el código o mediante una consulta a una base de datos.
Por ejemplo:
HTML:
-
<a href="download.php?id=12345678">Descargar
</a>
PHP:
-
<?php
-
$nombre=false;
-
//asignamos el nombre según el ID
-
//también podemos hacer una consulta a una base de datos
-
if($_GET['id']=="12345678"){$nombre="mi_archivo.jpg"}
-
-
if($nombre){
-
//direccion real del archivo
-
$url='archivos/'.$nombre;
-
-
header ("Content-Disposition: attachment; filename=".
$nombre.
"\n\n");
-
header ("Content-Type: application/octet-stream");
-
-
-
-
}
-
else{
-
echo 'Error: el archivo no existe';
-
}
-
?>
Autor: David
Quien no está harto de recibir Spam en la bandeja de entrada. Está claro que el Spam es uno de los males de internet, que para un usuario doméstico sólo supone malestar, pero para las grandes empresas supone pérdidas millonarias.
Los Spammers entre otros métodos utilizan los formularios de nuestras páginas web para enviar correos basura a diestro y siniestro, de forma que ellos no utilizan sus servidores para ello si no que usan el de un tercero para su fines.
Esto provoca o puede provocar que nuestro servidor o la red a la que pertenece sea banneada y aparezca en las listas negras (black list) de los principales proveedores de correo o de los programas antispam. Evidentemente si luego queremos enviar un correo nosotros desde nuestro servidor es posible que no llegue a su destinatario por culpa de estos Spammers.
Por tanto es necesario que tomemos conciencia de que debemos proteger nuestros formularios, ya sea con funciones antispam, con validaciones visuales o con lo que sea.
Os dejo una pequeña función que trata de checkear los campos del formulario para que no contengan etiquetas que normalmente utilizan los spammers.
PHP:
-
function antispam($campo){
-
//esto es un array con las posibles cabeceras que debemos checkear
-
$cabeceras =
array("Content-Type:",
-
"MIME-Version:",
-
"Content-Transfer-Encoding:",
-
"Return-path:",
-
"Subject:",
-
"From:",
-
"Envelope-to:",
-
"To:",
-
"bcc:",
-
"cc:");
-
//comprobamos si existe alguna cabecera dentro del campo
-
//si existe enviamos a una página forbidden
-
foreach($cabeceras as $valor){
-
-
header("HTTP/1.0 403 Forbidden");
-
-
}
-
}
-
}
Para ulizarla simplemente la colocamos al principio de la página (o en un include) y antes de utilizar la función mail() debemos hacer el checkeo.
PHP:
-
antispam($_POST['campo_1']);
-
antispam($_POST['campo_2']);
-
antispam($_POST['campo_3']);
-
Si el Spammer a utilizado alguna de las etiquetas que aparecen en el array, el resultado será una página Forbidden, aunque podemos redireccionarlo a cualquier otra página, para mostrarle un mensaje, cambiando la salida del header.
PHP:
-
header("location: error.php");
Salu2
Autor: David
Una de las cosas que más se utilizan cuando hacemos páginas dinámicas son los formularios de subida de archivos. Aquí os voy a explicar las cosas necesarias para hacer un uploader sencillo.
Creamos un archivo llamado upload.php que contendrá el formulario y el código php que se encargará de este proceso.
La parte del formulario puede ser así:
HTML:
-
<form action="upload.php" enctype="multipart/form-data" method="post">
-
-
<input name="submit" type="submit" value="Enviar">
-
</form>
Un fallo muy común es olvidar incorporar el atributo enctype al formulario, que para subida de archivos es obligatorio, ya que el envío del post debe ser codificado, por tanto no hay que olvidarse de colcar enctype="multipart/form-data" en el formulario.
Una vez que tenemos el formulario sólo hay que poner la parte de código PHP que se encargará de copiar el archivo.
PHP:
-
if($HTTP_POST_POST['submit']){
-
//datos del arhivo
-
$nombre_archivo = $HTTP_POST_FILES['archivo']['name'];
-
$tipo_archivo = $HTTP_POST_FILES['archivo']['type'];
-
$tamano_archivo = $HTTP_POST_FILES['archivo']['size'];
-
//extension
-
-
-
$maximo=1000000; //tamaño máximo en bytes
-
//compruebo si las caracteristicas del archivo son las que deseo
-
if ($tamano_archivo<=$maximo) {
-
if (@
move_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name'],
"archivos/".
$nombre_archivo)){
-
echo 'El archivo ha sido copiado correctamente';
-
}
-
else{
-
echo 'Error: el archivo no ha podido ser copiado';
-
}
-
}
-
else{
-
echo 'Error: el archivo supera el tamaño máximo permitido ('.
$maximo.
' bytes)';
-
}
-
}
En este ejemplo hemos llamado a las variables utilizando $HTTP_POST_FILES para que sea compatible con la configuración register_globals OFF del php.ini (Ya hablaré de esto otro día).
Si tienes la versión de PHP 4.2.0 o superior podrás utilizar las superglobales de esta forma $_FILES.
Por último debemos crear una carpeta llamada "archivos" con permisos de escritura. Si tenemos un servidor LINUX pondremos CHMOD 777
A continuación pongo el código completo con superglobales.
Salu2
PHP:
-
<?php
-
if($_POST['submit']){
-
//datos del arhivo
-
$nombre_archivo = $_FILES['archivo']['name'];
-
$tipo_archivo = $_FILES['archivo']['type'];
-
$tamano_archivo = $_FILES['archivo']['size'];
-
//extension
-
-
-
$maximo=1000000; //tamaño máximo en bytes
-
//compruebo si las caracteristicas del archivo son las que deseo
-
if ($tamano_archivo<=$maximo) {
-