PHP

Introducción

PHP es un lenguaje script de propósito general especialmente diseñado para el desarrollo Web. Es rápido, flexible y pragmático; PHP hace desde un blog hasta los sitios de Internet más populares del mundo.

PHP es el acrónimo de "PHP Hypertext Preprocessor". PHP es utilizado mundialmente utilizado, es de código abierto y una alternativa eficiente a competidores como ASP de Microsoft.

PHP es un lenguaje de script "del lado del servidor", es decir, los scripts escritos se ejecutan en el servidor y éste devuelve el resultado de dicha ejecución. Por esta razón es que los clientes que ingresen a un sitio Web que contenga scripts en PHP no necesitan un software especial en su computadora.

El sitio Web php.net contiene la última versión del software, además de toda la documentación del lenguaje en varios idiomas.

Para utilizar PHP hay varias opciones:

Sintaxis de PHP

Sintaxis Básica

El código PHP puede escribirse en cualquier parte de un documento HTML con las etiquetas correspondientes. El código PHP inicia con <?php y termina con ?>.

Ejemplo 1. Hola mundo en PHP


  <!DOCTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
      <title>Mi primer PHP</title>
    </head>
    <body>
      <h1>Mi primer PHP.</h1>
      <p>Ésto es HTML.</p>
      <?php
      echo "<p>Hello World!.</p>";
      echo "<p>Ésto es HTML desde PHP.</p>";
      ?>
    </body>
  </html>
      

Comentarios en PHP

Todas las líneas en PHP deben terminar con ; excepto la última, ya que la etiqueta de finalización de ?> implica un punto y coma. A pesar de ésto, se recomienda finalizar todas las líneas con ;.

Los comentarios en PHP se pueden hacer por línea con // o bien con #, todos los caracteres posteriores a cualquiera de estos símbolos serán ignorados por el intérprete. Todas las líneas que se encuentren entre /* y */ también se ignorarán por el intérprete.

Ejemplo 2. Comentarios en PHP


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        // Comentario de una sola línea
        # Éste también comenta una sola línea
        /*  Éste comenta
            múltiples
            líneas         */
      ?>
    </body>
  </html>
      

Sensibilidad a Mayúsculas

En PHP las funciones definidas por el usuario, clases y palabras clave no son sensibles a mayúsculas. Sin embargo, las variables si son sensibles a mayúsculas.

Ejemplo 3. Las funciones, clases y palabras clave no son sensibles a mayúsculas


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        ECHO "Hola Mundo!<br>";
        echo "Hola Mundo!<br>";
        EcHo "Hola Mundo!<br>";
      ?>
    </body>
  </html>
      

Ejemplo 4. Las variables son sensibles a mayúsculas


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $color="red";
        echo "My car is " . $color . "<br>";
        echo "My house is " . $COLOR ."<br>";
        echo "My boat is " . $coLOR ."<br>";
      ?>
    </body>
  </html>
      

Variables

Declaración

Las variables son contenedores abstractos de datos que se convierten cuando es necesario y no necesitan ser declaradas. Una variable es creada en el momento que se le asigna un valor por primera vez.

Ejemplo 5. Declaración de variables


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $txt="Hola mundo!";
        $x=5;
        $y=10.5;
        $z = $x + $y;
        echo $txt;
        echo "<br>";
        echo $x;
        echo "<br>";
        echo $y;
        echo "<br>";
        echo $z;
      ?>
    </body>
  </html>
      

En PHP las variables pueden ser "declaradas" en cualquier lugar del script, sin embargo se recomienda hacerlo al inicio, con la finalidad de tener un código más ordenado.

Ámbito de las Variables

El ámbito de una variable es la parte del script donde puede ser utilizada o referenciada. PHP tiene tres tipos de ámbitos.

Ámbito Local y Global

Una variable declarada fuera de una función tiene ámbito global y sólo puede ser accesada fuera de la función. Una variable declarada dentro de una función tiene ámbito local y sólo puede ser accesada por esa función.

