formulaire de contact PHP, ce que je fais mal?
-
26-09-2019 - |
Question
J'apprends PHP et je suis en train d'écrire un script simple e-mail. J'ai une fonction (checkEmpty) pour vérifier si toutes les formes sont remplies et si l'adresse e-mail est valide (isEmailValid). Je ne sais pas comment retourner vrai checkEmpty funciton. Voici mon code:
Lorsque ce bouton est cliqué:
if (isset($_POST['submit'])) {
//INSERT FORM VALUES INTO AN ARRAY
$field = array ('name' => $_POST['name'], 'email' => $_POST['email'], 'message' => $_POST['message']);
//CONVERT ARRAY KEYS TO VARIABLE NAMES
extract ($field);
checkEmpty($name, $email, $message);
function checkEmpty($name, $email, $message) {
global $name_error;
global $mail_error;
global $message_error;
//CHECK IF NAME FIELD IS EMPTY
if (isset($name) === true && empty($name) === true) {
$name_error = "<span class='error_text'>* Please enter your name</span>";
}
//CHECK IF EMAIL IS EMPTY
if (isset($email) === true && empty($email) === true) {
$mail_error = "<span class='error_text'>* Please enter your email address</span>";
//AND IF IT ISN'T EMPTY CHECK IF IT IS A VALID ONE
}
elseif (!isValidEmail($email)) {
$mail_error = "<span class='error_text'> * Please enter a valid email</span>";
}
//CHECK IF MESSAGE IS EMPTY
if (isset($message) === true && empty($message) === true) {
$message_error = "<span class='error_text'>* Please enter your message</span>";
}
}
// This function tests whether the email address is valid
function isValidEmail($email){
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
if (eregi($pattern, $email))
{
return true;
} else
{
return false;
}
}
Je sais que je ne devrais pas être en utilisant globals dans la fonction, je ne sais pas une alternative. Les messages d'erreur sont affichage à côté de chaque élément de formulaire.
La solution
Tout d'abord, l'utilisation globale est un péché. Vous polluez espace de noms global, ce qui est une mauvaise idée, à l'exception de petits scripts ad hoc et le code existant.
Deuxièmement, vous utilisent à mauvais escient isset - pour deux raisons: a) dans un contexte donné, vous passez la variable $ nom à la fonction, il est donc toujours réglé b) vérifie si vide variable est définie ou non
Troisièmement, vous devez séparer la validation de génération html.
Quatrièmement, vous pouvez utiliser filter_var au lieu d'expression régulière pour tester si le courrier est valide.
Enfin, votre code pourrait ressembler à ça:
<?php
if (isset($_POST['submit'])) {
$fields = array ('name' => $_POST['name'], 'email' => $_POST['email'], 'message' => $_POST['message']);
//CONVERT ARRAY KEYS TO VARIABLE NAMES
extract ($fields);
$errors = validateFields($name, $email, $message);
if (!empty($errors)){
# error
foreach ($errors as $error){
print "<p class='error'>$error</p>";
}
} else {
# all ok, do your stuff
} // if
} // if
function validateFields($name, $email, $post){
$errors = array();
if (empty($name)){$errors[] = "Name can't be empty";}
if (empty($email)){$errors[] = "Email can't be empty";}
if (empty($post)){$errors[] = "Post can't be empty";}
if (!empty($email) && !filter_var($email,FILTER_VALIDATE_EMAIL)){$errors[] = "Invalid email";}
if (!empty($post) && strlen($post)<10){$errors[] = "Post too short (minimum 10 characters)";}
# and so on...
return $errors;
}
Autres conseils
Tout d'abord, vous devriez vraiment repenser votre logique pour éviter les variables globales.
Eitherway, créer une variable de succès $ et mis à true dans le haut de vos fonctions. Si une instruction if échoue, mettre à false. Puis retour $ succès dans le fond de votre fonction. Exemple:
function checkExample($txt) {
$success = true;
if (isset($txt) === true && empty($txt) === true) {
$error = "<span class='error_text'>* Please enter your example text</span>";
$success = false;
}
return $success;
}
Je ne suis pas sûr que ce soit ce que vous voulez, la façon dont je le vois, vous voulez $ mail_error, $ message_error et $ name_error être accessible depuis l'extérieur de la fonction. Si tel est le cas, ce que vous avez besoin est quelque chose comme ceci:
function checkEmpty($name, $email, $message) {
$results = false;
//CHECK IF NAME FIELD IS EMPTY
if (isset($name) === true && empty($name) === true) {
$results['name_error'] = "<span class='error_text'>* Please enter your name</span>";
}
//CHECK IF EMAIL IS EMPTY
if (isset($email) === true && empty($email) === true) {
$results['mail_error'] = "<span class='error_text'>* Please enter your email address</span>";
//AND IF IT ISN'T EMPTY CHECK IF IT IS A VALID ONE
}
elseif (!isValidEmail($email)) {
$results['mail_error'] = "<span class='error_text'> * Please enter a valid email</span>";
}
//CHECK IF MESSAGE IS EMPTY
if (isset($message) === true && empty($message) === true) {
$results['message_error'] = "<span class='error_text'>* Please enter your message</span>";
}
return $results;
}
$errors = checkEmpty($name, $email, $message);
vous pouvez maintenant tester les erreurs
if($errors){
extract ($errors); // or simply extract variables from array to be used next to form inputs
} else {
// there are no errors, do other thing if needed...
}