Foros del Web » Programando para Internet » PHP »

Alternativas a die() en este código

Estas en el tema de Alternativas a die() en este código en el foro de PHP en Foros del Web. Se me ocurre hacer $mail = "funcion mail"; y luego en lugar de die() poner $mail = null; pero claro resulta que si no declaro ...
  #1 (permalink)  
Antiguo 29/12/2010, 03:58
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Alternativas a die() en este código

Se me ocurre hacer $mail = "funcion mail"; y luego en lugar de die() poner $mail = null; pero claro resulta que si no declaro antes la variable $mail esta no tiene un valor asignado y si la declaro se enviaría el formulario sin comprobarse si están vacíos los campos.

Otro problema que tengo es que cuando alguien escribe una dirección de correo sin la @, o sea un formato incorrecto, me sale un warning y creo que es porque no he añadido a la lista de escepciones ese caso invalidando el envio del mail como respuesta y añadiendo un mensaje.

Cita:
<?php
if (isset($_POST['submit']))
{

$nombre = $_POST["nombre"];
$remitente = $_POST["email"];
$asunto= $_POST["asunto"];
$mensaje= $_POST["mensaje"];

$mensaje = wordwrap($mensaje, 70);

$encabezados = "From: $remitente" . "\r\n" . "Reply-To: $remitente" . "\r\n" . 'Content-type: text/plain; charset=iso-8859-1';

if(empty($remitente)){
die();
} elseif (empty($mensaje)){
die();
} elseif (empty($asunto)) {
die();
} elseif (empty($nombre)) {
die();
} else {
$destino = "[email protected]";
}

mail($destino, $asunto, $mensaje, $encabezados) or die ("Mensaje no enviado");

echo "Mensaje enviado";
}
?>
  #2 (permalink)  
Antiguo 29/12/2010, 04:57
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Alternativas a die() en este código

Tal y como lo planteas no hay alternativa al die, acaso puedes implementar una validación de esos datos. Si hay error devuelves al usuario a la página del form o algo similar. Para validar mails utiliza http://www.forosdelweb.com/f18/peque...emails-848993/

Una versión muy simple con validación sería algo así:
Código PHP:
<?php
if (isset($_POST['submit']))
{

    
//AGREGAR VARIABLE PARA APUNTAR LOS POSIBLES ERRORES
    
$error "";
    
$nombre $_POST["nombre"];
    
$remitente $_POST["email"];
    
$asunto$_POST["asunto"];
    
$mensaje$_POST["mensaje"];

    
$mensaje wordwrap($mensaje70);

    
$encabezados "From: $remitente" "\r\n" "Reply-To: $remitente" "\r\n" 'Content-type: text/plain; charset=iso-8859-1';

    if(empty(
$remitente)){
        
$error .= "Remitente vacío.";
    } elseif (empty(
$mensaje)){
        
$error .= "Msg vacío.";
    } elseif (empty(
$asunto)) {
        
$error .= "Asunto vacío.";
    } elseif (empty(
$nombre)) {
        
$error .= "Nombre vacío.";
    } else {
        
$destino "[email protected]";
    }
    
    if(
$error!=""){
    
mail($destino$asunto$mensaje$encabezados) or die ("Mensaje no enviado");
    echo 
"Mensaje enviado";
    }
    else{
        echo 
$error;
    }

    
}
?>
Espero que sirva, saludos
  #3 (permalink)  
Antiguo 29/12/2010, 09:06
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Alternativas a die() en este código

Cita:
Iniciado por repara2 Ver Mensaje
Tal y como lo planteas no hay alternativa al die, acaso puedes implementar una validación de esos datos. Si hay error devuelves al usuario a la página del form o algo similar. Para validar mails utiliza [url]http://www.forosdelweb.com/f18/pequenisimo-aporte-funcion-para-validar-emails-848993/[/url]