Ejemplo 6. Ámbito de las variables


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Ámbito de las variables</title>
  </head>
  <body>
    <?php
      $x=5; // ámbito global
      function myTest() {
        $y=10; // ámbito local
        echo "<p>Variables de prueba dentro de una función:<p>";
        echo "Variable x es: $x";
        echo "<br>";
        echo "Variable y es: $y";
      }
      myTest();
      echo "<p>Variables de prueba fuera de una función:<p>";
      echo "Variable x es: $x";
      echo "<br>";
      echo "Variable y es: $y";
    ?>
  </body>
</html>
      

La palabra clave global

La palabra clave global se utiliza para acceder a variables globales desde el interior de una función. Para hacer esto se antepone la palabra global al nombre de la variable.

Ejemplo 7. Variables Globales


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $x=5;
        $y=10;
        function myTest() {
          global $x,$y;
          $y=$x+$y;
        }
        myTest();  // función
        echo $y;   // Nuevo valor de y
      ?>
    </body>
  </html>
      

Variables Estáticas

Típicamente cuando una función termina su ejecución todas las variables contenidas en ella son borradas, sin embargo algunas veces es necesario mantenerlas. Para ésto se antepone la palabra clave static al nombre de la variable la primera vez que se utilice.

Ejemplo 8. Variable estática


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        function myTest() {
          static $x=0;
          echo $x;
          $x++;
        }
        myTest();
        echo "<br>";
        myTest();
        echo "<br>";
        myTest();
        echo "<br>";
        myTest();
        echo "<br>";
        myTest();
      ?>
    </body>
  </html>
      

Cada vez que la variable es llamada, contendrá la información de la última vez que fue utilizada. A pesar de esto, la variable seguirá siendo local.

Sentencia Echo y Print

En PHP existen dos formas de imprimir contenido: echo y print, sin embargo existen algunas diferencias entre ellas:

Ambas sentencias pueden utilizarse o no con paréntesis.

Ejemplo 9. Sentencia echo


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        echo "<h2>PHP is fun!</h2>";
        echo "Hello world!<br>";
        echo "I'm about to learn PHP!<br>";
        echo "This", " string", " was", " made", " with multiple parameters.<br>";
        echo "<h2>PHP</h2>";
        $txt1="Learn PHP";
        $txt2="W3Schools.com";
        $cars=array("Volvo","BMW","Toyota");
        echo $txt1;
        echo "<br>";
        echo "Study PHP at $txt2";
        echo "<br>";
        echo "My car is a {$cars[0]}";
      ?>
    </body>
  </html>
      

Ejemplo 10. Sentencia print


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        print "<h2>PHP is fun!</h2>";
        print "Hello world!<br>";
        print "I'm about to learn PHP!";
        print "<h2>PHP</h2>";
        $txt1="Learn PHP";
        $txt2="W3Schools.com";
        $cars=array("Volvo","BMW","Toyota");
        print $txt1;
        print "<br>";
        print "Study PHP at $txt2";
        print "<br>";
        print "My car is a {$cars[0]}";
      ?>
    </body>
  </html>
      

Tipos de Datos

Aunque las variables son contenedores abstractos si pueden tener un tipo de dato. Los tipos de datos que hay en PHP son String, Integer, Floating, Boolean, Array, Object y Null.

Cadenas

Una cadena es una serie de caracteres. Una cadena puede ser cualquier texto dentro de comillas sencillas o dobles.


        <?php
          $x = "Hello world!";
          echo $x;
          echo "<br>";
          $x = 'Hello world!';
          echo $x;
        ?>
      

Enteros

Un entero es un número sin decimales. La función de PHP var_dump() devuelve el tipo de dato y el valor de la variable recibida.


  <?php
    $x = 5985;
    var_dump($x);
    echo "<br>";
    $x = -345; // negative number
    var_dump($x);
    echo "<br>";
    $x = 0x8C; // hexadecimal number
    var_dump($x);
    echo "<br>";
    $x = 047; // octal number
    var_dump($x);
  ?>
      

Flotantes

Un número flotante es un número con punto decimal o bien un número en forma exponencial (notación científica).


  <?php
    $x = 10.365;
    var_dump($x);
    echo "<br>";
    $x = 2.4e3;
    var_dump($x);
    echo "<br>";
    $x = 8E-5;
    var_dump($x);
  ?>
      

Booleanos

Los booleanos sólo pueden ser TRUE o FALSE. Son típicamente utilizados en pruebas condicionales.


  $x=true;
  $y=false;
      

