Método GET, Método POST y Files PHP



En este nuevo capitulo de PHP aprenderemos como enviar información a un script PHP para que los sitios sean interactivos. Para este capítulo se necesita tener conocimientos básico de HTML y formularios, ya que los formularios será la principal manera de enviar la información al script.
Cuando creamos un sitio web y queremos enviar información que el usuario ha introducido utilizamos los métodos POST y GET. En teoría cada uno tiene su propósito específico y vamos aprender cuales son estos.
El usuario puede enviar información al servidor principalmente de dos maneras, mediante parámetros en enlaces HTML y por medio de los formularios. La primera solo sirve con el método GET, en cambio con los formularios se pueden utilizar las dos, aunque siempre es recomendable utilizar POST para enviar información desde un formulario. Vamos a ver ahora las características principales de cada uno y como manejarlos en PHP.

Get

Cuando enviamos datos con el método GET, estos son enviados en el URL y cuando la página que solicitamos termine de cargar estos datos serán visibles para el usuario. Veamos un ejemplo de esto:
<a href="http://localhost/pagina.php?categoria=ropa&producto=3">ver</a>
Observemos el URL, estamos llamando al PHP pagina.php y luego tenemos una serie de datos. Estos son los datos que estamos enviando al servidor por medio del método GET, esto se hace mediante un esquema nombre/valor. Todo lo que vaya después del signo de interrogación ? serán datos que se están enviando al servidor y para enviar varios los separamos con un signo &.
¿ Ahora como podemos obtener estos datos en nuestro escript PHP ? Pues con la variable global $_GET. PHP recibe estos datos y los convierte en un arreglo asociativo almacenado en $_GET.
<?php
$categoria = $_GET['categoria'];
$producto = $_GET['producto'];

echo "Selecciono el producto " . $producto . " de la categoría ". $categoria;

// Estos nos imprimirá en el navegador -> Selecciono el producto 3 de la categoría ropa
?>
Ahora vemos algunas características del método GET:
  • Produce una gran cadena de nombres/valores que se concatena al final del nombre de la página.
  • Tiene una longitud máxima de 2048 caracteres.
  • No es correcto pasar información sensible como claves por GET.
  • No sirve para enviar información binaria como documentos o documentos, solo aceptar caracteres ASCII.
  • La información enviada por GET es visible por todo el mundo.
También podemos enviar información por el método GET a través de un formulario HTML.
<form action="pagina.php" method="GET" >
  Categoria: <input type="text" name="name" />
      Producto:
          <select name="producto" >
              <option value="1"> Polo </option>
              <option value="2"> Quiksilver </option>
              <option value="3"> Tommy </option>
          </select >
  <input type="submit" value="Enviar" />

</form >
La variable $_GET tomara como clave para guardar los valores el nombre que se le de al dato con el parametro name en el HTML.

Post

Al contrario de GET, POST solo funciona enviando la información mediante formularios y no la muestra en el URL. La información que es enviada por POST va en el cuerpo de la solicitud HTTP y esta puede ir o no encriptada. Veamos un ejemplo de como manejar la información enviada por este método en PHP.
Primero creamos el formulario indicando que el método es POST.
<form action="pagina.php" method="POST" >
  Usuario: <input type="text" name="usuario" />
      Clave: <input type="password" name="clave" />
      <input type="submit" value="Enviar" />

</form >
Como podemos ver hay un campo contraseña, el cual seria muy inseguro pasar por GET y que alguien lo lograra ver en el URL.
Ahora creamos el script de PHP para recibir estos datos que introduce el usuario.
<?php
$usuario = $_POST['usuario'];
$clave = $_POST['clave'];
echo "Usuario " . $usuario . " y clave ". $clave;
?>
Como podemos ver obtenemos los datos de la misma manera que con el método GET, solo que ahora la variable se llama $_POST.
Ahora vemos algunas características del método POST:
  • No tiene ninguna restricción de tamaño.
  • Acepta caracteres ASCII y datos binarios.
  • Si se usa bajo el protocolo HTPPS entonces los datos vieja de manera segura.

Files

