sábado, 30 de agosto de 2014

[Parte 6] PHP

Buenas tengo ya bastante tiempo sin escribir en el blog y es por que me he quedado sin pc, estare escribiendo desde un ciber pero intentare actualizar este par de entradas, iva comenzar con como hacer una paginacion pero eso es algo que ya vimos en el blog, por lo cual solo les dejare un enlace y veremos otras cosas :)

Enlace para crear una paginacion:

http://arthusu.blogspot.mx/2013/09/sistema-de-paginacion-en-php-y-mysql.html


Enviar un correo

Con php podemos enviar correos a otras personas con solo usar la funcion mail(). Su sintaxis es la siguiente:

mail(para,asunto,cuerpo,[cabeceras])

expliquemos cada una de estas opciones:

para: es para quien va dirigido ahi va el correo a quien va dirigido. Por ejemplo: falso@hotmail.com y si quisieramos agregar mas de una simplemente tendriamos que agregar una coma y otro correo, de la siguiente manera: falso@hotmail.com,falso2@hotmail.com

asunto: es el asunto del mensaje que estas escribiendo, esto se refiere al titulo que va a ver la persona en el mensaje que le estas enviando, de esta manera muchas veces eligen si lo abren o no.

cuerpo: es el mensaje dirigido a la persona. Usando \n podemos hacer un salto de linea.

cabeceras: este esta encerrado entre corchetes por que es opcional con lo cual no es necesario escribirlo pero nos da unas cuantas opciones al usarlo.

Nota importante: para poder usar esta funcion mail() debe tener un servidor de correos corriendo. Si no cuenta con uno puede usar un servdor gratuito como lo es 000webhost. Un ejemplo:



En este caso el script php es algo simple, se podrian agregar mas cosas pero entre mas simple sea mas entendible es :P.

Con este script php que acabamos de hacer facilmente podriamos implementarlo en una parte de la pagina para que alguien te contacte en caso de que asi lo quieras agregando un antispam... como podria ser un captcha por ejemplo.



Subir archivos


El proceso de subir archivos tiene dos dimensiones. Primero el codigo HTML es mostrado y despues el codigo apropiado para subir archivos. El archivo subido mediante el formulario es subido a un directorio temporal del cual despues es movido a la carpeta final. Para que este proceso trabaje correctamente es necesario tener algunas configuraciones:

- PHP debe tener las configuraciones correctas
- El directorio temporal debe existir con los permisos adecuados (775 o 777)
- Donde se almacenara el archivo final debe existir con los permisos adecuados

Configuraciones de subidas de archivos:




Para usuarios de Mac Os X y Unix existe ya una carpeta temporal llamada /tmp. Y en windows la configuracion por defecto tiene el valor vacio,si estas usando XAMPP no es necesario modificar estos valores.

Como las carpetas que subes a internet son publicas lo que se puede hacer en esos casos es poner un archivo de configuracion .htaccess para que el publico no pueda acceder a esa carpeta y ver todo lo que esta dentro. O tambien puedes poner la carpeta al mismo nivel de el directorio publico.

Con phpinfo() usted puede ver la configuracion de php con lo cual puede ver como se encuentra configurado para la subida de archivos.



Si estas utilizando linux que es lo que la mayoria de los servidores tienen puedes usar el comando chmod para cambiar los permisos a tus carpetas o archivos y darle los permisos 775 o 777

Si subes un archivo pesado este puede tardar mucho tiempo en subirse, por lo cual puedes especificar en la directiva max_input_time el tiempo que quieres que dure un archivo o simplemente utilizar la funcion set_time_limit(). Entre los parentesis debe ir los segundos en tiempo.


Para subir un archivo es necesario de 2 partes: HTML y PHP.



El enctype al principio del formulario indica que va ser capaz de manejar muchos tipos de datos incluyendo los archivos. Tambien debes notar que el método debe ser POST.

El campo de entrada oculto (hidden) MAX_FILE_SIZE indica el maximo de largo del archivo (en bytes), es una restriccion facil que puede ser usada.

El archivo puede ser accedido usando el array superglobal $_FILES. Incluso si el archivo es recibido por el script PHP puede ser transferido de un directorio temporal a uno permanente usando la funcion move_uploaded_file().