Arreglos

Un arreglo almacena múltiples valores en una sola variable.

Ejemplo 11. Arreglos en PHP


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $cars=array("Volvo","BMW","Toyota");
        var_dump($cars);
      ?>
    </body>
  </html>
      

Objetos

Un objeto es un tipo de dato que almacena datos e información y la forma en como serán procesados. Los objetos deben ser explícitamente declarados con la palabra clave class.

Ejemplo 12. Creación de un Objeto y métodos


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        class Car {
            var $color;
            function Car($color="green") {
                $this->color = $color;
            }
            function what_color() {
                return $this->color;
            }
        }
        function print_vars($obj) {
           foreach (get_object_vars($obj) as $prop => $val) {
             echo "\t$prop = $val\n";
           }
        }
        // instantiate one object
        $herbie = new Car("white");
        // show herbie properties
        echo "\herbie: Properties\n";
        print_vars($herbie);
      ?>
    </body>
  </html>
      

NULL

El tipo de dato Null representa que una variable no tiene un valor. El único valor posible de una variable nula es NULL. El valor NULL identifica si una variable está vacía o no. Es útil para diferenciar si algún campo en una base de datos está vacío o si tiene una cadena vacía.


  <?php
    $x="Hello world!";
    $x=null;
    var_dump($x);
  ?>
      

Operadores

Operadores aritméticos en PHP

En PHP se tienen los operadores aritméticos que existen en la mayoría de los lenguajes de programación de alto nivel.

Operador Nombre Ejemplo Resultado
+ Suma $x + $y Suma de $x y $y
- Resta $x - $y Resta de $x - $y
* Multiplicación $x * $y Producto de $x * $y
/ División $x / $y Cociente de $x / $y
% Módulo $x % $y Residuo de la división $x % $y

  <?php
    $x=10;
    $y=6;
    echo ($x + $y);    // outputs 16
    echo ($x - $y);    // outputs 4
    echo ($x * $y);    // outputs 60
    echo ($x / $y);    // outputs 1.6666666666667
    echo ($x % $y);    // outputs 4
  ?>
      

Operadores de Asignación

Asignación Equivalencia Descripción
x = y x = y Asignación al operador de la izquierda del valor del operador de la derecha
x += y x = x + y Suma
x -= y x = x - y Resta
x *= y x = x * y Multiplicación
x /= y x = x / y División
x %= y x = x % y Módulo

  <?php
    $x=10;
    echo $x; // outputs 10
    $y=20;
    $y += 100;
    echo $y; // outputs 120
    $z=50;
    $z -= 25;
    echo $z; // outputs 25
    $i=5;
    $i *= 6;
    echo $i; // outputs 30
    $j=10;
    $j /= 5;
    echo $j; // outputs 2
    $k=15;
    $k %= 4;
    echo $k; // outputs 3
  ?>
      

Operadores de cadenas

Operador Nombre Ejemplo Resultado
. Concatenación $txt1 = "Hello"
$txt2 = $txt1 . " world!"
$txt2 contiene "Hello world!"
.= Concatenación y asignación $txt1 = "Hello"
$txt1 .= " world!"
$txt1 contiene "Hello world!"

  <?php
    $a = "Hello";
    $b = $a . " world!";
    echo $b;   // outputs Hello world!
    $x="Hello";
    $x .= " world!";
    echo $x;  // outputs Hello world!
  ?>
      

Operadores de Incremento / Decremento

Operador Nombre Descripción
++$x Pre-incremento Incrementa $x en uno, luego devuelve $x
$x++ Post-incremento Devuelve $x, luego incrementa $x en uno
--$x Pre-decremento Decrementa $x en uno, luego devuelve $x
$x-- Post-decremento Devuelve $x, luego decrementa $x en uno

  <?php
    $x=10;
    echo ++$x;    // outputs 11
    $y=10;
    echo $y++;    // outputs 10
    $z=5;
    echo --$z;    // outputs 4
    $i=5;
    echo $i--;    // outputs 5
  ?>
      

Operadores de comparación

