Funciones de comprobación de datos

En esta lección se comentan una serie de familias de funciones que permiten comprobar la existencia, el tipo o el contenido de un dato:

Funciones de comprobación para la comprobación de formularios

En la lección de Comprobación de datos provenientes de un formulario aprovecharemos dos de las funciones comentadas en esta página:

Funciones is_

Las funciones is_ son un conjunto de funciones booleanas que devuelven true si el argumento es de un tipo de datos determinado y false si no lo son.

Función Tipo de datos alias (funciones equivalentes)
existencia isset($valor) devuelve si el dato está definido o no
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 u otra; si el argumento es una cadena la función devuelve true si los números están expresados en notación decimal, exponencial u octal, pero devuelve false si los números están expresados en notación hexadecimal o binaria).
is_int($valor) entero is_integer($valor), is_long($valor)
is_float($valor) float is_double($valor)
cadenas is_string($valor) cadena
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
is_countable($valor) contable (matriz u objeto que implementa Countable)
is_iterable($valor) iterable (matriz u objeto que implementa Traversable)

Si un dato es demasiado grande para el tipo de variable, las funciones devolverán false. Por ejemplo, si se usa como argumento un entero mayor que PHP_INT_MAX (2147483647 en Windows), la función is_int() devolverá false.


Estas funciones son en general de poca utilidad con datos provinientes de un formulario, ya que estas funciones lo que comprueban es el tipo de los datos y la información que llega de un formulario es siempre del tipo cadena. Las dos excepciones serían:

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

<?php
$dato = recoge("dato");

if ($dato == "") {
    print "  <p>No ha escrito nada.</p>\n";
    print "\n";
} elseif (!is_numeric($dato)) {
    print "  <p>NO ha escrito un número: <strong>$dato</strong>.</p>\n";
    print "\n";
} else {
    print "  <p>Ha escrito un número: <strong>$dato</strong>.</p>\n";
    print "\n";
}
?>
Enlace a ejemplo

El siguiente formulario permite comprobar el resultado de las funciones is_ aplicadas a un dato recibido de un formulario. Como los datos que se reciben de un formulario son de tipo cadena, casi todas las funciones devuelven el resultado false, y resultan inútiles en este contexto.

Enlace a ejemplo

Funciones ctype_

Las funciones ctype_ son un conjunto de funciones booleanas que devuelven si todos los caracteres de una cadena son de una categoría determinada, 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) dígitos
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($valor) dígitos hexadecimales

Estas funciones se pueden aplicar a los datos recibidos de un formulario ya que estas funciones trabajan con cadenas. El problema es que normalmente en una cadena se encuentran caracteres de distintas categorías (letras, números, espacios, puntuación, etc.) y en ese caso estas funciones devuelven el resultado false. Quizás la más útil es:

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

<?php
$dato = recoge("dato");

if ($dato == "") {
    print "  <p>No ha escrito nada.</p>\n";
    print "\n";
} elseif (!ctype_digit($dato)) {
    print "  <p>NO ha escrito un entero positivo: <strong>$dato</strong>.</p>\n";
    print "\n";
} else {
    print "  <p>Ha escrito un entero positivo: <strong>$dato</strong>.</p>\n";
    print "\n";
}
?>
Enlace a ejemplo

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

Enlace a ejemplo

Funciones filter_

Las funciones filter se crearon como extensión PECL, pero se incluyeron en PHP 5.2 (2006).

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 de validación son los siguientes:

Filtro Tipo de datos
FILTER_VALIDATE_BOOL
FILTER_VALIDATE_BOOLEAN
booleano
FILTER_VALIDATE_INT entero
FILTER_VALIDATE_FLOAT float
FILTER_VALIDATE_REGEXP expresión regular
FILTER_VALIDATE_DOMAIN dominio web
FILTER_VALIDATE_URL URL no internacionalizada
FILTER_VALIDATE_EMAIL dirección de correo
FILTER_VALIDATE_IP dirección IP
FILTER_VALIDATE_MAC dirección MAC física

En el caso de las funciones anteriores (funciones is_ y funciones ctype_) estas se pueden utilizar directamente en las condiciones de los bloques if ... elseif ... else ... puesto que devuelven un valor lógico. En el caso de la función filter_var() esta únicamente devuelve un valor lógico cuando el valor no pasa el filtro. Cuando el valor sí que pasa el filtro, la función devuelve el propio valor.

Por ello resulta aconsejable hacer una comparación de tipo con el valor false para detectar que el valor no ha pasado el filtro, como muestra el siguiente ejemplo.

<?php
$dato = recoge("dato");

if ($dato == "") {
    print "  <p>No ha escrito nada.</p>\n";
    print "\n";
} elseif (filter_var($dato, FILTER_VALIDATE_INT) === false) {
    print "  <p>NO ha escrito un número entero: <strong>$dato</strong>.</p>\n";
    print "\n";
} else {
    print "  <p>Ha escrito un número entero: <strong>$dato</strong>.</p>\n";
    print "\n";
}
?>
Enlace a ejemplo

El caso del filtro FILTER_VALIDATE_BOOLEAN es especial porque en este caso cuando el valor pase el filtro sí que será un valor lógico (que puede ser false), por lo que la detección debe ser distinta.

Falta ejemplo


El siguiente formulario permite comprobar el resultado de la función filter_var() con diferentes filtros aplicada a un dato recibido de un formulario.

Enlace a ejemplo

Nota: FILTER_VALIDATE_REGEXP no está incluido en el ejemplo anterior porque requiere una expresión regular con la que comprobar el argumento enviado.

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>\n"; } else { print "<p>NO ha escrito un número entero.</p>\n"; } } else { print "<p>La función <strong>filter_var</strong> " . "no está disponible en este servidor.</p>\n"; } ?>
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.

Expresiones regulares

Las expresiones regulares se explican en otra lección.