Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas

viernes, 15 de noviembre de 2019

Sintaxis de las expresiones regulares


Para crear una expresión regular debes utilizar una sintaxis específica, es decir, caracteres especiales y reglas de construcción. Por ejemplo, esta es una expresión regular simple que coincide con cualquier número de teléfono de diez cifras con el patrón nnn-nnn-nnnn:
\d{3}-\d{3}-\d{4}
Para obtener información e instrucciones adicionales, consulta los artículos Directrices para el uso de expresiones regulares y Ejemplos de expresiones regulares. Consulta también Configuración Cumplimiento del contenido.
En la tabla siguiente se describen algunos de los caracteres especiales más comunes que deben utilizarse en las expresiones regulares. Los caracteres se clasifican según las categorías que se indican a continuación:
Caracteres Descripción
Anclajes
^ (acento circunflejo) Coincide con el principio de la línea o de la cadena de texto que se busca mediante la expresión regular. Por ejemplo, una regla de contenido con una línea de asunto de ubicación y la siguiente expresión regular:

^abc

obtiene todos los mensajes de correo electrónico cuya línea de asunto empiece por las letras abc
$ (dólar) Coincide con el final de la línea o de la cadena de texto que se busca mediante la expresión regular. Por ejemplo, una regla de contenido con una línea de asunto de ubicación y la siguiente expresión regular:

xyz$

obtiene todos los mensajes de correo electrónico cuya línea de asunto termine en las letras xyz
Metacaracteres
. (punto) Coincide con cualquier carácter individual, excepto con los de una línea nueva.
| (barra vertical) Indica alternativa; es decir, la disyuntiva "o". Por ejemplo:

gato|perro coincide con la palabra gato o con perro.
\ Indica que el carácter siguiente es literal y no especial. Por ejemplo:

\. coincide únicamente con un punto y no con cualquier carácter (puntos suspensivos)
Clases de caracteres
[...] Coincide con cualquiera de los caracteres del conjunto especificado. Separa el primer y el último carácter con un guion. Por ejemplo:

[123] coincide con los números 1, 2 o 3.

[a-f] coincide con cualquier letra de la a a la f.

Nota: En las políticas de cumplimiento del contenido, las expresiones regulares distinguen entre mayúsculas y minúsculas.
[^...] Coincide con cualquier carácter que no se incluya en el conjunto de caracteres especificado. Por ejemplo:

[^a-f] coincide con cualquier carácter que no sea una letra comprendida entre la a y la f.

Nota: En las políticas de cumplimiento del contenido, las expresiones regulares distinguen entre mayúsculas y minúsculas.
[:alnum:] Coincide con caracteres alfanuméricos (letras o cifras):

a-z, A-Z o 0-9

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:alnum:]].
[:alpha:] Coincide con caracteres alfanuméricos (letras):

a-z o A-Z

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:alpha:]].
[:digit:] Coincide con cifras:

0-9

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:digit:]].
[:graph:] Coincide únicamente con caracteres visibles, es decir, con cualquier carácter excepto con espacios, caracteres de control, etc.

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:graph:]].
[:punct:] Coincide con caracteres de puntuación y con símbolos:

! " # $ % & ' ( ) * + , \ -. / : ; < = > ? @ [ ] ^ _ ` { | }

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo, [[:punct:]].
[:print:] Coincide con caracteres visibles y con espacios.

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:print:]].
[:space:] Coincide con todos los caracteres de espacio en blanco, incluidos los espacios, las tabulaciones y los saltos de línea.

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:space:]].
[:word:] Coincide con cualquier carácter de una palabra, es decir, con cualquier letra, cifra o con un guion bajo:

a-z, A-Z, 0-9 o _

Nota: Esta clase de caracteres debe delimitarse con otro conjunto de corchetes cuando se utiliza en una expresión regular, por ejemplo: [[:word:]].
Clases de caracteres abreviados
\w Coincide con cualquier carácter de una palabra, es decir, con cualquier letra, cifra o con un guion bajo:

a-z, A-Z, 0-9 o _

Equivale a [:word:]
\W Coincide con cualquier carácter que no pertenezca a una palabra, es decir, con cualquier carácter que no sea una letra, una cifra o un guion bajo.

Equivale a [^[:word:]]
\s Coincide con cualquier carácter de espacio en blanco. Por ejemplo, utiliza este carácter para indicar un espacio entre las palabras de una frase:

consejos\sútiles coincide con la frase sconsejos útiles

Equivale a [:space:]
\S Coincide con cualquier carácter que no sea un espacio en blanco.

Equivale a [^[:space:]]
\d Coincide con cualquier cifra del 0 al 9 (ambos incluidos).

Equivale a [:digit:]
\D Coincide con cualquier carácter que no sea una cifra del 0 al 9 (ambos incluidos).

Equivale a [^[:digit:]]
Grupo
(...) Agrupa partes de una expresión. Utiliza la función de agrupar para aplicar un cuantificador a un grupo o para hacer coincidir una clase de caracteres antes o después del grupo.
Cuantificadores
{n} Coincide con la expresión que le precede exactamente n veces. Por ejemplo:

[a-c]{2} coincide con cualquier letra de la a a la c solo si hay dos letras en una fila. De este modo, la expresión coincidiría con ab y ac, pero no con abc o con aabbc.
{n,m} Coincide con la expresión que le precede n veces como mínimo y m veces como máximo. Por ejemplo:

[a-c]{2,4} coincide con cualquier letra de la a a la c solo si las letras tienen lugar un mínimo de 2 veces y un máximo de 4 veces en una fila. De este modo, la expresión coincidiría con ab y con abc, pero no con aabbc.
? Indica que el carácter o la expresión que le precede puede coincidir una vez o ninguna. Equivalente al intervalo {0,1}. Por ejemplo, la siguiente expresión regular:

colou?r

coincide con colour o color porque ? convierte la letra u en opcional.
Limitaciones de los caracteres de expresiones regulares
No se admiten las expresiones regulares con los siguientes caracteres especiales, ya que pueden ocasionar retrasos en el procesamiento del correo electrónico:
  • * (asterisco)
  • + (signo más)