Operador Nombre Ejemplo Resultado
== Igual $x == $y Verdadero si $x es igual a $y
=== Idéntico $x === $y Verdadero si $x es igual a $y y si son del mismo tipo
!= Diferente $x != $y Verdadero si $x es diferente a $y
<> Diferente $x <> $y Verdadero si $x es diferente a $y
!== No idéntico $x !== $y Verdadero si $x no es igual a $y o bien si no son del mismo tipo
> Mayor que $x > $y Verdadero si $x es mayor que $y
< Menor que $x < $y Verdadero si $x es menor que $y
>= Mayor o igual que $x >= $y Verdadero si $x es mayor o igual que $y
<= Menor o igual que $x <= $y Verdadero si $x es menor o igual que $y

Sentencias Condicionales

Las sentencias condicionales se utilizan para realizar diferentes acciones dependiendo de diferentes condiciones.

If

La sentencia if se utiliza para ejecutar cierto código solamente si una condición específica es verdadera.

Sintaxis:


  if (condition) {
    code to be executed if condition is true;
  }
      

Ejemplo 13. Sentencia if


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $t=date("H");
        if ($t<"20") {
           echo "Have a good day!";
        }
      ?>
    </body>
  </html>
      

if - else

La sentencia if - else se utiliza para ejecutar cierto código si alguna condición es verdadera o algún otro código si la condición es falsa.

Sintaxis:


  if (condition) {
    code to be executed if condition is true;
  }
  else {
    code to be executed if condition is false;
  }
      

Ejemplo 14. Sentencia if - else


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $t=date("H");
        if ($t<"20") {
          echo "Have a good day!";
        }
        else {
          echo "Have a good night!";
        }
      ?>
    </body>
  </html>
      

if - elseif - else

La sentencia if - elseif - else se utiliza para seleccionar uno de varios bloques de código a ser ejecutado.

Sintaxis:


  if (condition) {
    code to be executed if condition is true;
  }
  elseif (condition) {
    code to be executed if condition is true;
  }
  else {
    code to be executed if condition is false;
  }
      

Ejemplo 15. Sentencia if - elseif - else


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $t=date("H");
        if ($t<"10") {
          echo "Have a good morning!";
        }
        elseif ($t<"20") {
          echo "Have a good day!";
        }
        else {
          echo "Have a good night!";
        }
      ?>
    </body>
  </html>
      

Ciclo While

Algunas veces cuando se escribe un programa, se necesita que cierto bloque de código se ejecute una y otra vez. En lugar de añadir varias líneas de código muy similar se puede utilizar un ciclo para realizar este tipo de tarea.

El ciclo while repite la ejecución de cierto bloque de código siempre y cuando la condición especificada sea verdadera.

Sintaxis:


  while (condition is true) {
    code to be executed;
  }
      

Ejemplo 16. Ciclo while


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        $x=1;
        while($x<=5) {
          echo "The number is: $x <br>";
          $x++;
        }
      ?>
    </body>
  </html>
      

Ciclo For

El ciclo for es utilizado cuando se sabe exactamente cuantas veces se debe repetir la ejecución de cierto código.

Sintaxis:


  for (init counter; test counter; increment counter) {
    code to be executed;
  }
      

Ejemplo 17. Ciclo For


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        for ($x=0; $x<=10; $x++) {
          echo "The number is: $x <br>";
        }
      ?>
    </body>
  </html>
      

Funciones

El verdadero poder de PHP está en las funciones, ya que posee más de 1000 funciones listas para utilizarse. Sin embargo, es posible crear nuestras propias funciones.

Una función es un fragmento de código que puede ser utilizado en varias ocasiones en el programa.

Sintaxis:


  function functionName() {
    code to be executed;
  }
      

El nombre de una función puede comenzar con cualquier letra o un guión bajo pero no con un número. Se recomienda nombrar una función por lo que hace.

Ejemplo 18. Una función recibe y devuelve parámetros.


  <!DOCTYPE html>
  <html>
    <body>
      <?php
        function sum($x,$y) {
          $z=$x+$y;
          return $z;
        }
        echo "5 + 10 = " . sum(5,10) . "<br>";
        echo "7 + 13 = " . sum(7,13) . "<br>";
        echo "2 + 4 = " . sum(2,4);
      ?>
    </body>
  </html>
      

Manejo de Formularios