Una versión muy simple con validación sería algo así:
Código PHP:
<?php
if (isset($_POST['submit']))
{

    
//AGREGAR VARIABLE PARA APUNTAR LOS POSIBLES ERRORES
    
$error "";
    
$nombre $_POST["nombre"];
    
$remitente $_POST["email"];
    
$asunto$_POST["asunto"];
    
$mensaje$_POST["mensaje"];

    
$mensaje wordwrap($mensaje70);

    
$encabezados "From: $remitente" "\r\n" "Reply-To: $remitente" "\r\n" 'Content-type: text/plain; charset=iso-8859-1';

    if(empty(
$remitente)){
        
$error .= "Remitente vacío.";
    } elseif (empty(
$mensaje)){
        
$error .= "Msg vacío.";
    } elseif (empty(
$asunto)) {
        
$error .= "Asunto vacío.";
    } elseif (empty(
$nombre)) {
        
$error .= "Nombre vacío.";
    } else {
        
$destino "[email protected]";
    }
    
    if(
$error!=""){
    
mail($destino$asunto$mensaje$encabezados) or die ("Mensaje no enviado");
    echo 
"Mensaje enviado";
    }
    else{
        echo 
$error;
    }

    
}
?>
Espero que sirva, saludos
Hey muchas gracias eres un crack, funciona perfectamente solo que te confundiste en if($error!="") así que puse if($error=="") y ya va todo.

Por una cuestión matemática se ve que el if elseif else lee desde el principio hasta que un resultado en su lista de posibilidades coincide, así que hice esto:

Cita:
<?php
if (isset($_POST['submit']))
{
$error = "";
$nombre = $_POST["nombre"];
$remitente = $_POST["email"];
$asunto= $_POST["asunto"];
$mensaje= $_POST["mensaje"];

$mensaje = wordwrap($mensaje, 70);

$encabezados = "From: $remitente" . "\r\n" . "Reply-To: $remitente" . "\r\n" . 'Content-type: text/plain; charset=iso-8859-1';

if(empty($nombre) && empty($asunto) && empty($mensaje) && empty($remitente)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($nombre) && empty($asunto) && empty($remitente)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($nombre) && empty($asunto) && empty($mensaje)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($nombre) && empty($remitente) && empty($mensaje)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($remitente) && empty($asunto) && empty($mensaje)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($asunto) && empty($remitente)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($nombre) && empty($asunto)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($nombre) && empty($remitente)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($nombre) && empty($mensaje)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($asunto) && empty($mensaje)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($remitente) && empty($mensaje)) {
$error .= "Hay campos sin rellenar";
} elseif (empty($mensaje)){
$error .= "Mensaje vacío";
} elseif (empty($asunto)) {
$error .= "Asunto vacío";
} elseif (empty($nombre)) {
$error .= "Nombre vacío";
} elseif(empty($remitente)){
$error .= "Email vacío";
} else {
$destino = "[email protected]";
}

if($error == ""){
mail($destino, $asunto, $mensaje, $encabezados) or die ("Mensaje no enviado");
echo "Mensaje enviado";
}
else{
echo $error;
}

}
?>
Ahora solo me falta controlar el campo del email que tenga un formato correcto con tu pequeña aportación o con la función predefinida esa que un poco más abajo sugieren.
  #4 (permalink)  
Antiguo 29/12/2010, 10:27
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Alternativas a die() en este código

Perfecto has aclarado el código y lo has optimizado. Sólo un comentario, la validación es redundante, o sea, estás validando todo varias veces. La alternativa corta sería:

Código PHP:
if(empty($nombre) || empty($asunto) || empty($mensaje) || empty($remitente)){
    
$error .= "Hay campos sin rellenar";
}
else {
    
$destino "[email protected]";

y la detallada:

Código PHP:
<?php

if(empty($nombre) || empty($asunto) || empty($mensaje) || empty($remitente)) {
    
$error .= "Hay campos sin rellenar";
} elseif (empty(
$mensaje)){
    
$error .= "Mensaje vacío";
} elseif (empty(
$asunto)) {
    
$error .= "Asunto vacío";
} elseif (empty(
$nombre)) {
    
$error .= "Nombre vacío";
} elseif(empty(
$remitente)){
    
$error .= "Email vacío";
} else {
    
$destino "[email protected]";
}
?>
Pruébalo a ver que tal, salu2!
  #5 (permalink)  
Antiguo 29/12/2010, 13:37
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Alternativas a die() en este código

Cita:
Iniciado por repara2 Ver Mensaje
Perfecto has aclarado el código y lo has optimizado. Sólo un comentario, la validación es redundante, o sea, estás validando todo varias veces. La alternativa corta sería:

Código PHP:
if(empty($nombre) || empty($asunto) || empty($mensaje) || empty($remitente)){
    
$error .= "Hay campos sin rellenar";
}
else {
    
$destino "[email protected]";

y la detallada:

Código PHP:
<?php

if(empty($nombre) || empty($asunto) || empty($mensaje) || empty($remitente)) {
    
$error .= "Hay campos sin rellenar";
} elseif (empty(
$mensaje)){
    
$error .= "Mensaje vacío";
} elseif (empty(
$asunto)) {
    
$error .= "Asunto vacío";
} elseif (empty(
$nombre)) {
    
$error .= "Nombre vacío";
} elseif(empty(
$remitente)){
    
$error .= "Email vacío";
} else {
    
$destino "[email protected]";
}
?>
Pruébalo a ver que tal, salu2!
Sí, la verdad es que se me ha ido la pinza xD. Aunque en el código que has puesto tengo una duda, si bien el primero, el abreviado, es correcto, si tu dices hay campos sin rellenar en plural te refieres a que hay más de uno. Mientras que si dices "Hay que rellenar todos los campos" o "Es obligatorio rellenar todos los campos" dado que sí que son varios pues sonaría mejor.

Como tu bien dices es un super ahorro de código, lo que pasa es que soy muy nuevo y me falta leer mucho.

En el segundo ejemplo que me pones, al usar el operador || eso da un resultado "True" si alguno de ellos está vacío, por lo tanto, si escribes primero:

Cita:
if(empty($nombre) || empty($asunto) || empty($mensaje) || empty($remitente)) {
$error .= "Hay campos sin rellenar";
En ese caso estarás haciendo que siempre que haya o uno o varios campos sin rellenar se imprima el resultado "Hay campos sin rellenar".

El problema está en decir si al menos 2 o más de estos valores son ciertos entonces: hay campos sin rellenar. En caso de haber sólo uno: este campo está vacío.

Pienso que sí es posible simplificarlo como en el primer ejemplo que has puesto y pienso que también puede estar ultra personalizado el mensaje que imprime. Pero la cuestión es decir si "dos o más" yo sinceramente no se como se dice.

[Edito]

Cita:
if(empty($nombre) && empty($asunto) Or empty($mensaje) && empty($remitente)) Or empty($asunto) && empty($mensaje) Or empty($nombre) && empty($remitente)) Or empty($nombre) && empty($mensaje) Or empty($asunto) && empty($remitente)) {
$error .= "Hay campos sin rellenar";
¿Me puedes confirmar si estoy en lo correcto? Lo pruebo y te digo. De todas formas si no es por ti no lo veo. Porque sigue siendo un brutal ahorro de código. A dinde cuentas es matemáticas.

PD: Voy a empezar a leer tu aporte de la validación a ver si lo voy entendiendo y lo puedo implementar facilmente en mi validación y si no entiendo algo te pregunto.


Estas en todo jeje ^^

Última edición por Gambinoh; 29/12/2010 a las 13:54
  #6 (permalink)  
Antiguo 29/12/2010, 14:17
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Alternativas a die() en este código

Vale finalmente he decidido decantarme por algo más simple y he colocado:

Cita:
if(empty($nombre) || empty($asunto) || empty($mensaje) || empty($remitente)){
$error .= "Hay campos sin rellenar";
}
else {
$destino = "[email protected]";
}
  #7 (permalink)  
Antiguo 29/12/2010, 15:05
 
Fecha de Ingreso: diciembre-2010
Mensajes: 3
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Alternativas a die() en este código

Cita:
Iniciado por Gambinoh Ver Mensaje
Vale finalmente he decidido decantarme por algo más simple y he colocado:
Hmm... ¿Por qué no haces lo siguiente?

Código PHP:

$errores 
= array();

if(empty(
$nombre))
    
$errores[] = '¡No has introducido tu nombre!';

if(empty(
$asunto))
    
$errores[] = '¡No has introducido ningún asunto para el correo!';

if(empty(
$mensaje))
    
$errores[] = '¿Quieres enviar un mensaje en blanco? ¡Esto no es serio!';

if(empty(
$remitente))
    
$errores[] = 'No has especificado ningún remitente para el correo...';

if(empty(
$errores))
{
    
// Envías el correo
}
else
{
    
// Mostramos errores!
    
echo 'Han ocurrido los siguientes errores:';

    
// Bucle por cada error registrado
    
foreach($errores as $error)
        echo 
'<br />'.$error;

Si no te mola el tema de usar un bucle... Puedes eliminar el array y asignar directamente los valores a una cadena común... Pero lo veo más flexible de esta manera.
  #8 (permalink)  
Antiguo 29/12/2010, 15:37
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Alternativas a die() en este código

Hey eres un genio repara2, tu función de validación del mail es buenísima jeje me la leí entera y la implemente con este código:

Cita:
function validareMail($xEmail){

$xValid = true;

$atPos = strrpos($xEmail, '@');

//Si $atPos es booleana Y es falso entonces no es email
if(is_bool($atPos) && !$atPos){
$xValid = false;
}else{

$xDomain = substr($xEmail, $atPos+1);
$xAddr = substr($xEmail, 0, $atPos);
$xAddrLen = strlen($xAddr);
$xDomainLen = strlen($xDomain);

//La dirección ha de ser >1 y <64
if ($xAddrLen < 1 || $xAddrLen > 64){
$xValid = false;

//el dominio >1 y <64
}else if ($xDomainLen < 1 || $xDomainLen > 255){
$xValid = false;

}else if ($xAddr[0] == '.' || $xAddr[$xAddrLen-1] == '.'){
$xValid = false;

//No puede contener barras // o \\
}else if (preg_match('/\\.\\./', $xAddr)){
$xValid = false;

}else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $xDomain)){
$xValid = false;

}else if (preg_match('/\\.\\./', $xDomain)){
$xValid = false;

}else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$xAddr))) {
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$xAddr))){
$xValid = false;
}
}
//Debe existir el dominio
if ($xValid && !(checkdnsrr($xDomain,'MX') || checkdnsrr($xDomain,'A'))){
$xValid = false;
}
}
return $xValid;
}


