martes, 8 de mayo de 2012

Envio de Email

1. Función Mail()
Para enviar emails sencillos en modo texto el uso de la función mail() es sin lugar a dudas lo más cómodo. Su uso es el siguiente:
mail('direccion@del.destinario.com','Asunto','Mensaje');
Devuelve TRUE en caso de éxito y FALSE en caso contrario. También podemos pasarle cabeceras adicionales como cuarto parámetro, esto puede ser útil, por ejemplo, para enviar mensajes HTML usando mail() pero a la mínima q necesites enviar emails un poco más complejos es recomendable usar las PEAR.

2. Función error_log()
Para todos aquellos emails de debug o alertas internas de nuestro software podemos usarerror_log(). Con esta función podemos hacer log a distintos destinos: el log del sistema, un archivo, la conexión de debug y también enviar por email. Por ejemplo para enviarnos por email información acerca de una exception q nos salta en nuestro código:
try {
  // código con posibles errores
} catch (Exception $e) {
  $msg = 'ERROR #'.$e->getCode()."\n";
  $msg .= $e->getMessage()."\n";
  $msg .= print_r($e->getTrace(),true);
  @error_log($msg1'direccion@del.destinario.com');
}.



3. Clase PEAR Mail_mime
Como comentaba esta es una de las clases existentes para el envío de emails con soporte de extensiones MIME, lo que permite enviar HTML con imágenes, vídeo, archivos adjuntos, etc. Este es un ejemplo sencillo de como enviar un email HTML con su versión texto y con un archivo adjunto:
require_once 'Mail.php';
require_once 'Mail/mime.php';
$destinario = 'direccion@del.destinario.com';
$from = 'direccion@del.from.com';
$asunto = 'Asunto del mensaje';
$mensaje = '<html><head><title>'.$asunto.'</title></head>'."\n";
$mensaje .= '<body><p><h1>Hola</h1></body></html>';
$mime = new Mail_mime("\n");
$mime->setTXTBody(strip_tags($mensaje));
$mime->setHTMLBody($mensaje);
$mime->addAttachment('fichero_adjunto.zip''application/zip');
$body = $mime->get();
$hdrs = array('From' => $from'Subject' => $asunto);
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
$res = $mail->send($destinario$hdrs$body);
if (PEAR::isError($res)) echo 'error enviando el email';
Todos los métodos anteriormente descritos necesitan de un servidor de correo funcionando y las directivas de configuración del PHP correctamente fijadas. Si tienes un ISP un poco decente casi seguro q no tendrás ningún problema.

Funciones Definidas por Usuarios

1. Sintaxis de Funciones Simples


Una funcion no es mas que un bloque de codigo al que le pasamos una serie de parametros y nos devuelve un valor. PHP tiene implementado una gran cantidad de funciones para nuestro uso, pero las funciones mas importantes son las que nosotros creamos.

Para definir una funcion se debe de utilizar la siguiente sintaxis:
function nombre_funcion($parm_1,$parm_2,...,$parm_n){
//Cuerpo de la funcion
}

Cualquier instruccion valida de PHP puede aparecer en el cuerpo de la funcion.


2. Funciones con argumentos por valor y referencia
Parámetros por Valor
Este tipo de parámetro se utiliza para suministrar a las funciones una serie  de valores al momento de invocarlas, estos valores se denominan "parámetros actuales" y los parámetros (variables) que reciben estos valores se denominan "parámetros formales", este es el comportamiento por defecto de los parámetros definidos en una función

Parámetros por Referencia
Por defecto, los parámetros de una función se pasan por valor, de manera que si cambiamos el valor del parámetro formal dentro de una función, el parámetro actual no se afectado, esto quiere que lo que se transfiere del parámetro actual al parámetro formal es una copia del dato.
Si requerimos que una función pueda modificar los parámetros actuales, estos deben ser pasados por referencia, lo que quiere decir que lo que se transfiere es la dirección de memoria del parámetro actual.
Para que un parámetro sea pasado por referencia debemos anteponer un ampersand(&) al nombre del parámetro formal en la definición de la función.