Las variables superglobales $_GET y $_POST se utilizan para recolectar datos de un formulario.

Ejemplo 19. Formulario sencillo en HTML mediante $_POST

HTML


  <!DOCTYPE HTML>
  <html>
    <head>
      <title>Formulario en PHP</title>
      <meta charset="utf-8">
    </head>
    <body>
      <form action="welcome.php" method="post">
        Nombre: <input type="text" name="name"><br>
        E-mail: <input type="email" name="email"><br>
        <input type="submit">
      </form>
    </body>
  </html>
      

PHP


  <html>
    <body>
      Bienvenido <?php echo $_POST["name"]; ?><br>
      Su correo es: <?php echo $_POST["email"]; ?>
    </body>
  </html>
      

Cuando el usuario llena el formulario y presiona el botón de Submit, los datos del formulario son procesados a un archivo PHP llamado welcome.php. Los datos son enviados por el método HTTP POST.

Ejemplo 20. Formulario sencillo en HTML mediante $_GET

HTML


<!DOCTYPE HTML>
<html>
  <head>
    <title>Formulario en PHP</title>
    <meta charset="utf-8">
  </head>
  <body>
    <form action="welcome.php" method="get">
      Nombre: <input type="text" name="name"><br>
      E-mail: <input type="email" name="email"><br>
      <input type="submit">
    </form>
  </body>
</html>
      

PHP


  <html>
    <body>
      Bienvenido <?php echo $_GET["name"]; ?><br>
      Su correo es: <?php echo $_GET["email"]; ?>
    </body>
  </html>
      

El código en los ejemplos anteriores es muy simple, sin embargo falta lo más importante. Es necesario validar los datos del formulario para proteger el script de código malicioso.

GET vs. POST

Tanto GET como POST crean un arreglo que contiene pares de llaves y valor, donde las llaves son los nombres de los controles del formulario y los valores son los datos que ingresa el usuario en ellos.

$_GET es un arreglo que variables que son pasadas al script mediante parámetros en el URL.

$_POST es un arreglo de variables que son pasadas al script mediante el método HTTP POST.

Cuando utilizar GET

La información enviada por un formulario mediante el método GET es visible para todos, ya que todas las variables son desplegadas en la URL). Adicionalmente GET tiene una limitante en la cantidad de parámetros que se pueden enviar, que es de 2000 caracteres.

Dado que las variables son desplegadas en la URL, es posible marcar como favorita una página específica dentro de un sistema Web.

Éste método puede ser utilizado para enviar datos que no son críticos, nunca debe utilizarse para enviar contraseñas o algún tipo de información crítica.

Cuando utilizar POST

La información enviada por un formulario mediante el método POST es invisible para todos, todas las variables y su contenido son integrados dentro del cuerpo de la solicitud HTTP. Por otro lado, no tiene limitante en la cantidad de datos que se pueden enviar.

Dado que las las variables no son mostradas en la URL, no es posible guardar como favorita una página dentro de un sistema Web.

La mayoría de los desarrolladores prefieren utilizar el método POST para enviar datos.

Validación de Formularios con PHP

En esta sección haremos la validación de formularios que contengan campos de texto, botones radio y un botón de Enviar.

Las reglas de validación del formulario son las siguientes:

Campo Reglas de Validación Contenido
Nombre Requerido Sólo contiene letras y caracteres
Correo electrónico Requerido Debe contener una dirección válida.
Sitio Web Opcional Si se especifica alguno, debe contener una dirección válida.
Comentarios Opcional Campo multi-línea.
Género Requerido Debe seleccionarse alguno.

Ejemplo 21. Validación del formulario: evitando código malicioso

