2016-01-26 2 views
0

Mon formulaire a bien fonctionné, mais maintenant j'ai un problème avec mon formulaire: aucun courrier n'est envoyé même si le formulaire est correct et complet, aucun message d'erreur si l'entrée est incorrecte (par exemple adresse mail ou numéro de téléphone ou longueur minimale du nom de l'entrée).formulaire de validation ne fonctionne pas

La (dernière) version PHP de l'hôte est 5.6.10.

S'il vous plaît, quelqu'un peut-il m'aider? THX.

Le code de formulaire:

<?php session_start(); ?> 
<!DOCTYPE....> 

<head> 
... 
</head> 

<body> 
    ... 
    ... 

    <?php include 'scripts/contact.php'; ?> 

    <form action="Contact.php" method="post" accept-charset="UTF-8"> 
     <table id="formular"> 
     <tr> 
     <td><label for="nume">Nume:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td> 
     <td><input type="text" name="nume" id="nume" maxlenght="20" value="<?php echo $_POST['nume']; ?>" /></td> 
     <td><span class="err"><?php if(isset($errors['nume'])&&$error) { print $errors['nume']; } ?></span></td> 
     </tr> 

     <tr> 
     <td><label for="prenume">Prenume:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td> 
     <td><input type="text" name="prenume" id="prenume" maxlenght="20" value="<?php echo $_POST['prenume']; ?>" /></td> 
     <td><span class="err"><?php if(isset($errors['prenume'])&&$error) { print $errors['prenume']; } ?></span></td> 
     </tr> 

     <tr> 
     <td><label for="telefon">Telefon:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td> 
     <td><input type="text" name="tel" id="tel" maxlenght="20" value="<?php echo $_POST['tel']; ?>" /></td> 
     <td><span class="err"><?php if(isset($errors['tel'])&&$error) { print $errors['tel']; } ?></span></td> 
     </tr> 

     <tr> 
     <td><label for="email">Email:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</td> 
     <td><input type="text" name="email" id="email" maxlength="50" value="<?php echo $_POST['email']; ?>" /></label></td> 
     <td><span class="err"><?php if(isset($errors['email'])&&$error) { print $errors['email']; } ?></span></td> 
     </tr> 

<tr> 
     <td><label for="mesaj">Mesaj:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td> 
     <td><textarea cols="20" rows="5" wrap="virtual" id="mesaj" name="mesaj" maxlength="150" onkeyup="nrcaractere()"><?php echo $_POST['mesaj']; ?></textarea><br> 
     <div id="ramase">150 chars remaining</div> 
     <script type="text/javascript">window.ready = nrcaractere();</script></td> 
     <td><span class="err"><?php if(isset($errors['mesaj'])&&$error) { print $errors['mesaj']; } ?></span></td> 
     </tr> 

    <tr> 
     <td></td> 
     <td align="center"> 
     <button type="submit" name="trimite" />Trimite</button> 
     <button type="button" name="reset" onClick="sterge()" />Reset</button></td> 
     <td></td> 
     </tr> 
     </table> 
    </form> 
... 
... 

et le script de validation:

<?php 
if (isset($_POST['trimite'])) 
{ $error = FALSE; 

if (empty($_POST['nume'])) { 
    $errors['nume']='&nbsp;Mandatory'; 
    $error = TRUE; 
} 
else {  
    if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume'])) { 
     $errors['nume']='&nbsp;Only letters'; 
     $error = TRUE; 
    } 
    else {   
     if (strlen($_POST['nume'])<3) { 
     $errors['nume']='&nbsp;Too short. Min. 3 chars'; 
     $error = TRUE; 
     } 
     else { 
     $errors['nume']='<img src=/images/ok.jpg>'; 
     } 
    } 
    } 

if (empty($_POST['prenume'])) { 
    $errors['prenume']='&nbsp;Mandatory'; 
    $error = TRUE; 
} 
else {  
    if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) { 
     $errors['prenume']='&nbsp;Only letters'; 
     $error = TRUE; 
    } 
    else {   
     if (strlen($_POST['prenume'])<3) { 
     $errors['prenume']='&nbsp;Too short. Min. 3 chars'; 
     $error = TRUE; 
     } 
     else { 
      $errors['prenume']='<img src=/images/ok.jpg>'; 
     } 
    } 
} 

if (empty($_POST['tel'])) { 
    $errors['tel']='&nbsp;Mandatory'; 
    $error = TRUE; 
} 
else {  
    if (!preg_match('/^[0-9]{4}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{3}$/', $_POST['tel']) && !preg_match('/^[0-9]{3}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{2}[\s.]{0,1}[0-9]{2}$/', $_POST['tel']) && ($_POST['tel'] != '-')) { 
    $errors['tel']='&nbsp;Mask: 021.021.02.01 or 0740.123.456 or -'; 
    $error = TRUE; 
    } 
    else { 
    $errors['tel']='<img src=/images/ok.jpg>'; 
    } 
} 