3. Incluir archivos en PHP (require, include)


El objetivo de estas dos funciones es incluir el contenido de un archivo en el punto donde se invoca.
En su funcionamiento son identicas en todos los aspectos excepto en el modo de actuar ante un error;
include() produce un mensaje de advertencia, mientras que require() porduce un Error Fatal

Tablas o Arrays

1. Uso de Arrays

Un array en PHP es realmente un mapa ordenado. Un mapa es un tipo de datos que asocia valores con claves. Este tipo es optimizado para varios usos diferentes; puede ser usado como una matriz real, una lista (vector), una tabla asociativa (una implementación de un mapa), diccionario, colección, pila, cola, y posiblemente más. Ya que los valores de un array pueden ser otros arrays, árboles y también son posibles arrays multidimensionales.

Una explicación sobre tales estructuras de datos está fuera del alcance de este manual, pero encontrará al menos un ejemplo de cada uno de ellos. Para más información, consulte la extensa literatura que existe sobre este amplio tema.

Especificación con array()

Un array puede ser creado usando el constructor del lenguaje array(). Éste toma un cierto número de parejas clave => valor como argumentos.

array(
    clave  => valor,
    clave2 => valor2,
    clave3 => valor3,
    ...
)
Ejemplo:

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// a partir de PHP 5.4
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>



2. Tipos de Declaraciones





3. Tipos de Arrays

En una variable tenemos la posibilidad de almacerar una estructura de datos compleja; para ello podemos asignarle, en vez de un dato simple, otro más complejo conocido como array.
Estos arrays son datos capaces de albergar otros datos, y poder acceder a ellos a través de un índice.
En primer lugar tenemos los arrays más simples, los que solo pueden albergar datos simples y con un índice numérico (índice por defecto en PHP).
En segundo lugar tenemos los arrays asociativos, cuyo índice ya no es numérico, sinó que tendrá los valores que nosotros le demos.
Por último tenemos los arrays más complejos, que se hacen llamar arrays multidimensionales. Éstos, a su vez, pueden ser asociativos o no serlo.
Estos últimos son los que nos dan la posibilidad realmente de almacerar una estructura compleja de datos en una sola variable.



4. Funciones útiles para el manejo de Arrays
Entre las diferentes funciones para trabajar con un array tenemos:

array_change_key_case — Devuelve una matriz con todas las claves de las cadenas convertidas a mayúsculas o minúsculas
array_chunk — Divide una matriz en segmentos
array_combine — Crea una nueva matriz, usando una matriz para las claves y otra para sus valores
array_count_values — Cuenta todos los valores de una matriz
array_diff_assoc — Comprueba las diferencias entre matrices teniendo en cuenta los índices
array_diff_key — Calcula la diferencia de matrices usando las llaves para la comparación
array_diff_uassoc — Computa la diferencia entre matrices con un chequeo adicional de índices, el cual es realizado por una llamada de retorno entregada por el usuario
array_diff_ukey — Calcula la diferencia de matrices usando callback function on the keys for comparison
array_diff — Comprueba las diferencias entre matrices
array_fill_keys — Fill an array with values, specifying keys
array_fill — Llena una matriz con valores
array_filter — Filtra elementos de una matriz mediante una función “callback”
array_flip — Intercambia los valores de una matriz con sus índices
array_intersect_assoc — Calcula la intersección de matrices verificando que también coincidan los índices
array_intersect_key — Calcula la intersección de matrices usando las llaves para la comparación
array_intersect_uassoc — Calcula la intersección de matrices con chequeo de índices adicional por una función de usuario
array_intersect_ukey — Calcula la intersecció de matrices usando una función de usuario para la comparación de los índices
array_intersect — Calcula la intersección de matrices
array_key_exists — Comprueba si el índice o clave dada existe en la matriz
array_keys — Devuelve todas las claves de una matriz
array_map — Aplica la llamada de retorno especificada a los elementos de las matrices dadas
array_merge_recursive — Une dos o más matrices recursivamente
array_merge — Combina dos o más matrices
array_multisort — Ordena múltiples matrices, o matrices multi-dimensionales
array_pad — Rellena una matriz con un valor hasta el tamaño especificado
array_pop — Extrae el último elemento de la matriz
array_product — Calcula el producto de valores en una matriz
array_push — Inserta uno o más elementos al final de la matriz
array_rand — Selecciona una o más entradas aleatorias de una matriz
array_reduce — Reduce iterativamente una matriz a un solo valor usando una función llamada de retorno
array_reverse — Devuelve una matriz con los elementos en orden inverso
array_search — Busca un valor determinado en una matriz y devuelve la clave correspondiente en caso de éxito
array_shift — Extrae un elemento del comienzo de la matriz
array_slice — Extrae una porción de la matriz
array_splice — Suprime una porción de la matriz y la sustituye por otra cosa
array_sum — Calcula la suma de los valores en una matriz
array_udiff_assoc — Computa la diferencia entre matrices con un chequeo de índices adicional, comparando los datos con una llamada de retorno
array_udiff_uassoc — Computa la diferencia entre matrices con un chequeo de índices adicional, comparando los datos y los índices con una llamada de retorno
array_udiff — Computa la diferencia entre matrices, usando una llamada de retorno para la comparación de datos
array_uintersect_assoc — Calcula la intersección de matrices con chequeo adicional de ídices, comparando los datos por una función del usuario
array_uintersect_uassoc — Calcula la intersección de matrices con chequeo adicional de índices, compara los datos y los índices por una función del usuario
array_uintersect — Calcula la interseccón de matrices, compara los datos con una función del usuario
array_unique — Remueve valores duplicados de una matriz
array_unshift — Introduce uno o más elementos al principio de la matriz
array_values — Devuelve todos los valores de una matriz
array_walk_recursive — Aplicar una función de usuario recursivamente a cada miembro de una matriz
array_walk — Aplica una función del usuario a cada elemento de una matriz.
array — Crear una matriz
arsort — Ordena una matriz en orden inverso y mantiene la asociación de índices
asort — Ordena una matriz y mantiene la asociación de índices
compact — Crea una matriz que contiene variables y sus valores
count — Cuenta los elementos de una matriz o propiedades de un objeto
current — Devuelve el elemento actual de una matriz
each — Devuelve el siguiente par clave/valor de una matriz y avanza el apuntador
end — Mueve el puntero interno de una tabla al último elemento
extract — Importa variables a la tabla de símbolos desde una matriz
in_array — Revisa si un valor existe en una matriz
key — Obtiene una clave de una matriz asociativa
krsort — Ordena una matriz por clave en orden inverso
ksort — Ordena una matriz por clave
list — Asigna variables como si fueran una matriz
natcasesort — Ordena una matriz usando un algoritmo de “orden natural” sin distinguir mayúsculas de minúsculas
natsort — Ordena una matriz usando un algoritmo de “orden natural”
next — Avanza el puntero interno de una matriz
pos — Alias de current
prev — Rebobina el puntero interno de una matriz
range — Crea una matriz que contiene un rango de elementos
reset — Fija el puntero interno de una matriz a su primer elemento
rsort — Ordena una matriz en orden inverso
shuffle — Mezcla una matriz
sizeof — Alias of count
sort — Ordena una matriz
uasort — Ordena una matriz mediante una función de comparación definida por el usuario y mantiene la asociación de índices
uksort — Ordena una matriz por claves mediante una función definida por el usuario
usort — Ordena una matriz por sus valores usando una función de comparación definida por el usuario



Sesiones Predefinidas en PHP