move_uploaded_file(archivo_temporal,/ruta/a/mover/archivo);

Valores del array superglobal $_FILES:



Índice
Significado
Name
El nombre original del archivo
Type
El tipo MIME del archivo es dado por el navegador
Size
El tamaño subido del archivo es dado en bytes
Tmp_name
El nombre temporal del archivo almacenado en el servidor
Error
Codigo de error asociado con el problema

Veamos como crear un script en el cual se suba un archivo a la carpeta upload/ y verifique que el tipo de archivo sea una imagen PNG o JPG...


<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Sube una imagen</title>
 <style type="text/css">
  .error{
   font-weight: bold;
   color: #c00;
  }
 </style>
</head>
<body>
<form enctype="multipart/form-data" action="" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="3000000" />
 Archivo <input type="file" name="upload" />
 <input type="submit" name="enviar" />
</form>
<?php
 if($_SERVER['REQUEST_METHOD'] == 'POST'){
  if(isset($_FILES['upload'])){
   $permitidos = array('image/pjpeg','image/jpeg','image/JPG','image/X-PNG','image/PNG','image/png','image/x-png');
   if(in_array($_FILES['upload']['type'], $permitidos)){
    if(move_uploaded_file($_FILES['upload']['tmp_name'], "../uploads/{$_FILES['upload']['name']}")){
     echo '<p><em>El archivo ha sido subido!</em></p>';
    }
   }else{
    echo '<p class="error">Por favor suba una imagen en formato JPEG o PNG.</p>';
    print_r($_FILES['upload']);
   }
  }
 }
?>
</body>
</html>

Con esto lo que hace $_SERVER['REQUEST_METHOD'] == 'post' si es el metodo enviado esta por POST que siga con el script, si existe el array UPLOAD entonces seguimos con el script... Aqui viene una de las partes mas importantes que es los archivos que se permiten y se verifica por su mime type, creamos un array llamado $permitidos con el tipo de archivos que se permiten... luego si se encuentra el archivo que vamos a subir entre el array entonces intentamos mover el archivo si se pudo mover el mensaje de que el archivo se ha subido se mostrara, sino lo mas posible es que muestre un mensaje de error por los permisos. Si no tenemos el archivo dentro de nuestro array nos podria mostrar un mensaje de error que suba el tipo de archivo que se requiere. 


Nota: Este tipo de Upload no es seguro ya que todas las cabeceras pueden ser modificadas...

Tambien podriamos agregar al script el tipo de error que es por lo cual el archivo no se pudo subir, uno del mas comun podria ser la restriccion HTML del maximo de peso permitido.
Otra cosa que ocurre comunmente es que si el archivo existe se desea eliminar... aunque si estuvieramos creando un servidor de imagenes lo ideal seria poner un nombre unico randomizado de manera que si alguna persona sube su archivo se encuentre tal y como debe ser.


<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Sube una imagen</title>
 <style type="text/css">
  .error{
   font-weight: bold;
   color: #c00;
  }
 </style>
</head>
<body>
<form enctype="multipart/form-data" action="" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="3000000" />
 Archivo <input type="file" name="upload" />
 <input type="submit" name="enviar" />
</form>
<?php
 if($_SERVER['REQUEST_METHOD'] == 'POST'){
  if(isset($_FILES['upload'])){
   $permitidos = array('image/pjpeg','image/jpeg','image/JPG','image/X-PNG','image/PNG','image/png','image/x-png');
   if(in_array($_FILES['upload']['type'], $permitidos)){
    if(move_uploaded_file($_FILES['upload']['tmp_name'], "../uploads/{$_FILES['upload']['name']}")){
     echo '<p><em>El archivo ha sido subido!</em></p>';
    }
   }else{
    echo '<p class="error">Por favor suba una imagen en formato JPEG o PNG.</p>';
   }
  }
  if($_FILES['upload']['error'] > 0){
   echo '<p class="error">El archivo no se pudo subir por que: <strong>';
   switch ($_FILES['upload']['error']) {
    case 1:
     print 'El archivo excedio el maximo de la directiva upload_max_filesize en php.ini';
     break;
    case 2:
     print 'El archivo excedio el maximo de peso en MAX_FILE_SIZE del formulario HTML';
     break;
    case 3:
     print 'El archivo fue subido solo parcialmente';
     break;
    case 4:
     print 'Ningun archivo fue subido';
     break;
    case 6:
     print 'La carpeta temporal no esta disponible';
     break;
    case 7:
     print 'No se pudo escribir el archivo en el disco';
     break;
    case 8:
     print 'La subida del archivo fue detenida';
     break;
    default:
     print 'Ha ocurrido un error en el sistema';
     break;
   }
   print '</strong></p>';

   //Elimina el archivo si existe:
   if(file_exists($_FILES['upload']['tmp_name']) && is_file($_FILES['upload']['tmp_name'])){
    unlink($_FILES['upload']['tmp_name']);
   }
  }
 }