if (empty($_POST['email'])) { 
    $errors['email']='&nbsp;Mandatory'; 
    $error = TRUE; 
} 
else {  
    if (!preg_match('/^[a-z0-9&\'\.\-_\+][email protected][a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) { 
    $errors['email']='&nbsp;Invalid address'; 
    $error = TRUE; 
    } 
    else { 
     $errors['email']='<img src=/images/ok.jpg>'; 
    } 
} 

if (empty($_POST['mesaj'])) { 
    $errors['mesaj']='&nbsp;Mandatory'; 
    $error = TRUE; 
} 
else {  
    if (strlen($_POST['mesaj'])<15) { 
     $errors['mesaj']='&nbsp;Too short. Min. 15 chars'; 
     $error = TRUE; 
    } 
    else { 
     if (strlen($_POST['mesaj'])>150) { 
     $errors['mesaj']='&nbsp;Too long. Max. 150 chars'; 
     $error = TRUE; 
     } 
     else { 
     $errors['mesaj']='<img src=/images/ok.jpg>'; 
     } 
    } 
} 

if (!$error) { 
    $destinatar = "[email protected]"; 
    $subject = "Site message"; 
    $body = 'Nume: '.$_POST['nume'].' 
    <br> 
    Prenume: '.$_POST['prenume'].' 
    <br> 
    Telefon: '.$_POST['tel'].' 
    <br> 
    Email: '.$_POST['email'].' 
    <br><br> 
    Mesaj: '.$_POST['mesaj']; 
    $headers .= 'MIME-Version: 1.0' . "\r\n"; 
    $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; 

    if (mail($destinatar,$subject,$body,$headers)) { 
    echo '<script type="text/javascript">alert("Message sent!")</script>'; 
    unset($_POST); 
    } 
    else { 
    echo '<script type="text/javascript">alert("Not sent. Try again!")</script>'; 
    } 
} 
} 

$_SESSION['s']=$s; 
?> 

PS. Excusez mon mauvais anglais.

+1

Je ne vois aucun attribut de nom 'mesaj'. Rapport d'erreur –

+0

Désolé, édité et mis à jour. THX – colombo2003

Répondre

1

Il semble que vous ayez deux problèmes, l'un avec la validation, et l'autre avec l'envoi de courrier électronique. Abordez le plus facile d'abord: commencez par vérifier si votre configuration de messagerie est correcte - php peut-il normalement envoyer un courriel, ou un problème avec votre code? J'utilise le script php pour me dire si le serveur est configuré correctement pour les emails sortants:

<?php 
    ini_set('display_errors', 1); 
    error_reporting(E_ALL); 
    $from = "<YOUR EMAIL>"; 
    $to = "<YOUR EMAIL>"; 
    $subject = "PHP Mail Test script"; 
    $message = "This is a test to check the PHP Mail functionality"; 
    $headers = "From:" . $from; 
    mail($to,$subject,$message, $headers); 
    echo "Test email sent"; 
?> 

Il ne fonctionne pas, vous devez configurer le serveur pour laisser php envoyer un email. J'aime utiliser le démon ssmtp pour simplifier l'envoi de courriels à un serveur SMTP. En ce qui concerne votre code de validation, il est assez difficile à suivre. Avez-vous envisagé d'utiliser une bibliothèque de validation à la place? Vous pouvez même utiliser HTML5 cru - voir ici: http://www.the-art-of-web.com/html/html5-form-validation/.

Mais si vous voulez vraiment utiliser votre propre php validateur, personnellement, je voudrais écrire quelque chose comme ce qui suit:

<?php 
$validation_elements = array(
    'nume' => function() { 
     if (!isset($_POST['nume'])) return 'You must enter your nume'; 
     if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume']) return 'Your nume can only be letters.;' 
     return false; 
    }, 
    'prenume' => function() { 
     if (!isset($_POST['Mandatory'])) return 'Your prenume is mandatory'; 
     if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) return "Your presume can only consist of letters"; 
     if (strlen($_POST['prenume'])<3) return "Your presume is too short."; 
     return false; 
    }, 
    'tel' => function() { 
     if (!isset($_POST['tel']) return false; // in this example tel is not mandatory but must match the following rule if it is present: 
     if (!preg_match('/^[0-9]{4}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{3}$/', $_POST['tel']) && !preg_match('/^[0-9]{3}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{2}[\s.]{0,1}[0-9]{2}$/', $_POST['tel']) && ($_POST['tel'] != '-')) return '&nbsp;Mask: 021.021.02.01 or 0740.123.456 or -';  
     return false; 
    }, 
    'email' => function() { 
     if (!isset($_POST['email'])) return 'Your email is mandatory'; 
     if (!preg_match('/^[a-z0-9&\'\.\-_\+][email protected][a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) return "Your email address must be like [email protected]"; 
     return false; 
    }, 
    'mesaj' => function() { 
     if (!isset($_POST['mesaj'])) return 'Your mesaj is mandatory'; 
     if (strlen($_POST['mesaj'])<15) return 'Mesaj too short. Min. 15 chars'; 
     if (strlen($_POST['mesaj'])>150) return 'Mesaj too long. Max 150 chars.'; 
     return false; 
    } 
} 

foreach ($validation_elements as $validation_element => $validation_rule) { 
    $errors = array(); 
    if ($validation_rule()) { 
     $errors[] = $validation_rule($validation_element); 
    } 
} 
if (!empty($errors)) { 
    echo "The form was not completed because: <ul>"; 
    foreach ($errors as $error) { 
     echo "<li>$error</li>"; 
    } 
    echo "</ul>"; 
} else { 
    send_email(); 
} 

La raison est que la validation est une tâche répétitive - nous prenons une entrée et appliquer des règles pour voir si elle passe ou échoue - donc nous devrions l'envelopper dans une boucle au lieu de le faire procéduralement, comme dans votre exemple. La meilleure entrée pour ce type de données est un tableau associatif où la valeur est la fonction à exécuter sur les données. La plupart des bonnes bibliothèques de validation vous demandera de faire vos règles quelque chose comme ceci:

<?php 
$validation = array(
    'tel' => array(
     'required' => true 
    ), 
    'mesaj' => array(
     'lessThan' => 150, 
     'moreThan' => 15, 
     'alphanumeric' => true 
    ), 
    <etc.> 

... mais si vous voulez écrire quelque chose d'aussi entièrement présenté comme cela, je vais laisser à vous de comprendre Comment. Enfin, un mot sur la validation - c'est difficile, et la plupart des programmeurs se trompent. Vous devez évaluer très soigneusement même les possibilités les plus inattendues pour des données valides. Par exemple: si j'essaie de vous écrire un message, est-ce que mon téléphone sera considéré comme valide? J'ai un numéro de téléphone au Royaume-Uni qui peut prendre la forme +44 xxxxx xxxxx, 0xxxxxxxxxx, ou même (+44) xxxxx xxxxx.

Vos règles de validation actuelles pourraient vous être utiles, mais Mme O'Shea ou Mme O'connor pourront-elles vous envoyer un message? Qu'en est-il de M. Mac Duff? Qu'en est-il du Dr. Ng de Singapour ou même du Prof. Nil des Etats-Unis? Ou pour les prénoms, qu'en est-il de Mme An Wilde? Tous ces noms sont parfaitement valides, même s'ils ne sont pas typiques parmi vos utilisateurs attendus. Je connais même un homme nommé Ben X, bien que ce ne soit pas son nom enregistré.

Bonne chance!

1

Le problème avec ma réponse précédente est qu'elle n'est pas portable - vous ne pouvez pas prendre ce code et l'utiliser ailleurs. Dans ma réponse précédente, j'ai laissé entendre qu'il y avait une autre, meilleure façon d'écrire une routine de validation. C'est ici. C'est plus complexe, mais seulement légèrement.

<?php 
$validation_rules = array(
    'tel' => array(
     'required' => true 
    ), 
    'mesaj' => array(
     'lessThan' => 150, 
     'moreThan' => 15, 
     'alphanumeric' => true 
    ), <etc> 
); 

$errors = array(); 

/* Note: you could also write each validation rule like this: 
function required($input, $is_required) { 
    ... <etc> 
} 
The function name is the name of the validation rule in the above array.*/ 

$validation_types = array() { 
    'required' => function($input, $is_required) { 
     $isset = isset($_POST[$input])); 
     return ($is_required && !$isset) ? "$input is required" : false; 
    }, 
    'alphanumeric' => function($input, $is_required) { 
     return preg_match('/^[a-zA-Z]{1,}$/',$_POST[$input] ? "$input must be alphanumeric" : false; 
    }, 
    'likeEmail' => function($input, $is_required) { 
     return !preg_match('/^[a-z0-9&\'\.\-_\+][email protected][a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST[$input]) ? "$input must be like an email address" : false; 
    }, 
    'lessThan' => function($input, $value) { 
     return (!strlen($input) < $value) ? "$input must be less than $value" : false; 
    }, <etc> 
} 
foreach ($validation_rules as $input=>$rules) { 
    foreach($rules as $rule=>$params) { 
     $validation_failed = $validation_types[$rule]($input, $params); 
     // if you used the simpler way of declaring validation rules,use this instead: 
     // $validation_failed = $rule($input, $params); 
     if ($validation_failed) { 
      $errors[] = $validation_failed; 
     } 
    } 
} 

La raison pour laquelle ce code est mieux est parce qu'il peut être utilisé dans d'autres formes aussi bien, mais ce ne pas lire beaucoup plus compliqué.