HTML + PHP


  <!DOCTYPE HTML>
  <html>
    <head>
      <title>Validación de Formulario en PHP</title>
      <meta charset="utf-8">
    </head>
    <body>
      <?php
        // define variables and set to empty values
        $name = $email = $gender = $comment = $website = "";
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
          $name = test_input($_POST["name"]);
          $email = test_input($_POST["email"]);
          $website = test_input($_POST["website"]);
          $comment = test_input($_POST["comment"]);
          $gender = test_input($_POST["gender"]);
        }
        function test_input($data) {
          $data = trim($data);
          $data = stripslashes($data);
          $data = htmlspecialchars($data);
          return $data;
        }
      ?>
      <h2>Ejemplo de validación de Formularios con PHP</h2>
      <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        Nombre: <input type="text" name="name">
        <br><br>
        E-mail: <input type="text" name="email">
        <br><br>
        Sitio Web: <input type="text" name="website">
        <br><br>
        Comentarios: <textarea name="comment" rows="5" cols="40"></textarea>
        <br><br>
        Género:
        <input type="radio" name="gender" value="female">Femenino
        <input type="radio" name="gender" value="male">Masculino
        <br><br>
        <input type="submit" name="submit" value="Submit">
      </form>
      <?php
        echo "<h2>Usted Ingresó:</h2>";
        echo $name;
        echo "<br>";
        echo $email;
        echo "<br>";
        echo $website;
        echo "<br>";
        echo $comment;
        echo "<br>";
        echo $gender;
      ?>
    </body>
  </html>
      

$_SERVER[“PHP_SELF”]

La variable superglobal $_SERVER[“PHP_SELF”] devuelve el nombre del archivo del script que se encuentra ejecutándose. De esta forma $_SERVER[“PHP_SELF”] envía los datos del formulario a la página misma, en lugar de dirigirse a una página diferente. De ésta forma el usuario recibirá un mensaje de error en la misma página donde se encuentra el formulario.

htmlspecialchars()

La función htmlspecialchars() convierte caracteres especiales a entidades HTML. Ésto significa que reemplaza caracteres como < y > por &lt; y &gt respectivamente. Esto previene que posibles atacantes puedan hacer "exploiting" en el código utilizando inyección de código HTML o JavaScript en los formularios.

Proteger el código los formularios con PHP

La variable $_SERVER["PHP_SELF"] puede ser utilizada por hackers si no se protege el código. Si PHP_SELF es utilizada en la página un usuario puede ingresar una diagonal / y luego algún código Cross Site Scripting que ejecutar.

La primer cosa que haremos es pasar las variables a través de la función htmlspecialchars(). Ésta función evitará que el usuario inyecte código JavaScript, por ejemplo:


  <script>location.href('http://www.hacked.com')</script>
      

Cuando el contenido del formulario se pasa a través de la función, se sustituyen caracteres especiales evitando así su ejecución:


  &lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;
      

De esta forma el código se desplegará sin ser ejecutado.

La función test_input hará la protección pertinente de los datos introducidos a través de los formularios:

  1. Quitar los espacios no necesarios con la función trim.

  2. Quitar las diagonales con la función stripslashes.

El primer if dentro del código verifica si $_SERVER["REQUEST_METHOD"] es igual a POST, lo cuál sólo será cierto una vez que el usuario haya presionado el botón Submit, cuando recién se ha cargado la página éste if será falso dado que el boton no ha sido presionado.

Validación de Formularios: Campos necesarios

Si se tiene un formulario en el que varios campos fueran necesarios para poder continuar. Antes del ejemplo anterior se especificó que en el formulario los campos Nombre, Correo Electrónico y Género son necesarios.

De ésta forma se tienen que agregar algunas variables que guardarán un posible error en caso de que algún campo requerido se encuentre vacío. También se agrega una validación en todas las variables $_POST para saber si se encuentran vacías. En caso de que la variable está vacía se almacena un mensaje de error en la variable correspondiente y si no lo están se envía su contenido a través de la función test_input().

