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:
En la lección de Comprobación de datos provenientes de un formulario aprovecharemos dos de las funciones comentadas en esta página:
Para comprobar si el dato que se ha recibido es un número (o se puede interpretar como número) se debe utilizar la función is_numeric($valor). Esta función lógica devuelve true si el argumento se puede interpretar como número y false si no lo es.
El motivo por el que se debe utilizar la función is_numeric($valor), es que lo que se recibe a través de un formulario se guarda siempre como cadena (aunque sea un número). La función is_numeric($valor) es la única que comprueba si el argumento se puede interpretar como número (aunque el argumento sea de tipo cadena), las funciones is_int($valor) o is_float($valor) hacen solamente comprobaciones sobre el tipo de los datos y devolverían siempre false.
Para comprobar si el dato que se ha recibido es un número entero positivo (sin decimales) se puede utilizar la función ctype_digit($valor). Esta función lógica devuelve true si todos los caracteres del argumento son dígitos (0, 1, ..., 9) y false si no lo son.
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";
}
?>
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.
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";
}
?>
El siguiente formulario permite comprobar el resultado de las funciones ctype_ aplicadas a un dato recibido de un formulario.
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";
}
?>
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.
Nota: FILTER_VALIDATE_REGEXP no está incluido en el ejemplo anterior porque requiere una expresión regular con la que comprobar el argumento enviado.
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.
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.
Las expresiones regulares se explican en otra lección.