Para realizar el envío de datos binario como documentos o imágenes se hace mediante un formulario con el método POST, pero hay que especificarle al formulario que va a enviar datos binarios.
Veamos un ejemplo de esto :
<form enctype="multipart/form-data" action="pagina.php" method="POST" >
  Archivo: <input name="archivo" type="file" />
      <input type="submit" value="Enviar" />

</form >
Como podemos ver ahora en la etiqueta del form también agregamos enctype="multipart/form-data", lo cual dice al formulario que también va a enviar datos binarios. Podemos observar que de igual manera se utilizar POST, pero en el PHP que procesa los datos en vez de utilizar la variable $_POST se utiliza $_FILE. Todos los archivos con su información (ruta temporal, nombre, tamaño y tipo de archivo) se acceden mediante el arreglo asociativo $_FILE.
<?php
if ($_FILES["archivo"]["error"] > 0)
  {
  echo "Error: " . $_FILES["archivo"]["error"] . "<br />";
  }
else
  {
  echo "Nombre: " . $_FILES["archivo"]["name"] . "<br />";
  echo "Tipo: " . $_FILES["archivo"]["type"] . "<br />";
  echo "Tamaño: ". $_FILES["archivo"]["size"]  . "<br />";
  echo "Ruta: " . $_FILES["archivo"]["tmp_name"];
  }
?>

Formularios PHP


Ejemplo #1 Un formulario HTML sencillo
<form action="accion.php" method="post">
 <p>Su nombre: <input type="text" name="nombre" /></p>
 <p>Su edad: <input type="text" name="edad" /></p>
 <p><input type="submit" /></p>
</form>
No hay nada especial en este formulario. Es solamente un formulario HTML sin ninguna clase de etiqueta especial. Cuando el usuario rellena este formulario y oprime el botón de envío, se llama a la página accion.php. En este fichero se podría escribir algo así:
Ejemplo #2 Mostrar información de nuestro formulario
Hola <?php echo htmlspecialchars($_POST['nombre']); ?>.
Usted tiene <?php echo (int)$_POST['edad']; ?> años.
Un ejemplo del resultado de este script podría ser:
Hola José. Usted tiene 22 años.
Excepto las partes de htmlspecialchars() y de (int), debería ser obvio qué es lo que hace el código.htmlspecialchars() garantiza que cualquier carácter que sea especial en html se codifique adecuadamente, de manera que nadie pueda inyectar etiquetas HTML o Javascript en la página. El campo edad, ya que sabemos que es un número, podemos convertirlo a un valor de tipo integer que automáticamente se deshará de cualquier carácter no numérico. También se puede hacer lo mismo con PHP con la extensión filter. Las variables $_POST['nombre'] y $_POST['edad'] son establecidas automáticamente por PHP. Anteriormente hemos usado la superglobal $_SERVER; arriba introdujimos la superglobal $_POST, la cual contiene todos los datos de POST. Observe que el método de nuestro formulario es POST. Si hubiésemos usado el método GET, nuestra información estaría en su lugar en la superglobal $_GET. También se podría usar la superglobal $_REQUEST, si no le preocupa la fuente de los datos solicitados. Contiene toda la información de los datos de GET, POST y COOKIE mezclada.
Fecha y Hora en PHP: Date() PHP

Fecha y Hora en PHP: Date() PHP

Fecha y Hora en PHP

Las funciones de PHP en general están pensadas para ser usadas rápidamente, sin muchas complicaciones, para que el programador pueda hacer lo que desea en un instante. En el caso de mostrar la fecha esto se cumple, gracias a la función date podremos obtener la fecha actual en el formato deseado.
Por ejemplo:
<?php
echo date("d-m-Y H:i:s");
?>
Con lo que obtendremos el día y la hora (por ej: 05-06-2006 13:23:42). La 'd' significa el día, 'm' el mes, 'Y' el año, 'H' la hora, 'i' los minutos y 's' 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).
También puede ser que nos interese escribir caracteres y que la función date no los interprete, por ejemplo, si quisiéramos imprimir 05 del 06 del 2006 haríamos:
<?php
echo date("d \d\e\l m \d\e\l Y");
?>
Es decir, "escapamos" los caracteres que queramos imprimir.