viernes, 8 de noviembre de 2019

PHP: Reducir texto con puntos suspensivos

Este es el método más rápido si quieres recortar una cadena para que se muestre solo un nº total de caracteres.
  • $cadena = 'La Región de León, Región Leonesa o Reino de León, es una región histórica española definida tras la división territorial de España en 1833. Agrupa las provincias de León, Salamanca y Zamora. El término Reino deviene de dicho documento estatal, con lo que a efectos legales y administrativos, ese sería su nombre oficial, al igual que lo son el de Reino de Murcia y el Reino de Valencia';
  • $caracteres = 50;

  • //Modo de uso:
  • echo substr($cadena, 0, $caracteres).'...'; // Imprimirá: La Región de León, Región Leonesa o Reino de León, es una región histórica española definida...

martes, 10 de abril de 2012

Ventana emergente en boton de form

Abrir una ventana emergente al pulsar el boton submit de un formulario html.

<form action="blablá" method="post" target="ventanita" onsubmit="ventanita=window.open('','ventanita','wi dth=300,height=300')">

Propiedades de window.open

Syntax

window.open(URL,name,specs,replace)

Parameter Description
URL Optional. Specifies the URL of the page to open. If no URL is specified, a new window with about:blank is opened
name Optional. Specifies the target attribute or the name of the window. The following values are supported:
  • _blank - URL is loaded into a new window. This is default
  • _parent - URL is loaded into the parent frame
  • _self - URL replaces the current page
  • _top - URL replaces any framesets that may be loaded
  • name - The name of the window
specs Optional. A comma-separated list of items. The following values are supported:

channelmode=yes|no|1|0 Whether or not to display the window in theater mode. Default is no. IE only
directories=yes|no|1|0 Whether or not to add directory buttons. Default is yes. IE only
fullscreen=yes|no|1|0 Whether or not to display the browser in full-screen mode. Default is no. A window in full-screen mode must also be in theater mode. IE only
height=pixels The height of the window. Min. value is 100
left=pixels The left position of the window
location=yes|no|1|0 Whether or not to display the address field. Default is yes
menubar=yes|no|1|0 Whether or not to display the menu bar. Default is yes
resizable=yes|no|1|0 Whether or not the window is resizable. Default is yes
scrollbars=yes|no|1|0 Whether or not to display scroll bars. Default is yes
status=yes|no|1|0 Whether or not to add a status bar. Default is yes
titlebar=yes|no|1|0 Whether or not to display the title bar. Ignored unless the calling application is an HTML Application or a trusted dialog box. Default is yes
toolbar=yes|no|1|0 Whether or not to display the browser toolbar. Default is yes
top=pixels The top position of the window. IE only
width=pixels The width of the window. Min. value is 100

replace Optional.Specifies whether the URL creates a new entry or replaces the current entry in the history list. The following values are supported:
  • true - URL replaces the current document in the history list
  • false - URL creates a new entry in the history list

lunes, 9 de abril de 2012

Trabajar con ficheros en php

En este nuevo tutorial, voy a tratar el tema de los ficheros y como se trabaja en ellos desde PHP. No va a ser exhaustivo ni mucho menos, pretende proporcionaros las bases para que experimentéis por vuestra cuenta y riesgo. Vamos a aprender unas cuantas cosas útiles al respecto de los ficheros, así que, si estáis listos, empezamos. Para este tutorial solo váis a necesitar PHP, nada más (ni MySQL ni otra cosa).

Abriendo un fichero de texto, lectura, escritura y añadido

Lo primero que vamos a hacer es escribir un sencillo fichero de texto. Lo abriremos, escribiremos un par de líneas dentro de él y luego lo cerraremos. El código que realiza esto se puede ver a continuación.
<?   #Abrimos el fichero en modo de escritura  $DescriptorFichero = fopen("fichero_prueba.txt","w");   #Escribimos la primera línea dentro de él  $string1 = "Esta es la primera línea de texto ";  fputs($DescriptorFichero,$string1);   #Escribimos la segunda línea de texto  $string2 = "Y esta es la segunda línea de texto ";  fputs($DescriptorFichero,$string2);   #Cerramos el fichero  fclose($DescriptorFichero);   ?>  
Así pues, el script anterior lo único que hace es abrir un fichero llamado fichero_prueba.txt, y escribe dentro de él dos líneas de texto. Os habréis fijado en el de detrás de las líneas de texto, en las variables $string1 y $string2. Esto se debe a que, si no estuviese puesto, el programa escribiría todo seguido. Para comprobarlo, quitadlo y ejecutad de nuevo el programa. Con solo no sirva, al menos en mi sistema Windows 2000. :-) En Linux, basta con un .
Otra de las cosas importantes del anterior script es algo que quizás no hayamos visto de cerca. Fijémonos en la siguiente línea:
$DescriptorFichero = fopen("fichero_prueba.txt","w");
La función fopen sirve para abrir un fichero en un modo. Los modos pueden ser seis y son los siguientes. Además de listarlos, explicaré las diferencias (no siempre tan obvias), al respecto de ellos.
Modo de apertura Qué significa
r Modo de solo lectura. Se abre el fichero y el cursor se coloca al principio del mismo, permitiendo leerlo hasta el final.
r+ Modo de lectura/escritura. Se abre el fichero y el cursor se coloca al principio del mismo,permitiendo leer o escribir en el fichero.
w Modo de solo escritura. Se crea el fichero si no existiese, y, si existe, se borra todo su contenido, se sitúa el cursor al principio del fichero permitiendonos escribir.
w+ Modo de escritura/lectura. Si el fichero no existe, se crea, y, si existiese, se borra todo su contenido, se sitúa el cursor al principio del fichero permitiéndonos escribir y leer.
a Modo de añadido. Abre el fichero, sitúa el cursor al final del mismo y permite escribir. Si el fichero no existe, lo crea, pero, en caso de existir, no borra su contenido.
a+ Modo de añadido/lectura. Sitúa el cursor al final del fichero y permite escribir y leer. Si el fichero no existe, lo crea, pero, si existe, no borra su contenido.
Así pues, estos son los seis modos de abrir un fichero. Vamos ahora a ver un ejemplo en código del uso de los mismos. El siguiente script va a hacer las siguientes tareas:
  • Crear un fichero y escribir en él dos líneas de texto.
  • Abrir el fichero de nuevo, esta vez en modo añadido, y escribir otras dos líneas.