?>
</body>
</html>


Explicando un poco lo nuevo que se le agrego al script, es un switch el cual evalua que el codigo del error si es diferente a 0 (El archivo se subio con exito) muestra un mensaje para cada tipo de error. Y la otra parte del codigo lo unico que hacemos es ver si el archivo temporal ya existe de manera que lo elimine para asi poder subir el nuevo.

Nota: Tambien se puede verificar si el archivo se subio, usando la funcion is_uploaded_file().


Usar PHP y Javascript Juntos

Podemos usar PHP con Javascript, la diferencia entre los dos es que Javascript es del lado del cliente y PHP del lado del servidor, tenemos muchas ventajas en cuanto a los dos, ya que con javascript podemos manejar mucho el navegador, ya sea el tamaño de una ventana, obtener algun objeto, etc. Y con PHP podemos manejar muchas funciones entre ellas interactuar con la base de datos, y en conjunto los dos puede ser una buena combinacion.

En este caso vamos a crear un script con el cual mostraremos una lista de todos los archivos subidos utilizando javascript y PHP juntos.


Creando un archivo Javascript

Como cuando iniciamos un codigo PHP tenemos etiquetas de apertura para ello, o un HTML, al igual tenemos con Javascript. Para saber que ahi esta su codigo. Podemos crear codigo javascript dentro del mismo archivo o externamente:

Dentro del mismo archivo:



<script type="text/javascript">
 //El codigo va aqui dentro
</script>


En un archivo externo:


<script type="text/javascript" src="archivo.js"></script>

En el caso del archivo externo tendriamos que crear archivo.js y dentro del el codigo javascript.




Una caracteristica que diferencia Javascript de php es que sus variables no van declaradas con el signo dolar. Javascript tambien es orientado a objetos y podemos acceder a ellos usando el punto (.), seria algo como: algo.algo o algo.algo.algo().


Vamos a crear nuestro javascript, para crear una ventana emergente de nuestra imagen cuando le demos click a los enlaces de el listado de archivos:


function.js


function crear_ventana(imagen,ancho,alto){
 ancho = ancho + 10;
 alto = alto + 10;

 if (window.popup && !window.popup.closed) {
  window.popup.resizeTo(ancho,alto);
 }

 var specs = "location=no, scrollbars=no, menubars=no, toolbars=no, resizable=yes, left=0, top=0, width="+ ancho +", height="+alto;

 var url = "mostrar_imagen.php?imagen="+imagen;

 popup = window.open(url,"ImageWindow",specs);
 popup.focus();
}


1.- Creamos la funcion crear_ventana(imagen,ancho,alto) con sus parametros

2.- despues agrega las variables ancho y alto y le da 10 pixeles mas (para que la imagen sea mas grande cuando se abra), como habiamos comentado anteriormente en javascript las variables no llevan el signo dolar.

3.- luego verificamos si la ventana ya existe y si no esta cerrada, lo que hacemos es motrar en esa misma ventana la nueva imagen. Como puedes darte cuenta tambien estamos utilizando POO (programacion orientada a objetos) en javascript, ya que utilizamos varias funciones como lo es resizeTo()

4.- La variable specs especificamos los parametros para la ventana que vamos abrir al momento de darle clic al enlace, de las mas importantes que nos deje que se modifique el tamaño de la ventana, que la url no se pueda modificar, que no se muestren las barras de scroll ni el menu de herramientas, que se acomode en la esquina izquierda y que tenga un tamaño con las variables que habiamos declarado anteriormente.