1. Funciones de Cadena
Contar caracteres de una cadena
Estas funciones, y las que veremos en los siguientes apartados, no alteran los argumentos que les pasamos, por lo que para obtener el resultado debemos guardarlas siempre en otra variable.
$resultado=nombreFuncion($argumentos);

strlen($texto);
Da como resultado el número de caracteres que tiene la cadena pasada en el argumento $texto.

chr(num);
En esta función pasamos como parámetro un número entre 0 y 255, y el resultado es caracter asignado a ese número en el código ASCII


ord("caracter");
Es la función contraria a la anterior. pasamos como parámetro un caracter o signo, y la función nos devolverá el número en ASCII de ese carácter. Si pasamos como argumento más de un caracter o una cadena de texto, la función nos devolverá únicamente el código ASCII del primer carácter.

count_chars($texto,modo);
Esta función indica cuales son los caracteres en código ASCII que aparecen en el texto y/o cuantas veces aparece cada uno de ellos.

2. Funciones de Fecha y Hora
Con la función date() podemos obtener la fecha en el formato deseado como por ejemplo:

<?php
echo date("d-m-Y H:i:s");
?>
Con lo que obtendremos la fecha y la hora, en el que "d" es el dia, "m" es el mes, "Y" es el año, "H" es la hora, "i" es el minuto y "s" son los segundos

La función date también puede formatear fechas que no sean la actual, ya que acepta como segundo parámetro una fecha en formato timestamp que la podremos formatear tal como hemos visto. Por ejemplo, si quisiéramos obtener la fecha de ayer:
<?php
echo date("d-m-Y",time()-86400);
?>
La función time() devuelve la fecha actual en formato timestamp (segundos desde el 1-1-1970), así que para obtener la fecha de ayer restamos 86400 segundos (60*60*24).



3. Funciones Numéricas
La sintaxis es muy simple: number_format ( parametros ). Dependiendo de lo que queremos hacer tenemos 1, 2 o 4 parametros para utilizar.

Ejemplos:
number_format(123456); // Devuelve 123,456
number_format(123456,2); // Devuelve 123456.00
number_format(123456,2,",","."); // Devuelve 123.456,00
number_format(123456,0,",","."); // Devuelve 123.456
La función no soporta 3 parámetros por lo que para indicar un cambio de  indicadores de decimales y miles para setearlo con . (punto) para miles y , (coma) para decimales, debemos tambien indicar la cantidad de decimales, aunque en este paso pondremos 0 (cero) como en el último ejemplo.


4. Funciones de Contenidos de Variables (empty,isset)
En php la funcion isset() nos permite determinar si una variable concreta tiene ya un valor asignado o no. Esto es especialmente util en procesos de depuracion de scripts. Durante la correccion de los mismos se puede comprobar si si hay contenido en una variable para rastear posibles errores. La funcion isset() recibe como argumento el nombre de una variable para rastear posibles errores. La funcion isset() recibe como argumento el nombre de una variable y devuelve un valor de tipo booleano, es decir true(verdadero) o false(falso)

La funcion empty() tiene un efecto similar a isset(), pero con el resultado opuesto, es decir devuelve un valor booleano si la variable no ha recibido todavia ningun valor. En caso contrario devuelve un resultado false

5. Función rand
rand — Genera un número entero aleatorio

Descripción:
int rand ( void )
int rand ( int $min , int $max )
Si se emplea sin los argumentos min y max, rand() devuelve un entero pseudo-aleatorio entre 0 y getrandmax(). Para obtener un número aleatorio, por ejemplo, entre 5 y 15 (incluidos), use rand(5,15).

Uso de Sesiones PHP

1. Declaración de Sesiones
Cuando queremos utilizar variables de sesión en una página tenemos que iniciar la sesión con la siguiente función:
session_start ()
Inicia una sesión para el usuario o continúa la sesión que pudiera tener abierta en otras páginas. Al hacer session_start() PHP internamente recibe el identificador de sesión almacenado en la cookie o el que se envíe a través de la URL. Si no existe tal identificador se sesión, simplemente lo crea.