Es poco, pero la lectura de ficheros la veremos al final de esta parte del tutorial. De momento, aquí está el código del script de PHP.
escribir2.php
<?   #Abrimos el fichero en modo de escritura  $DescriptorFichero = fopen("fichero_prueba.txt","w");   #Escribimos la primera línea dentro de él  $string1 = "Esta es la primera línea de texto ";  fputs($DescriptorFichero,$string1);   #Escribimos la segunda línea de texto  $string2 = "Y esta es la segunda línea de texto ";  fputs($DescriptorFichero,$string2);   #Cerramos el fichero  fclose($DescriptorFichero);   #Volvemos a abrir el fichero, esta vez en modo de añadir  $Descriptor2 = fopen("fichero_prueba.txt","a");   #Añadimos la tercera línea de texto  fputs($Descriptor2,"Esta es la tercera línea, añadida con modo "a" ");   #Añadimos la cuarta línea de texto  fputs($Descriptor2,"Esta es la cuarta línea, añadida con modo "a" ");   #Cerramos el fichero  fclose($Descriptor2);   ?> 
Como podéis comprobar si abrís el fichero recién creado, éste contiene cuatro líneas, dos de ellas escritas con modo "w" y otras dos con modo "a". Si ya tenéis más o menos claro como funciona, vamos a pasar a ver dos funciones muy útiles para leer ficheros de texto: fgets() y feof(). A través de fgets() podemos leer una línea del fichero de texto cada vez. feof() sirva para saber si hemos llegado al final del fichero. Para ver como funcionan, crearemos un script que leerá el fichero que hemos creado con los dos scripts anteriores.
leer.php
<?   #Abrimos el fichero en modo lectura  $DescriptorFichero = fopen("fichero_prueba.txt","r");   #Hasta que no lleguemos al final del fichero  while(!feof($DescriptorFichero)){       #Capturamos 4096 caracteres dentro de la línea,      #o menos si hay un retorno de carro antes      #(  en Win32,   en UNIX)      $buffer = fgets($DescriptorFichero,4096);       #Soltamos el texto, añadiendo <BR> detrás      echo $buffer."<BR>";  }   ?> 
Como véis, este script lee el fichero de texto línea a línea y lo va mostrando en el navegador. La función feof() devuelve TRUE cuando ha llegado al final del fichero. fgets(), va, pues, leyendo linea a linea y almacenándolo en una varible llamada $buffer.
Ahora vamos a ver como funcionan los modos w+, r+ y a+. Veréis que son diferentes de los anteriores en el sentido de que permiten dos operaciones, y tambien en el sentido de como tratan los ficheros. Empezaremos con w+. El siguiente script explica qué es lo que hace este modo con los ficheros.
leer_wplus.php
<?   #Abrimos el fichero en modo w+  $Descriptor1 = fopen("nuevo_fichero.txt","w+");   #Vamos a escribir un par de líneas en el fichero  fputs($Descriptor1,"Esta es la primera línea de texto ");  fputs($Descriptor1,"Esta es la segunda línea de texto ");   #Ahora cerraremos el fichero  fclose($Descriptor1);   #Volvemos a abrirlo en modo w+  $Descriptor2 = fopen("nuevo_fichero.txt","w+");   #Escribimos un par de líneas  fputs($Descriptor2,"Esta es la tercera línea de texto ");  fputs($Descriptor2,"Esta es la cuarta línea de texto ");   #Volvemos al principio del fichero  rewind($Descriptor2);   #Vamos leyendo líneas y mostrándolas  while(!feof($Descriptor2)){       $buffer = fgets($Descriptor2,4096);      echo $buffer."<BR>";   }   #Cerramos el fichero  fclose($Descriptor2);   ?> 
Como véis, al ejecutarlo, el resultado es el siguiente:
Esta es la tercera línea de texto Esta es la cuarta línea de texto 
¿Por qué no aparecen la primera y la segunda línea escritas? Observemos lo que hemos hecho. Primero abrimos el fichero y escribimos dentro de él dos líneas de texto. Tras esto, lo cerramos y lo volvemos a abrir, en modo w+. Este modo BORRA EL CONTENIDO ANTERIOR del fichero, por lo que en este solo aparecen las dos últimas líneas. Como véis, se puede utilizar este modo para leer desde el fichero con fgets().
Ahora vamos a ver un ejemplo con r+. Vamos a crear un script que haga lo mismo que el anteriro, pero en vez de abrir los ficheros con w+, los abrirá con r+.
leer_rplus.php
<?   #Abrimos el fichero en modo w+  $Descriptor1 = fopen("nuevo_fichero.txt","w");   #Vamos a escribir un par de líneas en el fichero  fputs($Descriptor1,"Esta es la primera línea de texto ");  fputs($Descriptor1,"Esta es la segunda línea de texto ");   #Ahora cerraremos el fichero  fclose($Descriptor1);   #Volvemos a abrirlo en modo w+  $Descriptor2 = fopen("nuevo_fichero.txt","r+");   #Escribimos un par de líneas  fputs($Descriptor2,"Esta es la tercera línea de texto ");  fputs($Descriptor2,"Esta es la cuarta línea de texto ");   #Volvemos al principio del fichero  rewind($Descriptor2);   #Vamos leyendo líneas y mostrándolas  while(!feof($Descriptor2)){       $buffer = fgets($Descriptor2,4096);      echo $buffer."<BR>";   }   #Cerramos el fichero  fclose($Descriptor2);   ?> 
Si ejecutáis el script, quizás observéis, sorprendidos, que el resultado es el mismo que en el anterior. Pero lo que ha sucedido, en cambio, no es lo mismo. Vamos a anlizarlo por partes. Primero, hemos abierto el fichero en modo w (escritura), para meter dos líneas en el fichero. Tras esto, lo cerramos, y lo abrimos en modo r+ (lectura/escritura). Al abrirlo de este modo, el cursor se sitúa al principio del fichero, por lo que al escribir las siguientes dos líneas, borra el contenido de las dos líneas anteriroes.. Antes de mostrar el contenido del fichero usamos la función rewind(), que rebobina el cursor hasta el principio del fichero. Para añadir al final de fichero, necesitamos el modo a+, como veremos en el siguiente ejemplo.
leer_aplus.php
<?  #Abrimos el fichero en modo w+  $Descriptor1 = fopen("nuevo_fichero.txt","w+");   #Vamos a escribir un par de líneas en el fichero  fputs($Descriptor1,"Esta es la primera línea de texto ");  fputs($Descriptor1,"Esta es la segunda línea de texto ");   #Ahora cerraremos el fichero  fclose($Descriptor1);   #Volvemos a abrirlo en modo w+  $Descriptor2 = fopen("nuevo_fichero.txt","a+");   #Escribimos un par de líneas  fputs($Descriptor2,"Esta es la tercera línea de texto ");  fputs($Descriptor2,"Esta es la cuarta línea de texto ");   #Volvemos al principio del fichero  rewind($Descriptor2);   #Vamos leyendo líneas y mostrándolas  while(!feof($Descriptor2)){       $buffer = fgets($Descriptor2,4096);      echo $buffer."<BR>";   }   #Cerramos el fichero  fclose($Descriptor2);   ?> 
El resultado de este método es el esperado. Se abre el fichero en modo escritura y se insertan las dos líneas de texto. Se cierra este descriptor, y se abre otro en modo a+. El cursor se sitúa al final del fichero, y comienza a añadir el texto. El resultado son las cuatro líneas dentro del fichero de texto.
Esto es todo en cuanto a modos de apertura. En la siguiente sección vamos a ver como subir ficheros al servidor, algo muy útil cuando se trata de páginas web.

