# Comprobación de datos

Una vez recibido un dato normalmente es necesario comprobar si el dato es del tipo esperado (número, texto, etc.) para procesarlo sin error. PHP ofrece varios conjuntos de funciones para realizar estas comprobaciones. En esta lección se explican algunas de estas funciones:

## Funciones xxx_exists()

### Función function_exists()

La función booleana function_exists() devuelve si la función existe o no.

Algunas de las funciones que se comentan en esta página no existen en versiones antiguas de PHP que todavía se utilizan, por lo que puede ser conveniente comprobar si una función existe antes de utilizarla.

El ejemplo siguiente muestra el uso de la función function_exists().

Número: |
    <?php
    print "<pre>"; print_r($_REQUEST); print "</pre>\n";

    $numero = $_REQUEST['numero'];

    if (function_exists('filter_var')) {
        if (filter_var($numero, FILTER_VALIDATE_INT)) {
            print "<p>Ha escrito el número entero $numero.</p>";
        } else {
            print "<p>NO ha escrito un número entero.</p>";
        }
    } else {
        print "<p>La función <strong>filter_var</strong> "
            ."no está disponible en este servidor.</p>";
    }

    ?>
    Array (
        [numero] => 2.5
    )
La función filter_var no está disponible en este servidor.

### Función array_key_exists

La función booleana array_key_exists($indice, $matriz) devuelve si un elemento determinado de una matriz existe o no.

Para comprobar si existe un elemento de una matriz también se puede utilizar la función isset() comentada en el apartado siguiente.

Volver al principio de la página

## Funciones is_

Las funciones is_ son un conjunto de funciones booleanas que devuelven si el argumento es o no de un tipo de datos determinado

| Función | Tipo de datos | alias (funciones equivalentes)
--- | --- | --- | ---
existencia | isset($valor) | definida |
is_null($valor) | NULL |
números | is_bool($valor) | booleano |
is_numeric($valor) | número (puede tener signo, parte decimal y estar expresado en notación decimal, exponencial o hexadecimal). |
is_int($valor) | entero | is_integer($valor), is_long($valor)
is_float($valor) | float | is_double($valor), is_real($valor)
cadenas | is_string($valor) | cadena |
is_binary($valor) | cadena binaria (a partir de PHP 6) |
is_buffer($valor) | cadena unicode o binaria (a partir de PHP 6) |
is_unicode($valor) | cadena unicode (a partir de PHP 6) |
otros | is_scalar($valor) | escalar (entero, float, cadena o booleano) |
is_array($valor) | matriz |
is_callable($valor) | función |
is_object($valor) | object |
is_resource($valor) | recurso |

El ejemplo siguiente muestra el uso de la función is_numeric().

Número: |
    <?php
    print "<pre>"; print_r($_REQUEST); print "</pre>\n";

    $numero = $_REQUEST['numero'];

    if (is_numeric($numero)) {
        print "<p>Ha escrito el número $numero.</p>";
    } else {
        print "<p>NO ha escrito un número.</p>";
    }

    ?>
    Array (
        [numero] => cinco
    )
NO ha escrito un número.

Notas:

- Hay que tener en cuenta que si un dato es demasiado grande para el tipo de variable, las funciones devolverán FALSE . Por ejemplo, si se escribe un entero mayor que PHP_INT_MAX (2147483647 en Windows) la función is_int() devolverá FALSE .
- Las funciones is_numeric() e is_float() devuelven FALSE con valores provinientes de un formulario, aunque sean números.

Volver al principio de la página

## Funciones ctype_

Las funciones ctype_ son un conjunto de funciones booleanas que devuelven si todos los caracteres de una cadena son de un tipo determinado, de acuerdo con el juego de caracteres local. Estas funciones son las mismas que las que proporciona la biblioteca estándar de C ctype.h.

Función | Tipo de datos
--- | ---
ctype_alnum($valor) | alfanuméricos
ctype_alpha($valor) | alfabéticos (mayúsculas o minúsculas, con acentos, ñ, ç, etc)
ctype_cntrl($valor) | caracteres de control (salto de línea, tabulador, etc)
ctype_digit($valor) | digitos
ctype_graph($valor) | caracteres imprimibles (excepto espacios)
ctype_lower($valor) | minúsculas
ctype_print($valor) | caracteres imprimibles
ctype_punct($valor) | signos de puntuación (caracteres imprimibles que no son alfanuméricos ni espacios en blanco)
ctype_space($valor) | espacios en blanco (espacios, tabuladores, saltos de línea, etc)
ctype_upper($valor) | mayúsculas
ctype_xdigit($cvalor) | dígitos hexadecimales

El ejemplo siguiente muestra el uso de la función ctype_digit().

Número: |
    <?php
    print "<pre>"; print_r($_REQUEST); print "</pre>\n";

    $numero = $_REQUEST['numero'];

    if (ctype_digit($numero)) {
        print "<p>Ha escrito el número entero $numero.</p>";
    } else {
        print "<p>NO ha escrito un número entero.</p>";
    }

    ?>
    Array (
        [numero] => 2.5
    )
NO ha escrito un número entero.

Volver al principio de la página

## Funciones filter

Las funciones filter se crearon como extensión PECL, pero ya forman parte de PHP desde la versión 5.2 y ni siquiera es necesario activarlas en php.ini.

El manual de PHP trata las funciones filter de forma breve, pero en la web pueden encontrarse tutoriales más detallados, como http://devzone.zend.com/node/view/id/1113 o http://devolio.com/blog/archives/413-Data-Filtering-Using-PHPs-Filter-Functions-Part-one.html.

La función filter más simple es la función filter_var($valor [, $filtro [, $opciones]]), que devuelve los datos filtrados o FALSE si el filtro falla.

Los filtros predefinidos son los siguientes:

Filtro | Tipo de datos
--- | ---
FILTER_VALIDATE_INT | entero
FILTER_VALIDATE_BOOLEAN | booleano
FILTER_VALIDATE_FLOAT | float
FILTER_VALIDATE_REGEXP | expresión regular
FILTER_VALIDATE_URL | URL
FILTER_VALIDATE_EMAIL | dirección de correo
FILTER_VALIDATE_IP | IP

El ejemplo siguiente muestra el uso de la función filter_var().

Número: |
    <?php
    print "<pre>"; print_r($_REQUEST); print "</pre>\n";

    $numero = $_REQUEST['numero'];

    if (filter_var($numero, FILTER_VALIDATE_INT)) {
        print "<p>Ha escrito el número entero $numero.</p>";
    } else {
        print "<p>NO ha escrito un número entero.</p>";
    }

    ?>
    Array (
        [numero] => 2.5
    )
NO ha escrito un número entero.

Nota:

- La función filter_var() da FALSE si el argumento es 0.

Volver al principio de la página

## Expresiones regulares

Las expresiones regulares se explican en otra lección.

Volver al principio de la página

## Formulario para probar estas funciones

El siguiente formulario permite comprobar el resultado de las funciones anteriores aplicadas a un dato recibido.

Enlace a ejemplo Comprobación de datos

Notas:

- Tendría que mirar algunos casos particulares.
- No he puesto algunas funciones porque no forman parte de esta versión de PHP. Tendría que hacer que hiciera la comprobación y escribir el resultado o decir que la función no está disponible.
- FILTER_VALIDATE_REGEXP no está porque requiere la expresión regular

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.