¡Hola, bienvenidos a la clase número once del Taller de PHP! Ya vimos todo el frontend del formulario, ahora nos resta ver como levantamos las variables enviadas através del mismo con PHP.
Hay que tener mucho cuidado en esta parte, como en general, dado que un pequeño descuido al tipear el código puede provocar un error al intentar enviar los datos a través del formulario. ¡Sigue atentamente las indicaciones y no tendrás problemas!
Recibiendo los datos
Antes de ver como recibimos los datos, veamos como nos quedó el formulario de contacto completo. Supongamos que lo tenemos en el archivo contacto.php
<form action="contacto_script.php" method="post" id="contacto">
<label for="input_nombres">Nombre y Apellido</label><br />
<input id="input_nombres" type="text" name="nombres" value="" /><br /><br />
<label for="input_email">Email</label><br />
<input id="input_email" type="text" name="email" value="" /><br /><br />
<label for="input_sexo">Sexo</label><br />
<select id="select_sexo" name="sexo">
<option value="M">Masculino</option>
<option value="F">Femenino</option>
</select><br /><br />
<label for="textarea_mensaje">Mensaje</label><br />
<textarea id="textarea_mensaje" name="mensaje" rows="5" cols="50"></textarea><br /><br />
<input type="submit" name="submit" value="Enviar consulta" />
</form>
Este formulario será enviado al archivo contacto_script.php por el método post. Ahora la pregunta del millón es qué contiene el archivo contacto_script.php.
contacto_script.php
Este archivo va a interpretar los datos enviados a través del formulario. Para ello lo que vamos a hacer es primero ver si llegaron todos los parámetros y agregarlos cada uno a una variable.
<?
// definimos las variables o marcamos el error
if ( !empty($_POST['nombres']) ) $nombres = $_POST['nombres']; else $error = true;
if ( !empty($_POST['email']) ) $email = $_POST['email']; else $error = true;
if ( !empty($_POST['sexo']) ) $sexo = $_POST['sexo']; else $error = true;
if ( !empty($_POST['mensaje']) ) $mensaje = $_POST['mensaje']; else $error = true;
?>
Expliquemos paso por paso.
Lo primero que hacemos es preguntar si NO está vacío el parámetro enviado por post, ya que la función empty pregunta si esta vacío (va a responder si el contenido es un string vacio, un cero o un false) pero como le anteponemos el ! estamos preguntando por lo contrario.
En caso de que nuestra condición se cumpla, asignamos a una variable el parámetro recibido, caso contrario definimos una variable llamada error con contenido TRUE. Esta última nos va a servir para hacer que todos los campos del formulario sean obligatorios a la hora de enviarse.
Perfecto, ya tenemos definidas nuestras variables ahora vamos a verificar que no exista la variable error, y si existe redireccionamos a una página con el mensaje de error.
// verificamos que no exista un error
if ( !empty($error) ) {
header( 'Location: contacto_error.php' );
die;
}
¿Qué esta pasando acá?
Lo mismo que antes, preguntamos si no está vacío error, si la respuesta a esta pregunta es verdadera, tenemos un problema, uno de los campos del formulario no fue completado, por lo que el script de php lo vamos a frenar y vamos a redireccionar al usuario a una página que contenga el mensaje de error, esta página va a ser en este caso contacto_error.php.
La redirección la hacemos por medio de la función header( ‘Location: …’ ) que va a hacer que recargue la nueva página que le estamos pasando, y tenemos que poner la linea siguiente con el die para que se frene el script en ese momento y pueda ejecutarse la función header, ya que si no frenamos el script, primero va a leer y ejecutar todo y después va a tener acción el header( ‘Location: …’ ).
La página contacto_error.php puede contener simplemente un mensaje que diga “El formulario de contacto no ha podido ser enviado, por favor asegúrese de que haya completado todos los campos correctamente.” y un link a la página del formulario de contacto para que vuelva a enviarlo.
Cuerpo del Mensaje
Nos resta por definir el cuerpo del mensaje que queremos recibir a través del formulario de contacto, el mismo puede ser algo así:
// definimos el cuerpo del email
$cuerpo = "
De: $nombres \n\r
Email: $email \n\r
Sexo: $sexo \n\r
Mensaje: \n\r
$mensaje
";
Como el e-mail llega como texto plano, debemos definirle los saltos de linea con \n\r.
Perfecto, ya definimos las variables, ya nos aseguramos que no tengo ningún error, creamos el cuerpo del email, ahora lo que vamos a hacer es enviar el mensaje que recibimos através del formulario a nuestra casilla de email. Para ello vamos a utilizar una funcion de php que se llama mail()
Función mail
mail ( string $para , string $asunto , string $mensaje );
esta función va a responder true o false, dependiendo si se pudo ejecutar correctamente, en nuestro script quedaria algo así:
// enviamos el email
if ( mail( 'direccion.del.destinatario@email.com','Recibiste un mensaje a través del formulario de contacto de tu sitio',$cuerpo ) ) {
header( 'Location: contacto_exitoso.php' );
die;
} else {
header( 'Location: contacto_error.php' );
die;
}
Fíjense que en el primer parámetro de la función mail agregamos a dónde queremos que se envíe el mensaje, en el segundo parámetro ponemos el asunto y en el tercero el cuerpo que definimos anteriormente.
Si la condición es verdadera, es decir, el e-mail se envió correctamente redireccionamos a una nueva página llamada contacto_exitoso.php, la cual contendrá un mensaje del estilo: “El e-mail ha sido enviado correctamente, a la brevedad nos pondremos en contacto con usted.”
Y en caso de que no se cumpla redireccionamos a la página de error.
Script Completo
El script completo quedaría algo asi:
<?
// definimos las variables o marcamos el error
if ( !empty($_POST['nombres']) ) $nombres = $_POST['nombres']; else $error = true;
if ( !empty($_POST['email']) ) $email = $_POST['email']; else $error = true;
if ( !empty($_POST['sexo']) ) $sexo = $_POST['sexo']; else $error = true;
if ( !empty($_POST['mensaje']) ) $mensaje = $_POST['mensaje']; else $error = true;
// verificamos que no exista un error
if ( !empty($error) ) {
header( 'Location: contacto_error.php' );
die;
}
// definimos el cuerpo del email
$cuerpo = "
De: $nombres \n\r
Email: $email \n\r
Sexo: $sexo \n\r
Mensaje: \n\r
$mensaje
";
// enviamos el email
if ( mail( 'direccion.del.destinatario@email.com','Recibiste un mensaje a través del formulario de contacto de tu sitio',$cuerpo ) ) {
header( 'Location: contacto_exitoso.php' );
die;
} else {
header( 'Location: contacto_error.php' );
die;
}
?>
| << CLASE ANTERIOR |