[...]

$indicador = "";

if(!validareMail($remitente)){
$indicador = "false";
}
else{
$indicador = "true";
}

if($error == "" && $indicador == "true"){
mail($destino, $asunto, $mensaje, $encabezados) or die ("Mensaje no enviado");
echo "Mensaje enviado";
} elseif ($indicador == "false"){
echo "Email erroneo";
} else{
echo $error;
}
Ojo aquí lo que se ve es como he adherido a mi código la función de repara2 usando la variable $indicador.

EL asunto práctico resulta así al final: si el email es erroneo aparece un mensaje indicándolo, si es correcto y faltan campos por rellenar, aparece un mensaje indicando que hay campos vacíos.
  #9 (permalink)  
Antiguo 29/12/2010, 15:51
 
Fecha de Ingreso: diciembre-2010
Mensajes: 3
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Alternativas a die() en este código

Puedes añadir al código anterior:

Código PHP:

if(!validarEmail($remitente))
    
$errores[] = 'El remitente que has introducido no es válido...'
En fin. No sé si habrás visto mi mensaje anterior.

Un saludo.
  #10 (permalink)  
Antiguo 29/12/2010, 15:58
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: Alternativas a die() en este código

Cita:
Iniciado por Hectarea Ver Mensaje
Puedes añadir al código anterior:

Código PHP:

if(!validarEmail($remitente))
    
$errores[] = 'El remitente que has introducido no es válido...'
En fin. No sé si habrás visto mi mensaje anterior.

Un saludo.

Sí, perdona, no lo había visto, pero es muy buena idea ^^

Me gusta lo del bucle. Lo que pasa es que al haber tanto código he pensado que era mejor simplemente ahorrar espacio, ya que ahora me toca el tema del captcha y no me hace mucha gracia que sea mucho más extenso de lo estrictamente necesario. Aunque no descarto personalizarlo siguiendo el modelo que sugieres cuando el captcha ya este implementado.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:09.