Bucles en PHP

Tipos de Bucles

Existen 4 tipos de bucles para PHP, estos son:
  1. While
  2. Do...While
  3. For
  4. Foreach
Cada uno de ellos tiene su sintaxis y su uso específico. Cada uno estará explicado detalladamente luego.

While

Sintáxis:
 while (condición) sentencia;
Su funcionamiento es sencillo, ya que primero se evalúa que la condición sea verdadera y luego se ejecuta, hasta que la condición pase a ser falsa; una sentencia while (Español: Mientras) puede que no se ejecute ni siquiera una vez, si su condición es inicialmente falsa.
Veamos un ejemplo de su uso:
<?php
  $i = 1;
  while($i <= 3)  $i += 1;
  echo 'La variable $i vale: ' . $i ;
?>
Salida:
La variable $i vale: 4
Esta sintaxis de la instrucción while solo permite el uso de una sentencia dentro del bucle, en el ejemplo anterior la sentencia $i += 1 (ver Operadores) es la única que se repite.
Un bucle while puede contener varias sentencia, encerrándolas entre llaves ({}) o usando ésta sintaxis alternativa:
 while (condición): 
   sentencia; 
   sentencia;
   .
   .
   .
   sentencia; 
 endwhile;
Ejemplo con múltiples sentencias:
Sintaxis 1Sintaxis 2
<?php
 $i = 1;
 while($i <= 5):
   echo "\$i = $i" . "\n";
   $i += 1;
 endwhile;
?>
<?php
 $i = 1;
 while($i <= 5)
 {
   echo "\$i = $i" . "\n";
   $i += 1;
 } 
?>
Intentemos ahora un ejemplo más complicado.
<?php
 $i = 1; $mult_2_3 = 0; $mult_2 = 0; $mult_3 = 0;
 echo "Verifiquemos los múltiplos de 2 y 3 (del 1 al 10):\n";
 echo "--------------------------------------------------\n";
 while($i <= 10){
   if(($i % 2 == 0) AND ($i % 3 == 0) )
   { 
     echo "$i es múltiplo de 2 y de 3.\n";
     $mult_2_3 += 1;
   }elseif ($i % 2 == 0)
   {
     echo "$i es múltiplo de 2.\n";
     $mult_2 += 1;
   }elseif ($i % 3 == 0)
   {
     echo "$i es múltiplo de 3.\n";
     $mult_3 += 1;
   }else
   {
     echo "$i no es múltiplo de 2 ni de 3.\n";
   }
   $i += 1;  //ojo: esta línea es muy importante!!!
 } 
   echo "--------------------------------------------------\n";
   echo "Entre 1 y 10 hay: \n";
   echo "   * '$mult_2_3' múltiplos de 2 y 3.\n";
   echo "   * '$mult_2' múltiplos de 2.\n";
   echo "   * '$mult_3' múltiplos de 3.\n";
   echo "Los restantes '" . (10 - $mult_2_3 - $mult_2 - $mult_3) .
        "' números no son múltiplos ni de 2 ni de 3.\n";
?>
Salida:
Verifiquemos los múltiplos de 2 y 3 (del 1 al 10):
--------------------------------------------------
1 no es múltiplo de 2 ni de 3.
2 es múltiplo de 2.
3 es múltiplo de 3.
4 es múltiplo de 2.
5 no es múltiplo de 2 ni de 3.
6 es múltiplo de 2 y de 3.
7 no es múltiplo de 2 ni de 3.
8 es múltiplo de 2.
9 es múltiplo de 3.
10 es múltiplo de 2.
--------------------------------------------------
Entre 1 y 10 hay:
* '1' múltiplos de 2 y 3.
* '4' múltiplos de 2.
* '2' múltiplos de 3.
Los restantes '3' números no son múltiplos ni de 2 ni de 3.
Analicemos el ejemplo. La variable $i actúa como un contador indicándonos cuantas iteraciones han sido llevadas a cabo, además de ser usado para evaluar la condición de bucle while. Las variables $mult_2_3$mult_2 y $mult_3 son también contadores, pero estos nos indican, respectivamente, cuantos múltiplos de 2 y 3 (simultáneamente), solo de 2, y solo de 3 se han encontrado. Una vez completadas las 10 iteraciones se muestran los valores de estas tres variables y se calcula la cantidad de números que no son múltiplos ni de 2 ni de 3.