Subir ficheros al servidor

Para ejemplificar la subida de archivos al servidor, vamos a ver un script de ejemplo. El script tiene dos partes; la primera, el formulario, en el que se introduce el fichero a cargar, y la segunda parte, en la que se procesa la subida y se informa al usuario del éxito o fracaso de la carga.
upload.php
<?   if(!isset($cargar)){   ?>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  <HTML>  <HEAD>  <TITLE>:: Formulario de carga de ficheros ::</TITLE>  </HEAD>   <BODY>   <FORM NAME="elForm" METHOD="POST"        ACTION="<? echo $PHP_SELF; ?>?cargar=1"        ENCTYPE="multipart/form-data">       <TABLE WIDTH="80%" STYLE="font-family:Arial;font-size:9pt;">       <TR>          <TD ALIGN="LEFT"><INPUT TYPE="FILE" NAME="elFichero"></INPUT></TD>      </TR>       <TR>          <TD ALIGN="LEFT"><INPUT TYPE="SUBMIT" VALUE="Subir el fichero">      </TR>       </TABLE>   </FORM></BODY></HTML>   <?   }   #Aquí realizamos la carga del fichero  if(isset($cargar)){       #Le damos al fichero un nuevo nombre      $nuevositio = "nuevo_fichero_caragado.000";       #Lo copiamos      if(!copy($elFichero,$nuevositio)){          echo "NO SE HA PODIDO SUBIR EL FICHERO";      }      else{          echo "FICHERO SUBIDO CON ÉXITO";      }        }   ?> 
Como vemos, el script realiza la carga del fichero. Para rizar un poco más el rizo os propongo lo siguiente: un script que suba un número de ficheros introducido por el usuario. Se compondrá de tres partes. La primera, en la que se pregunta al usuario el número de ficheros que desea introducir. La segunda, en la que aparecen todos los campos de tipo fichero, y la tercera, en la que se procesa la carga. El código es como sigue:
upload_multiple.php
<?   /* Este script se encarga de subir múltiples ficheros al servidor. */   #Formulario en el que se pregunta el número de ficheros  if(!isset($fich) && !isset($cargar)){       $txt ="<HTML><HEAD> ";      $txt.="<TITLE>:: ¿Cuántos ficheros quiere subir hoy? ::</TITLE> ";      $txt.="</HEAD><BODY> ";      $txt.="<FORM NAME="frmNumFicheros"                   METHOD="POST"                   ACTION="".$PHP_SELF."?fich=1"> ";            $txt.="<BR><BR><BR><BR> ";      $txt.="<DIV ALIGN="CENTER"> ";      $txt.="<INPUT TYPE="TEXT" NAME="numFicheros"> ";      $txt.="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";      $txt.="<B>Introduce el número de ficheros</B> ";      $txt.="<BR><BR> ";      $txt.="<INPUT TYPE="SUBMIT"                    VALUE="Mostrar campos para subir ficheros"> ";      $txt.="<BR></DIV> ";       $txt.="</FORM></BODY></HTML> ";       echo $txt;  }   #Formulario en el que se muestran los campos tipo fichero  if(isset($fich)){       $txt ="<HTML><HEAD> ";      $txt.="<TITLE>:: ¿Cuántos ficheros quiere subir hoy? ::</TITLE> ";      $txt.="</HEAD><BODY> ";      $txt.="<FORM ENCTYPE="multipart-form/data"                   NAME="frmCargaFicheros"                   METHOD="POST" ACTION="".$PHP_SELF."?cargar=1&cantidad=".$HTTP_POST_VARS["numFicheros"].""> ";       for($i=0;$i<$HTTP_POST_VARS["numFicheros"];$i++){                    $txt.="<INPUT TYPE="FILE" NAME="fichero_$i"><BR> ";       }       $txt.="<INPUT TYPE="SUBMIT" VALUE="cargar"> ";       $txt.="</FORM></BODY></HTML> ";             echo $txt;  }   #Parte que gestiona el proceso de carga  if(isset($cargar)){             for($n=0;$n<$cantidad;$n++){           #Creamos la "variable variable"          $nomvar = "fichero_$n";          $valvar = ${$nomvar};           #Extraemos el nombre del fichero sin la ruta          $nomfichero = basename($valvar);           #Le damos al fichero su nombre, metiéndolo dentro del directorio /subidas          $nuevositio = "subidas/".$nomfichero."";           #Lo copiamos          if(!copy($valvar,$nuevositio)){              echo "NO SE HA PODIDO SUBIR EL FICHERO";          }          else{              echo "FICHERO SUBIDO CON ÉXITO";          }      }    }   ?> 
De este modo podemos cargar varios ficheros al mismo tiempo. Tendrás que crear el directorio /subidas manualmente. Vamos a termnar con esta sección y pasar a la siguiente, en la que se explica como forzar al cliente a descargarse el fichero en vez de verlo on-line.

