Inicio ¿Sidebar? RSS @MisAlgoritmos at Twitter

¿Como filtrar información que llega desde un formulario con PHP?

Esta entrada sólo es para presumir un poco de mis ideas locas para el filtrado de datos que llegan desde algún formulario.

Lo que hago es obtener todos los campos mediante un arreglo donde especifico cada unos de los campos que deberán o deberían estar ahí, y después los dejo listos para ser filtrados o guardados.

Así de fácil, simple y rápido:

Primer paso: Preparo un arreglo con los campos que debo filtrar ya sea para verificar que no estén vacíos o que simplemente existan, y filtrarlos.

  1. $campos = array(
  2.    'tipo',
  3.    'descripcion'=>"<b>Por favor introduce una descripci&oacute;n. Este campo es necesarion",
  4.    'autor',
  5.    'nombre'=>"<p>Por favor, tu nombre es necesario. Escr&iacute;belo :)</p>n",
  6.    'url'
  7.    );

Imaginariamente (lógica o internamente en la aplicación) estoy formando una agrupación de los datos así:

CampoMensaje de error
tipo 
descripcion<b>Por favor introduce una descripción. Este campo es necesario</p>n
autor 
nombre<p>Por favor, tu nombre es necesario. Escríbelo :)</p>
url 

¿Que hago o para que me sirve este arreglo?

En la parte derecha tengo los nombres de los campos de los cuales suponemos que recibiremos información, y en la izquierda un mensaje de error en caso de que sea necesario mostrarlo al usuario que está enviándonos los datos.

  • Los campos que contienen vacía la columna mensaje de error, pueden o no existir en la entrada de datos desde el formulario (dicho con otras palabras: el usuario puede enviar vacío este campo.)
  • Los campos que si contienen un mensaje de error, deberán ser validados para forzar al usuario a que introduzca esta información.

Segundo paso: con el siguiente código, hago un recorrido por el arreglo en busca de cada uno de los campos y verifico que existan en _POST.

  1. foreach($campos as $k => $v){
  2.             if(isset($k[1])){//El campo deberá existir
  3.                if(!isset($_POST[$k]) or eregi('^ *$', $_POST[$k])){
  4.                      $error = true;
  5.                      echo $v;
  6.                   }else
  7.                      $$v = $_POST[$k];
  8.             }else{//puede o no existir el campo
  9.                if(isset($_POST[$v]))
  10.                   $$v = $_POST[$v];
  11.                      else
  12.                   $$v = '';
  13.             }
  14.          }

Estos son los 4 casos que se presentan, y la solución que les doy:

  1. No exista el campo, pero si haya mensaje de error: muestro mensaje de error.
  2. Exista el campo, pero esté vacío: muestro mensaje de error.
  3. No exista el campo, pero no haya mensaje de error: dejo la variable de salida vacía.
  4. Exista el campo, pero no haya mensaje de error: Asigno el dato a la variable.

Nota: Si esto no queda claro, sigue leyendo al ver el resultado podría ser que se entienda un poco mejor esto.

Dicho el paso anterior, la información está lista para usarse, y debe quedar almacenada en las variables:

  • $tipo
  • $descripcion
  • $autor
  • $nombre
  • $url

Claro que si quisiéramos utilizar un arreglo para los datos de salida en vez de utilizar variables independientes, sólo hacemos unos cuantos cambios en el código:

  1. foreach($campos as $k => $v){
  2.             if(isset($k[1])){//El campo deberá existir
  3.                if(!isset($_POST[$k]) or eregi('^ *$', $_POST[$k])){
  4.                      $error = true;
  5.                      echo $v;
  6.                   }else
  7.                      $campos[$v] = $_POST[$k];
  8.             }else{//puede o no existir el campo
  9.                if(isset($_POST[$v]))
  10.                   $campos[$v] = $_POST[$v];
  11.                      else
  12.                   $campos[$v] = '';
  13.             }
  14.          }

Y ahora obtenemos un resultado algo así:

  • $campos['descripcion']
  • $campos['autor']
  • $campos['nombre']
  • $campos['url']

Yo se que no es la gran cosa todo esto pero me ha ahorrado mucho tiempo y esfuerzo este pequeño script.

Si por favor, si. No olvides comentar!! Así que, por adelantado, gracias por tu comment, :P No seas malvado con mi código y apórtale alguna buena idea ;) Que aquí me tienes chambeando... :D

11 comentarios en ¿Como filtrar información que llega desde un formulario con PHP?

Edgar J. Suárez

Es una muy buena idea, simple pero poderosa :)

Aunque.... la verdad es que soy muy flojo y por eso me cambié de PHP a Rails[1] jeje.


[1] http://mimbles.net/articles/2007/09/24/validaciones-en-rails

Stan

Te estas aventando unos post's muy interesantes de un tiempo para aca, vere que se puede hacer :D

Victor De la Rocha

@<b>Edgar J. Suárez</b>: uff, yo mas flojo, por eso, no me cambio a rails :P ...

@<b>Stan</b>: Pues ánimo :D póngase a aprender :) ... Aquí estamos pa lo que se ofrezca.

Jesús

hola, que tal?? he estado leyendo un poco tus codigos y particularmente este, pero de verdad no entiendo mucho para que sirve. a ver segun pude entender quieres filtrar a que ninghun campo quede vacio verdad???? creo que eso es más facil con un javascript y aparte no te saca de la pagina, bueno todo esto en mi humilde opinión. cuando tenga mas tiempo seguire hechando un ojo en tu web quew en general esta muy buena para compartir conocimientos entre la comunidad de programadores

Victor De la Rocha

Hola Jesús, gracias por tu dejarme tu punto de vista.