Antes de terminar con el bucle while debemos ocuparnos de dos asuntos importantes: los bucles infinitos y la interrupción de un bucle.
Los bucles infinitos son aquellos en que la condición a evaluar siempre es verdadera, por lo que las iteraciones nunca se detienen. Antes de ejecutar un fragmento de código que contenga un bucle (sea while,do...while o for), es importante asegurarse de que el bucle eventualmente se detendrá. En nuestro ejemplo con números primos la sentencia $i += 1 asegura que el contador $i aumente una unidad en cada iteración hasta alcanzar el valor 11, haciendo así falsa la condición con lo que se termina el bucle.
Aunque un bucle se termina cuando la condición se evalúa a falsa hay ocasiones en que necesitamos interrumpir el bucle abruptamente. La instrucción break (Español: Interrupción) interrumpe inmediatamente la ejecución del bucle y el control se pasa a la instrucción inmediatamente posterior al while. Veamos un último par de ejemplos usando break:
Usos de break
Para romper bucles infinitosPara interrumpir el bucle
 <?php 
  $n = 1;
  $i = 1;
  while(true){
    $i = $i + 1;
    $n = $n * $i;
    if ($n > 100) break;
  }
  echo "i = " . $i;
  echo "n = " . $n;
 ?>
Salida:
i = 5
n = 120
 <?php 
  $n = 1;
  $i = 50;
  $mensaje = "No hay múltiplos de 11 entre " .
             "50 y 100. (¿no hay?)";
  while($i < 100){
    if ($i % 11 == 0)
    {
      $mensaje = "El primer múltiplo de 11 " .
                 "entre 50 y 100 es: " . $i;
      break;
    }
    $i += 1;
  }
  echo $mensaje;
 ?>
Salida:
El primer múltiplo de 11 entre 50 y 100 es: 55

Do...While

Su uso es similar a while, pero aquí, las sentencias que siguen al do (Español: Hacer) se ejecutan por lo menos una vez y se comprueba la condición luego de la primera iteración; así, si es verdadera la condición se repite por segunda vez, si es falsa se continúa con las sentencias inmediatamente después de la instrucción while. Tiene sólo una sintáxis.
Sintáxis:
do {
  sentencia;
  sentencia;
  .
  .
  .
  sentencia;
} while (condición);
Todo lo explicado referente al bucle while se aplica también al do...while, sin embargo la principal diferencia con este es que el do...while siempre ejecuta al menos la primera iteración, mientras que en el while pudiera no ejecutar ninguna iteración, esto ocurre si la condición es falsa desde antes del inicio del bucle.
Un ejemplo con do...while:
 <?php
  $i = 5;
  $n = 1;
  do {
    $n = $n * $i;
    $i -= 1;
  }while($i > 1);
  echo "5! es igual a: " . $n
 ?>
Salida
5! es igual a: 120
Claro que, si cambiamos la primera instrucción por $i = 0 el bucle se ejecutará al menos una vez, pues la condición se evalúa al final, y dará la salida (errónea):
0! es igual a : 0
Al programar un bucle es importante reflexionar por un momento si nos conviene usar while o do...while: ¿necesitamos que se evalúe la condición antes de la primera iteración? ¿o el bucle debe entrar al menos una vez antes de evaluar la condición?

For

Los bucles for (Español: Para) son los más complejos en PHP (y en otros lenguajes de programación). Su sintaxis es la siguiente:
Sintáxis:
 for (inicialización; condición; actualización) sentencia;