Forzar descarga de ficheros al navegador

A veces puede ser interesante que el usuario se descargue el fichero en vez de verlo on-line. Para realizar esta operación, solo necesitamos utilizar el siguiente código que voy a explicar a continuación. El script consta de una sola parte. Vamos a descargarnos un fichero .html, en vez de verlo en el navegador. El nombre del fichero será prueba_descarga.html. El código es como sigue:
descargar.php
<?   function Descargar($ElFichero){       $TheFile = basename($ElFichero);                header( "Content-Type: application/octet-stream");       header( "Content-Length: ".filesize($ElFichero));       header( "Content-Disposition: attachment; filename=".$TheFile."");       readfile($ElFichero);   }   Descargar("prueba_descarga.html");   ?> 
Como ves, el script se ejecuta y el fichero, pese a ser HTML, e interpretable por el navegador, es forzado a ser descargado, igual que si hubiéramos pulsado el botón derecho.
Y con esto termino este tutorial. Espero que os sea útil, aunque se que es corto. Es posible que en otro tutorial próximo me extienda más sobre este tem

Procesamiento de un formulario con dos botones en PHP

Este es un artículo que trata sobre algo de una muy simple solución pero que no siempre se puede ver a simple vista. Aquí voy a procesar un único formulario que consta de un texto el caul tenemos que ingresar, y dos botones que, según sea el que seleccionemos, redirigirá la página a otra según corresponda con el valor del texto ingresado.
Aquí les muestro la página principal index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1″ />
<title>Procesamiento de un formulario con dos botones en PHP</title>
</head>
<body>
<form action="procesamiento.php" method="post">
<p>Ingrese un texto</p>
<p><input type="text" name="texto"/></p>
<p><input type="submit" name="cmdForm" value="Procesar texto con el boton 1″ /></p>
<p><input type="submit" name="cmdForm" value="Procesar texto con el boton 2″ /></p>
</form>
</body>
</html>

Como habrán visto, es sólo un formulario, con un campo texto y dos botones submit dentro. El detalle está en que, si bien son dos botones, los dos llevan el mismo nombre (name="cmdForm"), solo cambia el valor de esos botones según sea el que seleccionemos: value="Procesar texto con el boton 1″, para el boton1 y value="Procesar texto con el boton 2″ para el boton 2. Al seleccionar uno de esos botones, el formulario nos manda a procesamiento.php, independientemente de cual botón presionamos. Será allí donde se procesará el texto según sea el botón seleccionado.
Aqui el segundo archivo: procesamiento.php
<?php
switch( $_POST['cmdForm'] ) {
case "Procesar texto con el boton 1″: header ("location:boton1.php?texto=".$_POST['texto']);
break;
case "Procesar texto con el boton 2″: header ("location:boton2.php?texto=".$_POST['texto']);
break;
}
?>

Aquí está todo el tratamiento de nuestro formulario con los dos botones: hago un switch (o un case, para otros lenguajes) con el valor del botón cmdForm (recordemos que al llamar a los dos botones con el mismo nombre, es como si fuera un sólo botón que admite dos valores!). Según sea el valor del botón, nos vamos a una página correspondiente al botón1 y a otra correspondiente al botón2. En ambos casos, me voy a esas dos paginas con el valor del texto ingresado para tratarlo según sea la utilidad que le demos.
Aquí estan las dos páginas, una para cada botón:
boton1.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1″ />
<title>Se procesó el formulario con el boton 1</title>
</head>
<?php
echo "Se procesó el formulario con el boton 1, y el texto de entrada es: <strong>".$_GET['texto']."</strong> ";
?>
<a href="index.php">Volver</a>
<body>
</body>
</html>

boton2.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1″ />
<title>Se procesó el formulario con el boton 2</title>
</head>
<?php
echo "Se procesó el formulario con el boton 2, y el texto de entrada es: <strong>".$_GET['texto']."</strong> ";
?>
<a href="index.php">Volver</a>
<body>
</body>
</html>