Ejemplo 22. Validación del formulario: evitando código malicioso + campos requeridos.


  <!DOCTYPE HTML>
  <html>
    <head>
      <meta charset="utf-8">
      <title>Validación en PHP</title>
      <style>
        .error {color: #FF0000;}
      </style>
    </head>
    <body>
      <?php
        // Variables que contendrán un posible mensaje de error
        $nameErr = $emailErr = $genderErr = $websiteErr = "";
        // Variables que guardan el contenido de los campos del formulario
        $name = $email = $gender = $comment = $website = "";
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
          if (empty($_POST["name"])) {
            $nameErr = "Nombre necesario";
          } else {
            $name = test_input($_POST["name"]);
          }
          if (empty($_POST["email"])) {
            $emailErr = "Email necesario";
          } else {
            $email = test_input($_POST["email"]);
          }
            if (empty($_POST["website"])) {
            $website = "";
          } else {
            $website = test_input($_POST["website"]);
          }
          if (empty($_POST["comment"])) {
            $comment = "";
          } else {
            $comment = test_input($_POST["comment"]);
          }
          if (empty($_POST["gender"])) {
            $genderErr = "Genero necesario";
          } else {
            $gender = test_input($_POST["gender"]);
          }
        }
        function test_input($data) {
          $data = trim($data);
          $data = stripslashes($data);
          $data = htmlspecialchars($data);
          return $data;
        }
      ?>
      <h2>Ejemplo de Validación de Formularios con PHP</h2>
      <p><span class="error">* campo requerido.</span></p>
      <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        Name: <input type="text" name="name">
        <span class="error">* <?php echo $nameErr;?></span>
        <br><br>
        E-mail: <input type="text" name="email">
        <span class="error">* <?php echo $emailErr;?></span>
        <br><br>
        Website: <input type="text" name="website">
        <span class="error"><?php echo $websiteErr;?></span>
        <br><br>
        Comment: <textarea name="comment" rows="5" cols="40"></textarea>
        <br><br>
        Gender:
        <input type="radio" name="gender" value="female">Female
        <input type="radio" name="gender" value="male">Male
        <span class="error">* <?php echo $genderErr;?></span>
        <br><br>
        <input type="submit" name="submit" value="Submit">
      </form>
      <?php
        echo "<h2>Usted Ingresó:</h2>";
        echo $name;
        echo "<br>";
        echo $email;
        echo "<br>";
        echo $website;
        echo "<br>";
        echo $comment;
        echo "<br>";
        echo $gender;
      ?>
    </body>
  </html>
      

Validación del formulario: Validando contenido

El siguiente paso en la validación consiste en validar lo que ingresó el usuario, quitar espacios innecesarios en los campos, validar si la dirección de correo y la dirección web tienen el formato correcto.

Ejemplo 23. Validación de formularios: evitando código malicioso + campos requeridos + validación contenido.


  <!DOCTYPE HTML>
  <html>
    <head>
    <meta charset="utf-8">
    <title>Validación en PHP</title>
    <style>
      .error {color: #FF0000;}
    </style>
    </head>
    <body>
      <?php
        // Variables que contendrán un posible mensaje de error
        $nameErr = $emailErr = $genderErr = $websiteErr = "";
        // Variables que guardan el contenido de los campos del formulario
        $name = $email = $gender = $comment = $website = "";
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
          if (empty($_POST["name"])) {
            $nameErr = "Nombre necesario";
          } else {
            $name = test_input($_POST["name"]);
            // verificar si el nombre contiene solo letras y espacios
            if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
              $nameErr = "Solo se permiten letras y espacios en blanco";
            }
          }
          if (empty($_POST["email"])) {
            $emailErr = "Email necesario";
          } else {
            $email = test_input($_POST["email"]);
            // verificar si la direccion de correo es valida
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
              $emailErr = "Invalid email format";
            }
          }
          if (empty($_POST["website"])) {
            $website = "";
          } else {
            $website = test_input($_POST["website"]);
            // verifica si la URL es válida (la expresion regular también permite guiones en la URL)
            if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
              $websiteErr = "URL con capacidades diferentes";
            }
          }
          if (empty($_POST["comment"])) {
            $comment = "";
          } else {
            $comment = test_input($_POST["comment"]);
          }
          if (empty($_POST["gender"])) {
            $genderErr = "Genero necesario";
          } else {
            $gender = test_input($_POST["gender"]);
          }
        }
        function test_input($data) {
          $data = trim($data);
          $data = stripslashes($data);
          $data = htmlspecialchars($data);
          return $data;
        }
      ?>
      <h2>Ejemplo de Validación de Formularios con PHP</h2>
      <p><span class="error">* campo requerido.</span></p>
      <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        Nombre: <input type="text" name="name">
        <span class="error">* <?php echo $nameErr;?></span>
        <br><br>
        E-mail: <input type="text" name="email">
        <span class="error">* <?php echo $emailErr;?></span>
        <br><br>
        Website: <input type="text" name="website">
        <span class="error"><?php echo $websiteErr;?></span>
        <br><br>
        Comentario: <textarea name="comment" rows="5" cols="40"></textarea>
        <br><br>
        Género:
        <input type="radio" name="gender" value="femenino">Femenino
        <input type="radio" name="gender" value="masculino">Masculino
        <span class="error">* <?php echo $genderErr;?></span>
        <br><br>
        <input type="submit" name="submit" value="Submit">
      </form>
      <?php
        echo "<h2>Usted Ingresó:</h2>";
        echo $name;
        echo "<br>";
        echo $email;
        echo "<br>";
        echo $website;
        echo "<br>";
        echo $comment;
        echo "<br>";
        echo $gender;
      ?>
    </body>
  </html>
      