5.- la variable url, sera a la url a la que entrará modificando siempre la imagen segun la indique en el archivo php (este se mostrara mas adelante).

6.- Por ultimo creamos la funcion con la cual nuestra imagen sera abierta en la ventana nueva, en la cual especificamos la url, el titulo de la ventana, y los parametros dados anteriormente en una variable, al final le damos el foco para que se quede en la ventana que abriremos.

Creando el archivo PHP

Bueno como todos sabemos en PHP se puede embeber codigo javascript al igual que HTML, crearemos nuestro archivo PHP recorriendo todas las imagenes que se han subido al servidor para de esta manera crear nuestra lista y pasar los parametros correctos por la funcion crear_ventana(imagen,ancho,alto).

Imagenes.php





<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Imagenes</title>
 <script type="text/javascript" src="funcion.js"></script>
</head>
<body>
 <p>Da click en la imagen para verla en una ventana separada.</p>
 <ul>
  <?php
   $dir = '../uploads';
   $files = scandir($dir);

   foreach($files as $image){
    if(substr($image,0,1) != '.'){
     $image_size = getimagesize("$dir/$image");
     $image_name = urlencode($image);

     echo "<li>
      <a href=\"javascript:crear_ventana('$image_name',$image_size[0],$image_size[1])\">$image</a>
           </li>\n";
    }
   } 
  ?>
 </ul>
</body>
</html>

Vamos a explicar todo esto para que se entienda.

1.- Incluimos el archivo function.js el cual es el codigo anterior de javascript el que crea la ventana emergente.

2.- Creamos una lista desordenada, y luego especificamos la variable $dir la cual contiene el nombre de nuestro directorio de imagenes (el que usamos en el upload), con la funcion scandir($dir) escaneamos el directorio el cual especificamos el cual se convierte en una array $files con el nombre de todos nuestros archivos.

3.- En esta parte utilizamos un foreach para recorrer cada elemento del array convirtiendolo en una variable, de manera que para cada $files archivo hay una $image imagen, despues verificamos que si el nombre de la imagen en el recorrido no empieza con un . (punto) que siga con el script, esto es por que no seria una imagen, ademas de que .. (dos puntos) es un directorio atras.

4.- Con la funcion getimagesize() obtenemos mucha informacion sobre la imagen:



Los cuales tienen el siguiente significado:

0 => tamaño en ancho px
1 => tamaño en alto px
2 => tipo de imagen 2 (en este caso jpeg)
3 => atributos de ancho y alto para la etiqueta img
mime => el tipo de imagen

Despues de eso al nombre de la imagen le pasamos la funcion urlencode() esto es por si contiene un caracter extraño en cual no es permitido en la url, pues con esta funcion lo codificamos de manera que se pueda interpretar en la url.
 
5.- Por ultimo creamos una lista de enlaces el cual utiliza la funcion de javascript que creamos anteriormente pasandole algunos parametros como son el nombre de la imagen, el ancho y alto que tomamos del PHP con la funcion getimagesize().

Ahora mismo si probamos el script se muestra nuestra lista, pero al darle clic no se muestra la imagen ya que el archivo mostrar_imagen.php todavia no lo hemos creado.


Comprendiendo las cabeceras

Como vimos anteriormente habiamos guardado las imagenes fuera del directorio root de manera que los usuarios que visiten nuestra pagina no podran acceder de manera publica a las rutas de la imagen, lo cual es mas seguro.

Lo que vamos a crear en si seria un tipo de "proxy de imagenes" en PHP, a lo cual nosotros pasaremos el nombre de la imagen y no las mostrara, le llamo "proxy" por que las imagenes pasan atraves de ese script, pero en realidad el usuario visitante no sabe donde estan, lo cual es bueno :D.



HTTP (Hypertext Transfer Protocol) como ya hemos explicado ya varias veces en este blog es un protocolo que sirve para comunicarse el cliente con el servidor. El navegador recibe algunos headers HTTP (cabeceras) que pasan de manera oculta (en segundo plano). 