Lo que trato de hacer con este código es filtrar, recibir o validar uno a uno los campos que recibo desde un formulario que entran en un documento.

Se me da mucho la situación de que cambio de campos una y otra vez debido a cuestiones de trabajo por lo que tengo que estar haciendo un movedero de pequeños bloques de código para validar cada uno de los campos.

Este código hace que yo no tenga que estar haciendo un pequeño bloque de código para validar (o recibir, filtrar) cada uno de los datos (o campos) y hacer todo de un solo golpe.

Hacerlo con JavaScript es una solución siempre y cuando esté activado el JavaScript en el navegador, pero y... ¿si no está activado? Todos los campos se van ir sin validar. Es por eso que considero hacerlo desde PHP :)

Gracias por dejar tu punto de vista, es muy bien bienvenido :D

Victor De la Rocha

uuh! la onda con estas funciones de PHP5 para el filtrado y validado de datos provenientes de alguna fuente insegura :D

http://www.php.net/manual/en/ref.filter.php

De lujo!! ;)

Juan Carlos

Ante todo mis disculpas por utilizar un comentario en un tema que no tiene nada que ver. Pero no encontré en el sitio un lugar de contacto. Agradecería me pudieras comentar como has logrado que en tu sabros.us se vean los thumbnails de los links. Desde ya muchas gracias.

Victor De la Rocha

Hola @<b>Juan Carlos</b>, no te preocupes, todo bien.

Para lograr que se vean los thumbnails, es necesario buscar en index.php al rededor de la línea 165, donde está algo como esto:

[php]echo "tt<img class="preview" src="http://www.webshotspro.com/thumb.php?url=".htmlspecialchars($row["enlace"])."" alt="".htmlspecialchars($row["title"])."" />";[/php]

y sustituirlo por esto:

[php]echo "tt<img class="preview" src="http://sabros.us/thumbs/?url=".htmlspecialchars($row["enlace"])."&size=T" alt="".htmlspecialchars($row["title"])."" />";[/php]

<del datetime="2007-12-14T01:50:59+00:00">Esta información la obtuve de los foros de sabrosus (<a href="http://sourceforge.net/forum/message.php?msg_id=4441794" rel="nofollow">Aquí</a>)</del> No es cierto, no recuerdo de donde la obtuve, sólo recuerdo que de alguna forma <a href="http://www.pecesama.net" rel="nofollow">Pedro Santana</a> tuvo que ver en esto :) ... De cualquier forma jé, esa es la solución :D

Victor De la Rocha

Si, buen punto. Antes deutilizar cualquier tipo de dato en una consulta sql o en un envío de emails hay que sanitizar los datos.

Para utilizar en consultas SQL utilizo una <a href="http://www.mis-algoritmos.com/2006/12/10/funcion-para-evitar-ataques-de-sql-injection/" title="sql_quote" rel="nofollow">función mas sencilla</a>:
[php]function sql_quote($value){
if(get_magic_quotes_gpc())
$value = stripslashes($value);

//check if this function exists
if(function_exists("mysql_real_escape_string"))
$value = mysql_real_escape_string( $value );
else//for PHP version < 4.3.0 use addslashes
$value = addslashes( $value );

return $value;
}[/php]

Para utilizarla, solo hay que aplicarle a la cadena a filtrar la función y listo.

[php]$password = sql_quote($_POST['password']);
$query = mysql_query("SELECT * FROM usuarios WHERE usuario='admin' AND password='$password');[/php]

Y para evitar la alteración de el funcionamiento normal de las funciones de envío de emails, realmente no tengo idea pero creo que al final de cuentas es lo mismo.

Para evitar eso siempre utilizo procedimientos para asegurarme de que el email al que enviaré la información "REALMENTE sea un email", y en cuanto a las cabeceras (o headers), no las verifico y ni tampoco permito al usuario que las modifique.

Algo así hago para el envío de emails, aunque ya tengo mi versión mejorada en algúna de mis aplicaciones que estoy trabajando, pero esta es la versión que tengo online y la pueden encontrar en el código de <a href="http://sabros.us" rel="nofollow">sabros.us.
[php]/// Funcion sacada de sabrosus, modificada por Victor Bracco...
function enviaMail($to, $title, $body, $from) {
$rp = trim($from);
$org = " sabros.us";
$mailer = "sabros.us Mailer";

$head = '';
$head .= "Content-Type: text/html rn";
$head .= "Date: ". date('r'). " rn";
$head .= "Return-Path: $rp rn";
$head .= "From: $from rn";
$head .= "Sender: $from rn";
$head .= "Reply-To: $from rn";
$head .= "Organization: $org rn";
$head .= "X-Sender: $from rn";
$head .= "X-Priority: 3 rn";
$head .= "X-Mailer: $mailer rn";

$body = str_replace("rn", "n", $body);
$body = str_replace("n", "rn", $body);
if(is_array($to)
{
for_each($to as $suscriptor)
{
@mail($to, $title, $body, $head);
}
} else {
@mail($to, $title, $body, $head);
}[/php]

Victor De la Rocha

uff, que apuro me está sacando este código en estos momentos... uff uff uff

fernando

Hola como estan un gran saludos a todos los que dan ayuda en este foro las gracis desde ya y por su tiempo… bueno tengo una pekeña pagina y quiero ayuda y que me oriente en algunas cosas no se alguien que pueda darmela, las gracias desde yà… aqui dejo mi correo para alguien que quiera ayudarme… djmaxees@hotmail.com hasta pronto saludos.
porfavor alguien responda o agregue necesito ayuda urgente, gracias.

Deja un comentario

¿Cuanto es 2 + 3 - 5? =

Suscribirse a los comentarios.