Inicialización: Es una expresión que ejecuta una sola vez al inicio y predetermina el primer valor inicial, mas comúnmente asignado a una variable ejemplo:
:$i = 1;
Condición: Es una expresión que se evalúa como falsa o verdadera, si es falsa el bucle finaliza, en caso contrario el bucle ejecuta la sentencia ejemplo:
:$i <= 5;
Actualización: Es una expresión que modifica la expresión de inicialización comúnmente en incremento o decremento Ejemplo:
:$i += 1
Nota: Observe que en esta ultima expresión no lleva (;).
Completada así la primera iteración se vuelve a evaluar la segunda expresión, y si esta es verdadera se ejecuta nuevamente la sentencia, con esto se completa una segunda iteración. Las iteraciones continúan hasta que la segunda expresión sea evaluada a falso.
En resumen estas expresiones son la inicialización, donde se dá el valor inicial a la variable de control del bucle; la condición que inicia cada iteración solo si es evaluada a verdadero; y el actualización o paso que incrementa o decrementa la variable de control al final de cada iteración para garantizar que la condición eventualmente evalúe a falso. veamos ahora como se utiliza:
<?php
 for($i = 1; $i <= 5; $i += 1) echo $i . "\n";  
?>
Salida
1
2
3
4
5
Todas las expresiones de un bucle for pueden dejarse vacías, dejando al bucle iterar infinitamente, aunque en este caso suele interrumpirse con una sentencia break del mismo modo que se hace con el bucle while; Al igual que este último, tiene un par de sintaxis alternativas para múltiples sentencias:
Usado endforUsando corchetes
 for (1ªexpr; 2ªexpr; 3ªexpr): 
   sentencia;
   sentencia;
   .
   .
   .
   sentencia;
 endfor;
 for (1ªexpr; 2ªexpr; 3ªexpr)
  {
   sentencia;
   sentencia;
   .
   .
   .
   sentencia;
  }
Y continuemos ahora con un ejemplo de bucle for con múltiples sentencias:
<?php
 for($i = 2; $i <= 10; $i += 2)
 {
   echo "......................\n";
   //contando números pares
   echo "i vale: " . $i . "\n";
   //sus cuadrados
   echo "i^2: " . $i*$i . "\n";
   //y sus inversos
   echo "1/i: " . 1/$i . "\n";
   }
?>
y la salida
......................
i vale: 2
i^2: 4
1/i: 0.5
......................
i vale: 4
i^2: 16
1/i: 0.25
......................
i vale: 6
i^2: 36
1/i: 0.166666666667
......................
i vale: 8
i^2: 64
1/i: 0.125
......................
i vale: 10
i^2: 100
1/i: 0.1
Bueno, ya sabemos como crear dos tipos de bucles, los while (o do...while) y los for. Aunque puedes hacer codificar programas que hagan lo mismo con cualquiera de los bucles lo más lógico sería usar bucles while cuando no sabes el número de iteraciones que debes hacer (y la condición es del tipo ($respuesta == "Si")), y bucles for cuando si lo sabes (y la condición es del tipo ($X <= 10)).

Foreach

Introducido en PHP 4 es una solución fácil para trabajar con arreglos, muy semejante a Perl y otros lenguajes, funciona solo en arreglos y presentara un error al utilizar una variable con diferente tipo o no inicializada. Existen dos sintaxis la segunda opción en menor pero tiene mejor uso que la primera.
Sintáxis:
<p>foreach</p>
 foreac<html>
<body>h (expresión_arreglo as $valor)
     sentencia
 foreach (expresión_arreglo as $llave => $valor)
     sentencia
</body>
</html>
En la primera forma los ciclos sobre el arreglo están dados por expresión_arreglo. En cada ciclo, el valor del elemento actual se asigna internamente a $valor y el puntero interno del arreglo avanza en uno de tal forma que en el siguiente ciclo vera el siguiente elemento.
La segunda forma es la misma cosa, salvo que la clave del elemento actual se asigna a la variable $llave en cada bucle.
A partir de PHP 5, también es posible iterar objetos.
Nota: Cuando foreach inicia por primera vez su ejecución, el puntero interno del arreglo reinicia automáticamente en el primer elemento del arreglo. Esto significa que este necesita llamar a reset() antes de un blucle foreach.
Nota: A menos que el arreglo sea referenciado, foreach opera en una copia de el arreglo especifico y no en el propio arreglo. foreach tiene algunos efectos laterales en el puntero del arreglo. No se cuenta con un puntero del arreglo durante o después del foreach sin reiniciarlo.