Jueves, 3 de Abril de 2008 a las 18.53
q tal.. S aludos ….
solamente tengo una pregunta en donde puedo placticar PHP… en dreaw! o en dode,…
por que lo hago escrito pero si es platico mucho mejor para poder implementar todo y jugar con todo….
ok.
nos vemos espero su respuesta—………
SALUDOS A TODOS…..
ATTE: FREEMAN…..
mi email por los que me quierna agregar….?
Lunes, 7 de Abril de 2008 a las 13.17
Muy bueno…lo voy a bajar y loprobare en un SItio q estoy haciendo
Martes, 8 de Abril de 2008 a las 15.42
¡Hola, Freeman!
PHP es un lenguaje de programación que puedes escribir en un simple blog de notas (notepad), también puedes utilizar el Dreamweaver
Martes, 15 de Abril de 2008 a las 02.09
Que tal, Te felicito por la loable labor que haces al impartir cursos de php, entre otros, me gusta la forma en que lo enseñas pues lo haces en un nivel entendible. Te comento actualmente estoy aprendiendo php de un libro que compre y lo complemento con lo que tu enseñas, en el tema de los formularios me gustaria que nos explicaras un poco hacerca de enviar archivos, tb procesando archivos, bueno te comente que ya estoy aprendiendo un poquito asi que si puede servir de algo te envia algunas cosas sobre estos temas, solo dime si a tu correo o aqui mismo los escribo, saludos y hasta pronto, estamos para servios!!!
Jueves, 17 de Abril de 2008 a las 18.49
Hola, tengo dudas en cómo insertar un comentario y que este aparezca en una dirección de correo para ser valorado antes de publicarlo. Saludos
Viernes, 18 de Abril de 2008 a las 10.54
Hola Kendrick, todavía no expliqué lo que me estas preguntando jeje, pero en cuanto arranque con las clases que hacen referencia a la creación de un “blog” lo voy a explicar.
Tenes que tener un poquito de paciencia solamente, gracias por seguir el curso.
Saludos.
Jueves, 24 de Abril de 2008 a las 12.15
hola, te escribo porque, cuando ejecuto el archivo contacto.php todo bien, pero cuando presiono el boton enviar consulta(obvio con todos los datos ingresados), sale el siguente error:
Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in E:\AppServ\www\Clase11\contacto_script.php on line 23
eh instalado, un servidor SMTP del mismo Windows, pero daba el mismo error, he bajado uno que se llama QK SMTP Server 3, y como que funciona (muestra el archivo contacto_exitoso.php), pero en realidad no envia nada.
Que es lo que podria hacer para darle solucion al problema, que imagino no sere el unico que lo tiene, GRACIAS!!
Jueves, 24 de Abril de 2008 a las 12.19
bueno, y era solo ese el problema cuando solo ponia el if sin else porque de lo contario tambien me sale el error anterios junto al segundo:
Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in E:\AppServ\www\Clase11\contacto_script.php on line 23
Warning: Cannot modify header information - headers already sent by (output started at E:\AppServ\www\Clase11\contacto_script.php:23) in E:\AppServ\www\Clase11\contacto_script.php on line 26
bueno espero su ayuda, GRACIAS!!!
Martes, 13 de Mayo de 2008 a las 22.34
Hola, Justi
Estoy encantado con tu curso, hasta ahora lo he seguido sin ningún problema.
Sin embargo, en esta clase, el scrip de contacto_scrip.php no me funciona.
Me envía este mensaje ” Warning: Cannot modify header information - headers already sent by (output started …etc ” que traducido viene a ser “Advertencia: No puede modificar la información de header - headers ya enviados por (la salida comenzada …etc. ”
Si en el condicional
“if ( !empty($error) ) {
header( ‘Location: contacto_error.php’ );
die;
}”
sustituyo
“header( ‘Location: contacto_error.php’ );
die;”
por otra instruccioón, por ejemplo “echo $nombres;” y en el header del final hago lo mismo, la instrucción se ejecuta y el correo es enviado sin novedad.
Te agradecería me explicaras qué hago mal.
Aprovecho para saludarte y felicitarte por tu curso
Domingo, 8 de Junio de 2008 a las 23.51
Estoy probando esto del envio de los datos por correo, y aparentemente no existe problema, sin embargo al realizar una prueba no llega a mi email, que estará pasando???
Por favor es para un proyecto, gracias!!!!
Lunes, 23 de Junio de 2008 a las 21.46
Hola, estuve probando este codigo porque lo necesito para una pagina que estoy haciendo pero no me anda, cuando apreto el boton enviar me tira una pantalla en blanco y no hace nada ni me manda el correo ni me muestra la pagina contacto_error.php ni la de contacto_exitoso.php.
Te agradeceria si me pudieras ayudar con esto porque lo necesito. Gracias.
Martes, 24 de Junio de 2008 a las 11.15
Hola nelson,
El error que te esta tirando es un problema con el envío de emails del servidor, tendrías que ponerte en contacto con los encargados del servidor para que hagan funcionar la función mail de php.
Con respecto al error de “Warning: Cannot modify header information - headers already sent by …”, eso es porque no se puede mostrar en pantalla absolutamente nada antes de un “headar location”, y el mismo error anterior, el del mail es el que esta disparando el error del header location. Solucionando uno se solucionan los dos.
Saludos.
Martes, 24 de Junio de 2008 a las 11.18
Hola José Luis,
El error que te tira el “header location” es como le explique a Nelson, porque no podes enviar a pantalla aboslutamente nada antes del “header location”, es por eso que casi siempre se coloca lo mas arriba de todo, si tenes un “echo” o algo en html antes que el “header” te va a tirar el error ese.
Saludos.
Martes, 24 de Junio de 2008 a las 11.20
hola Angeles,
El que no te tire ningún error el script pero nunca te llega el email es por como esta configurada la funcion mail de php, te recomiendo que te pongas en contacto con la gente que te brinda el servicio de hosting para comunicarles este problema (que es bastante común).
Saludos.
Martes, 24 de Junio de 2008 a las 11.22
Lucrecia,
Pueden estar ocurriendo dos posibles cosas ante tu problema, la primera que el formulario no se este enviando a donde se tiene que enviar, asegurate que el action del formulario apunte bien. Y la segunda es que tenga un error el php y el servidor este configurado para que no muestre ningún error.
Una forma de debuggear estos problemas, es poner arriba de todo en el script un echo “hola”; e ir bajando esta linea de a poco, para ver hasta donde llega la ejecucion del script y hasta donde no.
Saludos.
Jueves, 26 de Junio de 2008 a las 02.04
El formulario me ha funcionado perfectamente en cuanto a recibir el mail en mi cuenta, pero me da el error de (Warning: Cannot modify header information…), entonces, ¿cual codigo php debo poner en contacto_exitoso.php y contacto_erro.php ?
Gracias.
Lunes, 7 de Julio de 2008 a las 22.38
Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in \\ una ip \s003\midominio.com.mx\Correo\envio.php on line 20
si alguien me pudiera ayudar pa empezar no se por donde atacar el problema soy un burro!! definitivamente
Miércoles, 9 de Julio de 2008 a las 04.04
Hola amigo Justi
Primero felicitarte por el exelente curso que estas brindando y agradecerte de antemano por tu respuesta mi inquietud es la siguiente como recupero datos cuando tengo un formulario con el metodo GET seria de la forma ($_GET['nombres']) o es de una diferente forma muchas gracias por la respuesta
Sábado, 19 de Julio de 2008 a las 18.34
Hola, antes que nada quería comentarles que es excelente este curso.
Ahora (pido un salvavidas), tengo el mismo problema que en los post 7-8 y 17 (Failed to connect to mailserver at “localhost” port 25 …), lo triste es que instalé Apache y Php en mi pc para depurar localmente (no hay adminstrador a quien reclamar…), he revisado toda la documentaciín que encontré sobre Apache… y na, también busqué otra bibliografía sobre Php, pero no encuentro en ningún lado alguna referencia a la variable smtp_port (supuestamente, se debería configurar en php.ini).
Agradeceré alguna orientación.
Mario
Jueves, 31 de Julio de 2008 a las 00.58
Hola de nuevo, luego de probar unas cuantas alternativas (con distintos niveles de éxito, combinando diversos SMTPServer -free- con ejemplos descargados de scripts y personalizando para superar situaciones de error) encontré que la mejor solución se me da utilizando la validación de usuario.
$host, ‘auth’ => true, ‘username’ => $username, ‘password’ => $password));
// envía email
$headers = array (’From’ => $from, ‘To’ => $to, ‘Subject’ => $subject);
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail))
$coment = ‘Error: ‘ . $mail->getMessage();
else
$coment = ‘El mensaje ha sido enviado.’;
//…
?>
Espero ayude a alguien,
Salu2
Jueves, 31 de Julio de 2008 a las 01.01
Perdón, repito xq no salió completo…
Hola de nuevo, luego de probar unas cuantas alternativas (con distintos niveles de éxito, combinando diversos SMTPServer -free- con ejemplos descargados de scripts y personalizando para superar situaciones de error) encontré que la mejor solución se me da utilizando la validación de usuario.
//…
require_once “Mail.php”;
//… inicializar variables
$host = ‘localhost’;
// el servicio SMTP debe estar iniciado
$smtp = Mail::factory(’smtp’,
array (’host’ => $host, ‘auth’ => true, ‘username’ => $username, ‘password’ => $password));
// envía email
$headers = array (’From’ => $from, ‘To’ => $to, ‘Subject’ => $subject);
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail))
$coment = ‘Error: ‘ . $mail->getMessage();
else
$coment = ‘El mensaje ha sido enviado.’;
//…
Espero ayude a alguien,
Salu2