Redireccionar página ( 'Location: otrapagina.php' );

Hola.

Estoy ensayando un formulario a través de buzón de correo pero pretendo que tenga filtro. En este ensayo el filtro detecta campos vacíos pero puede servir para filtrar muchas cosas.

Para ello, en caso de campo vacío redirecciono la página a otra llamada error que advierte al usuario que debe llenar todos los campos y le proporciona un link para volver a "contacto", la página del formulario.

Sin embargo, cuando llamo al formulario aparece un mensaje en que viene a decir, supongo, que si ya he comenzado a bajar datos al ofrecer el formulario, no puedo modificar la página de la que los envío:

Warning: Cannot modify header information - headers already sent by (output started ... etc. ...

que traducido significa:

Advertencia: No puede modificar la información de header - headers ya enviados por (la salida comenzada...

El caso es que el scrip lo he sacado de un tutorial y debería funcionar.

Está claro que el problema está en el redireccionamiento header( 'Location: error.php' );
pues cualquier otra instrucción funciona, pero no filtra.

Os mando el código a ver qué opinais:


<form action="contacto.php" method="post" id="contacto">
<label for="nombre">Nombre</label>

<input id="nombre" type="text" name="nombre" value="" />


<label for="email">Email</label>

<input id="email" type="text" name="email" value="" />


<label for="textarea_mensaje">Mensaje</label>

<textarea id="textarea_mensaje" name="mensaje" rows="5" cols="50"></textarea>


<input type="submit" name="submit" value="Enviar " />
</form>

<?
// 1- Señalar error si hay campos vacíos

if ( !empty($_POST['nombre']) ) $nombre = $_POST['nombre']; else $error = true;
if ( !empty($_POST['email']) ) $email = $_POST['email']; else $error = true;
if ( !empty($_POST['mensaje']) ) $mensaje = $_POST['mensaje']; else $error = true;

// 2- Si se ha señalado error ir a la página de error. Es un filtro. ¡¡¡ NO FUNCIONA. !!!

if ( !empty($error) ) {
header( 'Location: error.php' );
die;
}


// 3- Formar mensaje ($cuerpo) y envíar email a mi buzón. Si sustituyo el punto 2
// por cualquier otra instrucción envía correo perfectamente.

$cuerpo = "
De: $nombre \n\r
Email: $email \n\r
Mensaje: \n\r
$mensaje
";

mail( 'buzon1.@brasilpipa,com','Mensaje de formulario de contacto.',$cuerpo )


?>

También he intentado bifurcar el flujo mediante un bucle y un condicional pero el código php parece ser demasiado rígido o yo conozco pocas sentencias.

Espero vuestra ayuda
usando el dreamweaber, se puede crear un javascript que detecta los capos vacios,los que solo tienen que ser numeros y las direcciones email.
en tu caso seria poner entre <head> y </head>:
<script type="text/JavaScript">
<!--
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d)&&d.all) x=d.all; for (i=0;!x&&i<d.forms.length;i++) x=d.forms;
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers.document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0
var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args);
if (val) { nm=val.name; if ((val=val.value)!="") {
if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
} else if (test!='R') { num = parseFloat(val);
if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
min=test.substring(8,p); max=test.substring(p+1);
if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
} } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
} if (errors) alert('The following error(s) occurred:\n'+errors);
document.MM_returnValue = (errors == '');
}
//-->
</script>
Yo diría que todo ese código está en la misma página.

Si es así, lo que deberías hacer es:

1. poner alguna condición para que cuando envíen los datos no escriba de nuevo el formulario, ya que una vez has escrito algo ya no puedes usar los comandos "header", comandos de cookies ni de sesión.

2. Usar dos páginas separadas. Por ejemplo "contacto.php" y "envio.php", y así te evitas complicaciones.


Saludos!
Gracias, Naguisa.

He vuelto de vacaciones y por una temporada voy a posponer el aprendizaje de programación.