Estos dos scripts son prácticamente iguales, sólo cambian algunos detalles de nombre para cada botón. Podemos ver que aquí recupero la variable con el valor del texto que ingresamos inicialmente. Aquí utilizo GET y no POST, puesto que en el archivo procesamiento.php pasé la variable texto en el prompt (location:boton1.php?texto=".$_POST['texto']) y luego muestro esa misma variable al final de un echo como para personalizar el resultado.
Eso es todo, espero que les sirva.

Trabajar con fechas y horas en PHP y MySQL

Trabajar con horas y fechas en PHP es muy importante, ya que con ello podemos llevar a cabo tareas tan trascendentales como controlar a qué hora ha sido introducido o modificado un registro en una base de datos o imprimir la fecha y/u hora variando su formato en nuestras páginas web.
Lo más adecuado en todos los casos suele ser almacenar la fecha en formato unix en una variable:
$fecha = time();
De este modo guardamos en la variable $fecha todos los segundos que han transcurrido desde las doce de la noche del 1 de enero de 1970. $fecha será, por tanto, un número entero al que podremos sacar partido con la función "date()" para que muestre la fecha u hora en el formato que nos interese:
$fecha_con_formato = date("formato",$fecha);
Los parámetros más importantes que podemos introducir en "formato" son los siguientes:
Parámetro Descripción Parámetro Descripción
d Día del mes con ceros iniciales (De 01 a 31).  h Hora en formato 12-horas con ceros iniciales.
j Día del mes sin ceros iniciales (De 1 a 31).  H Hora en formato 24-horas con ceros iniciales.
 m Número del mes con ceros iniciales (De 01 a 12).  i Minutos con ceros iniciales.
 n Número del mes sin ceros iniciales (De 1 a 12). s Segundos con ceros iniciales.
Y Año con cuatro dígitos (Ejemplo: 2007). A AM o PM.
y Año con dos dígitos (Ejemplo: 07).  T Configuración de zona horaria del servidor.

Ejemplo: Si es el 19 de octubre de 2007 y son las 12:25, el siguiente código:
$fecha_con_formato = date("d/m/Y -- H:i:s",$fecha);
nos devolverá:
19/10/2007 -- 12:25:33
Si vamos a introducir la fecha en una base de datos (por ejemplo MySQL), lo más apropiado - a mi juicio - es guardar la fecha en formato unix, es decir, en un campo de tipo BigINT(11), ya que así tendremos una mayor versatilidad a la hora de mostrarla respecto a si lo hacemos en un campo DATE, DATETIME o TIMESTAMP (enlace en inglés).
Es posible pasar a formato unix una fecha determinada utilizando la función mktime(hora, min, seg, mes, día, año) o comprobar si una determinada fecha es válida, mediante la función checkdate(mes, día, año). Puedes ver aquí un ejemplo de uso de cada una de ellas.

miércoles, 4 de abril de 2012

Zona horaria en php

A veces, el servidor que contiene nuestras paginas web está situado en la otra punta del mundo, lo que, entre otras cosas, hace que todo lo relacionado con la hora y la fecha se vea afectado por los diferentes husos horarios.




Para que su página web no ponga que escribes los post de madrugada cuando en realidad los mandas desde el trabajo, aquí tienes un ejemplo en PHP de como corregir el huso horario sobre el que nuestra página debe trabajar. Si se fijan, usamos la función date_default_timezone_set() para indicarle al servidor la zona horaria, y trabajamos con las funciones date() y time() para mostrar la hora.


<?php
date_default_timezone_set("Chile/Continental");
echo "La hora en Chile es: " . date ("H:i",time()) . "<br />";
?>

Aquí les dejo las zonas horarias que encontré recopilando en la red. Seleccionen la que se acomode a su país e impleméntenla. Sería una buena idea detectar el país del visitante y definir la zona horaria dinámicamente. Suerte!!!


  • Africa/Abidjan
  • Africa/Accra
  • Africa/Addis_Ababa
  • Africa/Algiers
  • Africa/Asmara
  • Africa/Asmera
  • Africa/Bamako
  • Africa/Bangui
  • Africa/Banjul
  • Africa/Bissau
  • Africa/Blantyre
  • Africa/Brazzaville
  • Africa/Bujumbura
  • Africa/Cairo
  • Africa/Casablanca
  • Africa/Ceuta
  • Africa/Conakry
  • Africa/Dakar
  • Africa/Dar_es_Salaam
  • Africa/Djibouti
  • Africa/Douala
  • Africa/El_Aaiun
  • Africa/Freetown
  • Africa/Gaborone
  • Africa/Harare
  • Africa/Johannesburg
  • Africa/Kampala
  • Africa/Khartoum
  • Africa/Kigali
  • Africa/Kinshasa
  • Africa/Lagos
  • Africa/Libreville
  • Africa/Lome
  • Africa/Luanda
  • Africa/Lubumbashi
  • Africa/Lusaka
  • Africa/Malabo
  • Africa/Maputo
  • Africa/Maseru
  • Africa/Mbabane
  • Africa/Mogadishu
  • Africa/Monrovia
  • Africa/Nairobi
  • Africa/Ndjamena
  • Africa/Niamey
  • Africa/Nouakchott
  • Africa/Ouagadougou
  • Africa/Porto-Novo
  • Africa/Sao_Tome
  • Africa/Timbuktu
  • Africa/Tripoli
  • Africa/Tunis
  • Africa/Windhoek
  • America/Adak
  • America/Anchorage
  • America/Anguilla
  • America/Antigua
  • America/Araguaina
  • America/Argentina/Buenos_Aires
  • America/Argentina/Catamarca
  • America/Argentina/ComodRivadavia
  • America/Argentina/Cordoba
  • America/Argentina/Jujuy
  • America/Argentina/La_Rioja
  • America/Argentina/Mendoza
  • America/Argentina/Rio_Gallegos
  • America/Argentina/San_Juan
  • America/Argentina/Tucuman
  • America/Argentina/Ushuaia
  • America/Aruba
  • America/Asuncion
  • America/Atikokan
  • America/Atka
  • America/Bahia
  • America/Barbados
  • America/Belem
  • America/Belize
  • America/Blanc-Sablon
  • America/Boa_Vista
  • America/Bogota
  • America/Boise
  • America/Buenos_Aires
  • America/Cambridge_Bay
  • America/Campo_Grande
  • America/Cancun
  • America/Caracas
  • America/Catamarca
  • America/Cayenne
  • America/Cayman
  • America/Chicago
  • America/Chihuahua
  • America/Coral_Harbour
  • America/Cordoba
  • America/Costa_Rica
  • America/Cuiaba
  • America/Curacao
  • America/Danmarkshavn
  • America/Dawson
  • America/Dawson_Creek
  • America/Denver
  • America/Detroit
  • America/Dominica
  • America/Edmonton
  • America/Eirunepe
  • America/El_Salvador
  • America/Ensenada
  • America/Fort_Wayne
  • America/Fortaleza
  • America/Glace_Bay
  • America/Godthab
  • America/Goose_Bay
  • America/Grand_Turk
  • America/Grenada
  • America/Guadeloupe
  • America/Guatemala
  • America/Guayaquil
  • America/Guyana
  • America/Halifax
  • America/Havana
  • America/Hermosillo
  • America/Indiana/Indianapolis
  • America/Indiana/Knox
  • America/Indiana/Marengo
  • America/Indiana/Petersburg
  • America/Indiana/Vevay
  • America/Indiana/Vincennes
  • America/Indiana/Winamac
  • America/Indianapolis
  • America/Inuvik
  • America/Iqaluit
  • America/Jamaica
  • America/Jujuy
  • America/Juneau
  • America/Kentucky/Louisville
  • America/Kentucky/Monticello
  • America/Knox_IN
  • America/La_Paz
  • America/Lima
  • America/Los_Angeles
  • America/Louisville
  • America/Maceio
  • America/Managua
  • America/Manaus
  • America/Martinique
  • America/Mazatlan
  • America/Mendoza
  • America/Menominee
  • America/Merida
  • America/Mexico_City
  • America/Miquelon
  • America/Moncton
  • America/Monterrey
  • America/Montevideo
  • America/Montreal
  • America/Montserrat
  • America/Nassau
  • America/New_York
  • America/Nipigon
  • America/Nome
  • America/Noronha
  • America/North_Dakota/Center
  • America/North_Dakota/New_Salem
  • America/Panama
  • America/Pangnirtung
  • America/Paramaribo
  • America/Phoenix
  • America/Port-au-Prince
  • America/Port_of_Spain
  • America/Porto_Acre
  • America/Porto_Velho
  • America/Puerto_Rico
  • America/Rainy_River
  • America/Rankin_Inlet
  • America/Recife
  • America/Regina
  • America/Resolute
  • America/Rio_Branco
  • America/Rosario
  • America/Santiago
  • America/Santo_Domingo
  • America/Sao_Paulo
  • America/Scoresbysund
  • America/Shiprock
  • America/St_Johns
  • America/St_Kitts
  • America/St_Lucia
  • America/St_Thomas
  • America/St_Vincent
  • America/Swift_Current
  • America/Tegucigalpa
  • America/Thule
  • America/Thunder_Bay
  • America/Tijuana
  • America/Toronto
  • America/Tortola
  • America/Vancouver
  • America/Virgin
  • America/Whitehorse
  • America/Winnipeg
  • America/Yakutat
  • America/Yellowknife
  • Antarctica/Casey
  • Antarctica/Davis
  • Antarctica/DumontDUrville
  • Antarctica/Mawson
  • Antarctica/McMurdo
  • Antarctica/Palmer
  • Antarctica/Rothera
  • Antarctica/South_Pole
  • Antarctica/Syowa
  • Antarctica/Vostok
  • Arctic/Longyearbyen
  • Asia/Aden
  • Asia/Almaty
  • Asia/Amman
  • Asia/Anadyr
  • Asia/Aqtau
  • Asia/Aqtobe
  • Asia/Ashgabat
  • Asia/Ashkhabad
  • Asia/Baghdad
  • Asia/Bahrain
  • Asia/Baku
  • Asia/Bangkok
  • Asia/Beirut
  • Asia/Bishkek
  • Asia/Brunei
  • Asia/Calcutta
  • Asia/Choibalsan
  • Asia/Chongqing
  • Asia/Chungking
  • Asia/Colombo
  • Asia/Dacca
  • Asia/Damascus
  • Asia/Dhaka
  • Asia/Dili
  • Asia/Dubai
  • Asia/Dushanbe
  • Asia/Gaza
  • Asia/Harbin
  • Asia/Hong_Kong
  • Asia/Hovd
  • Asia/Irkutsk
  • Asia/Istanbul
  • Asia/Jakarta
  • Asia/Jayapura
  • Asia/Jerusalem
  • Asia/Kabul
  • Asia/Kamchatka
  • Asia/Karachi
  • Asia/Kashgar
  • Asia/Katmandu
  • Asia/Krasnoyarsk
  • Asia/Kuala_Lumpur
  • Asia/Kuching
  • Asia/Kuwait
  • Asia/Macao
  • Asia/Macau
  • Asia/Magadan
  • Asia/Makassar
  • Asia/Manila
  • Asia/Muscat
  • Asia/Nicosia
  • Asia/Novosibirsk
  • Asia/Omsk
  • Asia/Oral
  • Asia/Phnom_Penh
  • Asia/Pontianak
  • Asia/Pyongyang
  • Asia/Qatar
  • Asia/Qyzylorda
  • Asia/Rangoon
  • Asia/Riyadh
  • Asia/Riyadh87
  • Asia/Riyadh88
  • Asia/Riyadh89
  • Asia/Saigon
  • Asia/Sakhalin
  • Asia/Samarkand
  • Asia/Seoul
  • Asia/Shanghai
  • Asia/Singapore
  • Asia/Taipei
  • Asia/Tashkent
  • Asia/Tbilisi
  • Asia/Tehran
  • Asia/Tel_Aviv
  • Asia/Thimbu
  • Asia/Thimphu
  • Asia/Tokyo
  • Asia/Ujung_Pandang
  • Asia/Ulaanbaatar
  • Asia/Ulan_Bator
  • Asia/Urumqi
  • Asia/Vientiane
  • Asia/Vladivostok
  • Asia/Yakutsk
  • Asia/Yekaterinburg
  • Asia/Yerevan
  • Atlantic/Azores
  • Atlantic/Bermuda
  • Atlantic/Canary
  • Atlantic/Cape_Verde
  • Atlantic/Faeroe
  • Atlantic/Faroe
  • Atlantic/Jan_Mayen
  • Atlantic/Madeira
  • Atlantic/Reykjavik
  • Atlantic/South_Georgia
  • Atlantic/St_Helena
  • Atlantic/Stanley
  • Australia/ACT
  • Australia/Adelaide
  • Australia/Brisbane
  • Australia/Broken_Hill
  • Australia/Canberra
  • Australia/Currie
  • Australia/Darwin
  • Australia/Eucla
  • Australia/Hobart
  • Australia/LHI
  • Australia/Lindeman
  • Australia/Lord_Howe
  • Australia/Melbourne
  • Australia/NSW
  • Australia/North
  • Australia/Perth
  • Australia/Queensland
  • Australia/South
  • Australia/Sydney
  • Australia/Tasmania
  • Australia/Victoria
  • Australia/West
  • Australia/Yancowinna
  • Brazil/Acre
  • Brazil/DeNoronha
  • Brazil/East
  • Brazil/West
  • CET
  • CST6CDT
  • Canada/Atlantic
  • Canada/Central
  • Canada/East-Saskatchewan
  • Canada/Eastern
  • Canada/Mountain
  • Canada/Newfoundland
  • Canada/Pacific
  • Canada/Saskatchewan
  • Canada/Yukon
  • Chile/Continental
  • Chile/EasterIsland
  • Cuba
  • EET
  • EST
  • EST5EDT
  • Egypt
  • Eire
  • Etc/GMT
  • Etc/GMT+0
  • Etc/GMT+1
  • Etc/GMT+10
  • Etc/GMT+11
  • Etc/GMT+12
  • Etc/GMT+2
  • Etc/GMT+3
  • Etc/GMT+4
  • Etc/GMT+5
  • Etc/GMT+6
  • Etc/GMT+7
  • Etc/GMT+8
  • Etc/GMT+9
  • Etc/GMT-0
  • Etc/GMT-1
  • Etc/GMT-10
  • Etc/GMT-11
  • Etc/GMT-12
  • Etc/GMT-13
  • Etc/GMT-14
  • Etc/GMT-2
  • Etc/GMT-3
  • Etc/GMT-4
  • Etc/GMT-5
  • Etc/GMT-6
  • Etc/GMT-7
  • Etc/GMT-8
  • Etc/GMT-9
  • Etc/GMT0
  • Etc/Greenwich
  • Etc/UCT
  • Etc/UTC
  • Etc/Universal
  • Etc/Zulu
  • Europe/Amsterdam
  • Europe/Andorra
  • Europe/Athens
  • Europe/Belfast
  • Europe/Belgrade
  • Europe/Berlin
  • Europe/Bratislava
  • Europe/Brussels
  • Europe/Bucharest
  • Europe/Budapest
  • Europe/Chisinau
  • Europe/Copenhagen
  • Europe/Dublin
  • Europe/Gibraltar
  • Europe/Guernsey
  • Europe/Helsinki
  • Europe/Isle_of_Man
  • Europe/Istanbul
  • Europe/Jersey
  • Europe/Kaliningrad
  • Europe/Kiev
  • Europe/Lisbon
  • Europe/Ljubljana
  • Europe/London
  • Europe/Luxembourg
  • Europe/Madrid
  • Europe/Malta
  • Europe/Mariehamn
  • Europe/Minsk
  • Europe/Monaco
  • Europe/Moscow
  • Europe/Nicosia
  • Europe/Oslo
  • Europe/Paris
  • Europe/Podgorica
  • Europe/Prague
  • Europe/Riga
  • Europe/Rome
  • Europe/Samara
  • Europe/San_Marino
  • Europe/Sarajevo
  • Europe/Simferopol
  • Europe/Skopje
  • Europe/Sofia
  • Europe/Stockholm
  • Europe/Tallinn
  • Europe/Tirane
  • Europe/Tiraspol
  • Europe/Uzhgorod
  • Europe/Vaduz
  • Europe/Vatican
  • Europe/Vienna
  • Europe/Vilnius
  • Europe/Volgograd
  • Europe/Warsaw
  • Europe/Zagreb
  • Europe/Zaporozhye
  • Europe/Zurich
  • Factory
  • GB
  • GB-Eire
  • GMT
  • GMT+0
  • GMT-0
  • GMT0
  • Greenwich
  • HST
  • Hongkong
  • Iceland
  • Indian/Antananarivo
  • Indian/Chagos
  • Indian/Christmas
  • Indian/Cocos
  • Indian/Comoro
  • Indian/Kerguelen
  • Indian/Mahe
  • Indian/Maldives
  • Indian/Mauritius
  • Indian/Mayotte
  • Indian/Reunion
  • Iran
  • Israel
  • Jamaica
  • Japan
  • Kwajalein
  • Libya
  • MET
  • MST
  • MST7MDT
  • Mexico/BajaNorte
  • Mexico/BajaSur
  • Mexico/General
  • Mideast/Riyadh87
  • Mideast/Riyadh88
  • Mideast/Riyadh89
  • NZ
  • NZ-CHAT
  • Navajo
  • PRC
  • PST8PDT
  • Pacific/Apia
  • Pacific/Auckland
  • Pacific/Chatham
  • Pacific/Easter
  • Pacific/Efate
  • Pacific/Enderbury
  • Pacific/Fakaofo
  • Pacific/Fiji
  • Pacific/Funafuti
  • Pacific/Galapagos
  • Pacific/Gambier
  • Pacific/Guadalcanal
  • Pacific/Guam
  • Pacific/Honolulu
  • Pacific/Johnston
  • Pacific/Kiritimati
  • Pacific/Kosrae
  • Pacific/Kwajalein
  • Pacific/Majuro
  • Pacific/Marquesas
  • Pacific/Midway
  • Pacific/Nauru
  • Pacific/Niue
  • Pacific/Norfolk
  • Pacific/Noumea
  • Pacific/Pago_Pago
  • Pacific/Palau
  • Pacific/Pitcairn
  • Pacific/Ponape
  • Pacific/Port_Moresby
  • Pacific/Rarotonga
  • Pacific/Saipan
  • Pacific/Samoa
  • Pacific/Tahiti
  • Pacific/Tarawa
  • Pacific/Tongatapu
  • Pacific/Truk
  • Pacific/Wake
  • Pacific/Wallis
  • Pacific/Yap
  • Poland
  • Portugal
  • ROC
  • ROK
  • Singapore
  • Turkey
  • UCT
  • US/Alaska
  • US/Aleutian
  • US/Arizona
  • US/Central
  • US/East-Indiana
  • US/Eastern
  • US/Hawaii
  • US/Indiana-Starke
  • US/Michigan
  • US/Mountain
  • US/Pacific
  • US/Pacific-New
  • US/Samoa
  • UTC
  • Universal
  • W-SU
  • WET
  • Zulu

Cambiar tamaño de fuente al reducir la ventana (HTML / CSS)

Cambiar el tamaño del texto a medida que se reduce el tamaño de la ventana (HTML5 / CSS3)   . container { border : solid 1px blue ; ...