2009-07-31 8 views
2

J'ai cette fonction très simple ...retour des valeurs négatives

function send_mail($to, $from, $from_mail, $subject, $message) { 

    if (empty($from) || empty($from_mail) || empty($subject) || empty($message)) { 
     return -1; 
    } 

    if (isset ($_SESSION['last_mailed'])) 
    { 
    if ($_SESSION['last_mailed'] + 180 < time()) 
     return -2; 
    } 
    $_SESSION['last_mailed'] = time(); 

    if (!validEmail($from_mail)) 
    return -3; 

    $from = strip_mail_headers_single($from); 
    $from_mail = strip_mail_headers_single($from_mail); 
    $subject = strip_mail_headers_single($subject); 
    $message = strip_mail_headers_multi($message); 

    return mail($to, $subject, $message, "From: $from <$from_mail>\r\n"); 

} 

if (!empty($_POST)) { 
    $result = send_mail($mail_to, $_POST['from'], $_POST['from_mail'], $_POST['subject'], $_POST['message']); 

    if ($result == -1) 
    { 
     echo "<p>You need to complete all the fields.</p>"; 
    } 
    elseif ($result == -2) 
    { 
     echo "<p>You can only send one mail every three minutes.</p>"; 
    } 
    elseif ($result == -3) 
    { 
     echo "<p>Please enter a valid email address.</p>"; 
    } 
    else 
    { 
     echo "<p>Mail sent successfully!</p>"; 
    } 
} 

Je reçois des résultats étranges. La fonction mail() renvoie, le résultat est défini sur 1 et le courrier est envoyé. Cependant, "if ($result == -1)" est évalué à vrai pour une raison quelconque et le message d'erreur correspondant est imprimé. Pourquoi est-ce? Des idées?

+2

Est-ce que "si ($ result === -1)" donne le même résultat? – palindrom

+0

if (1 == 1) // vrai if (1 == "1") // vrai if (1 === 1) // vrai if (1 === "1") // false – madcolor

Répondre

3

C'est parce que vous retournez le résultat de mail(), qui est true dans le cas de succès, et PHP a ce genre de choses vraiment stupide passe où la sémantique de true sont que c'est la même (en faible comparaison ==) comme chaque expression booléenne-vraie, y compris -1.

Recommandation:

return mail($to, $subject, $message, "From: $from <$from_mail>\r\n") ? 1 : 0; 

et ajouter la manipulation pour le cas 0 indiquant que mail() a échoué.

La comparaison en utilisant === au lieu de == fonctionnerait également.

+0

Ah merci. Ouais, je suis un programmeur C où retourner ints est clair et simple. –

3

Pour commencer votre logique est faux ici:

if ($_SESSION['last_mailed'] + 180 < time()) 
    return -2; 
} 
$_SESSION['last_mailed'] = time(); 

// snip 

elseif ($result == -2) 
{ 
    echo "<p>You can only send one mail every three minutes.</p>"; 
} 

Ce dit dans la plaine-anglais, si plus de 3 minutes se sont écoulées depuis le dernier message a été envoyé, puis revenez -2.

Deuxièmement, le mail function en PHP renvoie un booléen vrai ou faux. N'essayez pas de comparer cela à -1.

+0

Merci pour cela, vous avez bien sûr raison. Ce n'est pas mon code. Je l'ai eu d'ici - http://robm.me.uk/articles/envoi-mail-avec-php –

0

Dans la première ligne, où vous vérifiez les valeurs vides, vous oubliez de vérifier $to

if (empty($from) || empty($from_mail) || empty($subject) || empty($message)) 

qui sautille alors que if-condition parce que, même si elle est vide, vous n'êtes pas la vérification de et rien n'est vraiment faux.

Ensuite, quand vous arrivez à la fonction mail(), l'e-mail est envoyé avec succès, quel que soit dans ce cas pas de nom to puis retourne la valeur booléenne de true ou 1.

De plus, parce que vous testez ceci:

if ($result == -1) 

Il sera toujours évaluer à true parce que dans le monde de PHP, boolean types sont true à moins qu'ils ne sont false ou vide.

Modifier les chèques à citer, comme si:

if ($result == "-1") 
+0

0 est l'autre fausse condition. – random

+0

Brillant, merci pour la réponse. Apprécié. –

Questions connexes