PHP creo una funcion llamada header() para tomar ventaja de este protocolo. El ejemplo mas basico y comun para lo que se utiliza esta funcion es para redirigir de una pagina a otra. En este caso la utilizaremos para enviar un archivo al navegador.

Esta funcion es realmente facil de usar, su sintaxis es:

header(cabecera string)

La lista de posibles cabeceras son muchas, pero las mas usadas son las que utilizan para redirigir, enviar archivos al navegador, crear cookies, controlar el cache y mucho mas. Vamos a crear un ejemplo simple:


header('Location: https://www.google.com');

Con eso nosotros redirigimos a la pagina de google.

En el siguiente ejemplo enviaremos una imagen al navegador, para ello seran usadas tres cabeceras:

1.- Content-Type esta cabecera indica el tipo de datos que sera enviado, muchos valores coinciden con el mime type. Un ejemplo podria ser el de un archivo PDF: 

header("Content-Type: application/pdf\n");

2.- Content-Disposition con esto le decimos al navegador que lo siguiente sea tratado como datos.

header("Content-Disposition: attachment; filename="\algunarchivo.pdf\"\n"); 

Con el valor attachment muestra una ventana de descarga.

3.- Content-Length  este valor contiene la cantidad o tamaño de datos que se estan enviando.

header("Content-Length: 4096\n");

Vemos hay algunas cosas importantes al utilizar las cabeceras, una de ellas es que usamos \n para dividir una nueva linea con lo cual creamos una cabecera y debemos terminar con una nueva linea para ir con la cabecera. Otra cosa importante es que la funcion header() debe ser llamada antes que cualquier cosa ya sea HTML o un espacio en blanco, ya que sino mostrara un error:



Vamos a crear el script para mostrar las imagenes y explicarlo.

mostrar_imagen.php


<?php
 $name = FALSE; // variable para la cabecera
 // checar en nombre de la imagen en la url
 if (isset($_GET['imagen'])) {
  // asegurarse de la extension sea de imagen
  $ext = strtolower(substr($_GET['imagen'], -4));

  if (($ext == '.jpg') OR ($ext == '.jpeg') OR ($ext == '.png')) {
   // ruta completa de la imagen
   $image = "../uploads/{$_GET['imagen']}";

   // checar si la imagen existe y es un archivo
   if (file_exists($image) && is_file($image)) {

    // establecemos el nombre de la imagen
    $name = $_GET['imagen'];
   }
  }
 }
 // si ocurre un problema mostramos una imagen por defecto
 if (!$name) {
  $image = 'images/unavailable.png';
  $name = 'unavailable.png';
 }
 // obtenemos informacion sobre la imagen
 $info = getimagesize($image);
 $fs = filesize($image);
 // enviamos la informacion
 header("Content-Type: {$info['mime']}\n");
 header("Content-Disposition: inline; filename=\"$name\"\n");
 header("Content-Length: $fs\n");
 // enviamos el archivo
 readfile($image);
?>

1.- Creamos la variable $name la cual sera leida como validacion si la imagen existe en realidad, recuerda que como estamos usando header no debe haber ningun espacio al abrir las etiquetas de php.

2.- Checamos si existe la variable imagen

3.- Creamos una variable llamada $ext que agarra los ultimos cuatro caracteres de la imagen y luego validamos si coincide con imagenes tipo jpeg o png, y si es asi creamos una variable llamada imagen la cual contiene la ruta completa.

4.- Despues de eso verificamos que la imagen exista y que sea un archivo, si es asi, establecemos su nombre en la variable $name la cual estaba en falso por defecto ya veras mas adelante el por qué.

5.- Si $name es falso entonces mostramos una imagen por defecto.



6.- Obtenemos informacion sobre la imagen con getimagesize().

7.- Enviamos la informacion, una cosa es que en la cabecera Content-Disposition utilizamos inline que sirve para mostrar los datos en el navegador.

8.- Por ultimo con readfile() leemos los datos enviados de manera que se puedan mostrar correctamente en el navegador.



Algunas cosas utiles sobre cabeceras son:

* Podemos evitar problemas al enviar cabeceras utilizando la funcion headers_sent() de esta manera podemos crear algo como lo siguiente:


if(!headers_sent()){ usar la funcion header()}else{ // hace otra cosa}
* Podemos utilizar el encoding UTF-8 para que acepte mas caracteres utilizando la funcion header():


header('Content-Type: text/html; charset=UTF-8');

Podemos debuggear las cabeceras utilizando un sin fin de herramientas como son Web Developer Toolbar, Live Http Headers, Tamper Data, o simplemente con el inspeccionador de firefox o chrome:





Funciones de tiempo y fecha

Comenzaremos primero con que la hora para cada parte de la ciudad es diferente, hay una funcion llamada date_default_timezone_set() la cual establece una zona horaria predeterminada. Aqui hay una lista: http://php.net/manual/es/timezones.php esta configuracion tambien puede ser modificado desde el php.ini. Veamos un ejemplo:


date_default_timezone_get("America/Chihuahua");
Tambien esta la funcion checkdate(mes,dia,año) que comprueba la validez de una fecha formada por los argumentos. Devuelve TRUE si la fecha dada es valida sino devuelve FALSE.

La funcion date() da formato a la fecha/hora local. Su sintaxis ers la siguiente:
string date ( string $format [, int $timestamp = time() ] )
Los siguientes caracteres están reconocidos en el parámetro de cadena format
Carácter de format Descripción Ejemplo de valores devueltos
Día --- ---
d Día del mes, 2 dígitos con ceros iniciales 01 a 31
D Una representación textual de un día, tres letras Mon hasta Sun
j Día del mes sin ceros iniciales 1 a 31
l ('L' minúscula) Una representación textual completa del día de la semana Sunday hasta Saturday
N Representación numérica ISO-8601 del día de la semana (añadido en PHP 5.1.0) 1 (para lunes) hasta 7 (para domingo)
S Sufijo ordinal inglés para el día del mes, 2 caracteres st, nd, rd o th. Funciona bien con j
w Representación numérica del día de la semana 0 (para domingo) hasta 6 (para sábado)
z El día del año (comenzando por 0) 0 hasta 365
Semana --- ---
W Número de la semana del año ISO-8601, las semanas comienzan en lunes (añadido en PHP 4.1.0) Ejemplo: 42 (la 42ª semana del año)
Mes --- ---
F Una representación textual completa de un mes, como January o March January hasta December
m Representación numérica de una mes, con ceros iniciales 01 hasta 12
M Una representación textual corta de un mes, tres letras Jan hasta Dec
n Representación numérica de un mes, sin ceros iniciales 1 hasta 12
t Número de días del mes dado 28 hasta 31
Año --- ---
L Si es un año bisiesto 1 si es bisiesto, 0 si no.
o Número de año ISO-8601. Esto tiene el mismo valor que Y, excepto que si el número de la semana ISO (W) pertenece al año anterior o siguiente, se usa ese año en su lugar. (añadido en PHP 5.1.0) Ejemplos: 1999 o 2003
Y Una representación numérica completa de un año, 4 dígitos Ejemplos: 1999 o 2003
y Una representación de dos dígitos de un año Ejemplos: 99 o 03
Hora --- ---
a Ante meridiem y Post meridiem en minúsculas am o pm
A Ante meridiem y Post meridiem en mayúsculas AM o PM
B Hora Internet 000 hasta 999
g Formato de 12 horas de una hora sin ceros iniciales 1 hasta 12
G Formato de 24 horas de una hora sin ceros iniciales 0 hasta 23
h Formato de 12 horas de una hora con ceros iniciales 01 hasta 12
H Formato de 24 horas de una hora con ceros iniciales 00 hasta 23
i Minutos, con ceros iniciales 00 hasta 59
s Segundos, con ceros iniciales 00 hasta 59
u Microsegundos (añadido en PHP 5.2.2). Observe que date() siempre generará 000000 ya que toma un parámetro de tipo integer, mientras que DateTime::format() admite microsegundos. Ejemplo: 654321
Zona Horaria --- ---
e Identificador de zona horaria (añadido en PHP 5.1.0) Ejemplos: UTC, GMT, Atlantic/Azores
I (i mayúscula) Si la fecha está en horario de verano o no 1 si está en horario de verano, 0 si no.
O Diferencia de la hora de Greenwich (GMT) en horas Ejemplo: +0200
P Diferencia con la hora de Greenwich (GMT) con dos puntos entre horas y minutos (añadido en PHP 5.1.3) Ejemplo: +02:00
T Abreviatura de la zona horaria Ejemplos: EST, MDT ...
Z Índice de la zona horaria en segundos. El índice para zonas horarias al oeste de UTC siempre es negativo, y para aquellas al este de UTC es siempre positivo. -43200 hasta 50400
Fecha/Hora Completa --- ---
c Fecha ISO 8601 (añadido en PHP 5) 2004-02-12T15:19:21+00:00
r Fecha con formato » RFC 2822 Ejemplo: Thu, 21 Dec 2000 16:01:07 +0200
U Segundos desde la Época Unix (1 de Enero del 1970 00:00:00 GMT) Vea también time()

Esta tabla fue tomada del manual oficial de php.

Veamos algunos ejemplos utilizando la funcion date():


echo date('F j, Y'); // August 30, 2014 
echo date('H:i'); // 18:12
echo date('D'); // Sat
Los resultados que arrojaran estan como comentarios, tambien si te das cuenta esos estan en ingles y podrian ser modificados usando un array con nombres en español y un switch como condicional para los nombres.

mktime() obtiene la marca de tiempo Unix de una fecha. Su sintaxis:

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
Esto es lo mismo que si usamos la funcion time(), solo que aqui podemos asignar los parametros que nos convengan.

Por ultimo tenemos getdate() la cual retorna un array de valores de fecha y hora.

Array
(
    [seconds] => 34
    [minutes] => 22
    [hours] => 18
    [mday] => 30
    [wday] => 6
    [mon] => 8
    [year] => 2014
    [yday] => 241
    [weekday] => Saturday
    [month] => August
    [0] => 1409444554
)

Vamos a modificar nuestro script imagenes.php para agregarle a la lista de archivos la fecha/hora y peso del archivo.



<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Imagenes</title>
 <script type="text/javascript" src="funcion.js"></script>
</head>
<body>
 <p>Da click en la imagen para verla en una ventana separada.</p>
 <ul>
  <?php
   //establecemos el timezone por defecto
   date_default_timezone_get("America/Chihuahua");

   $dir = '../uploads';
   $files = scandir($dir);

   foreach($files as $image){
    if(substr($image,0,1) != '.'){
     $image_size = getimagesize("$dir/$image");

     // calculamos el tamaño de la imagen en kilobytes
     $file_size = round(filesize("$dir/$image"),1024) . " kb";

     //determinamos la fecha y hora en que se subio la imagen
     $image_date = date("F d, Y H:i:s",filemtime("$dir/$image"));

     $image_name = urlencode($image);

     echo "<li>
      <a href=\"javascript:crear_ventana('$image_name',$image_size[0],$image_size[1])\">$image</a> $file_size ($image_date)
           </li>\n";
    }
   } 
  ?>
 </ul>
</body>
</html>



Las lineas subrayadas son las lineas nuevas, vamos a explicarlas.


1.- Establecemos la zona horaria por defecto como America/Chihuahua

2.- Obtenemos el tamaño en kb para ello hacemos uso de round para redondear y como el tamaño es en bytes lo dividimos entre 1024 para que sea en kilobytes, con filesize() obtenemos el tamaño en bytes.

3.- Obtenemos la fecha de modificacion de cada archivo, para ello hacemos uso de la funcion filemtime() y con la funcion date() mostramos la fecha y hora formateada.

5.- Agregamos en la linea donde imprimos el enlace aun lado el tamaño y la fecha del archivo.

Algunas cosas utiles sobre fecha y hora:

* Las funciones de fecha y hora estan reflejadas en el tiempo y hora del servidor si quieres que sea la misma para cada parte del pais es mejor utilizar javascript para usar la hora que tiene configurada el cliente del navegador.

Bueno hasta aqui la parte 6 de PHP, espero poder seguir la 7 pronto ya que me atrase mucho tiempo en el BLOG saludos :D.

No hay comentarios:

Publicar un comentario en la entrada