Una vez inicializada la sesión con session_start() podemos a partir de ahora utilizar variables de sesión, es decir, almacenar datos para ese usuario, que se conserven durante toda su visita o recuperar datos almacenados en páginas que haya podido visitar.

La sesión se tiene que inicializar antes de escribir cualquier texto en la página. Esto es importante y de no hacerlo así corremos el riesgo de recibir un error, porque al iniciar la sesión se deben leer las cookies del usuario, algo que no se puede hacer si ya se han enviado las cabeceras del HTTP.

2. Funciones para el manejo de Sesiones
El apoyo que PHP proporciona para las sesiones consiste en una forma de conservar ciertos datos a lo largo de los subsiguientes accesos, lo cual le permite construir aplicaciones mas personalizadas e incrementar el atractivo de su sitio web.
El soporte de las sesiones le permite registrar un numero arbitrario de variables que se conservaran en las siguientes peticiones. Cuando un visitante acceda a su web, PHP comprobara automaticamente (si session.auto_start esta puesto a 1) o cuando usted lo especifique (de forma explicita mendiante session_start() o impli­cita a traves de session_register()) si se le ha enviado un "session id" especi­fico con su peticion, en cuyo caso se recrean las variables que se habran guardado anteriormente.

Sentencias de Control II

1. Estructuras Repetitivas
*While
while (condición)
{
[Instrucciones];
}

Esta estructura está en casi todos los lenguajes. El bloque se repite mientras la condición del while sea verdadera.
La condición del while se verifica antes de ingresar al bloque a repetir. Si la misma se verifica falsa la primera vez no se ejecutará el bloque.
Veamos un ejemplo: Generar un valor aleatorio entre 1 y 100, luego imprimir en la página desde 1 hasta el valor generado (de uno en uno):
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$valor=rand(1,100);
$inicio=1;
while($inicio<=$valor)
{
  echo $inicio;
  echo "<br>";
  $inicio++;
}
?>
</body>
</html>


*Do...While
 la condición se verifica luego de ejecutarse el bloque repetitivo.
do
{
[Instrucciones];
} while (condición);


*For
for([Inicialización de la variable];[Condición];[Incremento o decremento de la variable])
{
[Instrucciones];
}

El primer ejemplo que haremos es mostrar en la página los números del 1 al 100:
html>
<head>
<title>Problema</title>
</head>
<body>
<?php
for($f=1;$f<=100;$f++)
{
  echo $f;
  echo "<br>";
}
?>
</body>
</html>


*Foreach
Proporcina un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:

foreach (expresión_array as $valor)
    sentencias
foreach (expresión_array as $clave => $valor)
    sentencias

Sentencias de Control I

1. Estructuras Condicionales
*If.....Else : 
Estas instrucciones son las mas usadas de todos los lenguajes de programación, ya que son las mas básicas. IF (Español: SI) ELSE (Español: SI NO).
Estructura:
 if(expresión)
 {
   ... Sentencias;
 }
 else
 {
   ... Sentencias;
 }

*If.....Else If ....Else: 
La estructura de estas instrucciones viene a ser muy similar que la anterior, y de hecho el ejemplo anterior es válido igualmente para este.
Estructura:
 <?php
 if(expresión)
 {
   ... Sentencias;
 }
 elseif(expresión)
 {
   ... Sentencias;
 }
 else
 {
   ... Sentencias;
 }
 ?>

*Switch: 
Para estos casos la mayoría de los lenguajes de programación incluyen una instrucción que permite "seleccionar" entre los posibles valores de una variable: la instrucción Switch (Español: SELECCIONAR).
Estructura:
 switch($variable)
 {
    case Valor1:
     ... Sentencias;
     break;

    case Valor2:
     ... Sentencias;
     break;

    case Valor3:
     ... Sentencias;
     break;

    .
    .
    .

    default:
     ... Sentencias;
 }