Validación de formulario: Mantener contenido de los campos

Sería deseable mantener el contenido de los campos del formulario si es el usuario ingresó no ingresó alguna información en el formato correcto. Para esto es necesario agregar código PHP dentro del atributo value en los campos deseados.


  value="?<?php echo $name;?>"
      

Ejemplo 24. Validación de formularios: evitando código malicioso + campos requeridos + validación contenido.


  <!DOCTYPE HTML>
  <html>
    <head>
      <meta charset="utf-8">
      <title>Validación en PHP</title>
      <style>
        .error {color: #FF0000;}
      </style>
    </head>
    <body>
      <?php
        // Variables que contendrán un posible mensaje de error
        $nameErr = $emailErr = $genderErr = $websiteErr = "";
        // Variables que guardan el contenido de los campos del formulario
        $name = $email = $gender = $comment = $website = "";
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
          if (empty($_POST["name"])) {
            $nameErr = "Nombre necesario";
          } else {
            $name = test_input($_POST["name"]);
            // verificar si el nombre contiene solo letras y espacios en blanco
            if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
              $nameErr = "Solo se permiten letras y espacios en blanco";
            }
          }
          if (empty($_POST["email"])) {
            $emailErr = "Email necesario";
          } else {
            $email = test_input($_POST["email"]);
            // verificar si la direccion de correo es valida
            if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
              $emailErr = "Formato de dirección inválido";
            }
          }
          if (empty($_POST["website"])) {
            $website = "";
          } else {
            $website = test_input($_POST["website"]);
            // verifica si la URL es válida (la expresion regular también permite guiones en la URL)
            if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
              $websiteErr = "URL con capacidades diferentes";
            }
          }
          if (empty($_POST["comment"])) {
            $comment = "";
          } else {
            $comment = test_input($_POST["comment"]);
          }
          if (empty($_POST["gender"])) {
            $genderErr = "Genero necesario";
          } else {
            $gender = test_input($_POST["gender"]);
          }
        }
        function test_input($data) {
          $data = trim($data);
          $data = stripslashes($data);
          $data = htmlspecialchars($data);
          return $data;
        }
      ?>
      <h2>Ejemplo de Validación de Formularios con PHP</h2>
      <p><span class="error">* campo requerido.</span></p>
      <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        Nombre: <input type="text" name="name" value="<?php echo $name;?>">
        <span class="error">* <?php echo $nameErr;?></span>
        <br><br>
        E-mail: <input type="text" name="email" value="<?php echo $email;?>">
        <span class="error">* <?php echo $emailErr;?></span>
        <br><br>
        Website: <input type="text" name="website" value="<?php echo $website;?>">
        <span class="error"><?php echo $websiteErr;?></span>
        <br><br>
        Comentario: <textarea name="comment" rows="5" cols="40"></textarea>
        <br><br>
        Genero:
        <input type="radio" name="gender"
        <?php if (isset($gender) && $gender=="femenino") echo "checked";?>
        value="femenino">Femenino
        <input type="radio" name="gender"
        <?php if (isset($gender) && $gender=="masculino") echo "checked";?>
        value="masculino">Masculino
        <span class="error">* <?php echo $genderErr;?></span>
        <br><br>
        <input type="submit" name="submit" value="Submit">
      </form>
      <?php
        echo "<h2>Usted Ingresó:</h2>";
        echo $name;
        echo "<br>";
        echo $email;
        echo "<br>";
        echo $website;
        echo "<br>";
        echo $comment;
        echo "<br>";
        echo $gender;
    ?>
    </body>
  </html>