recherche

Maison  >  Questions et réponses  >  le corps du texte

Pourquoi ces validations d'entrée ne fonctionnent-elles pas ? (Contactez-nous via PHP & HTML & SMTP Server & PHPmailer)

J'utilise PHP, HTML, serveur SMTP et PHPmailer pour créer un formulaire de contact avec validation des entrées utilisateur. Mais après avoir appuyé sur le bouton "Soumettre", cela m'a donné une erreur :

Adresse invalide : (Expéditeur) : Erreur fatale : PHPMailerPHPMailerException non intercepté : adresse invalide : (de ): dans C:xampphtdocsRESPONSIVE SITE3_2FournisseurphpmailerphpmailersrcPHPMailer.php:1324 Trace de la pile: #0 C:xampphtdocsRESPONSIVE SITE3_2send-email.php(74): PHPMailerPHPMailerPHPMailer->setFrom('', '') #1 {main} lance C:xampphtdocsRESPONSIVE SITE3_2vendorphpmailerphpmailersrcPHPMailer.php ligne 1324

Code PHP :

<?php

$name = $_POST["name"];
$email = $_POST["email"];
// $email = test_input($_POST["email"]);
$message = $_POST["message"];

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $emailErr = "Invalid email format";
} 

if (!preg_match("/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/", $email)) {
    $emailErr = "Email should contain only letters, numbers, and underscores";
}

require "vendor/autoload.php";

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

$mail->isSMTP();
$mail->SMTPAuth = true;

$mail->Host = "smtp.gmail.com";
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

require_once 'config.php';
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;

$mail->setFrom($email, $name);
$mail->addAddress("myemail@gmail.com", "Ads");

$mail->Subject = $subject;
$mail->Body =  "Name: $name\nEmail: $email\n\n$message";

$mail->send();

header("Location: sent.html");
?>

Code HTML

<form method="POST" action="send-email.php">
    <input type="text" name="name" id="name" placeholder="Name*">
    
    <input type="email" name="email" id="email" placeholder="Email*">
    <span class="error" style="color:red"><?php echo $emailErr;?></span>

    
    <textarea name="message" id="message" placeholder="Your Message*"></textarea>
    
    <button type="submit" name="submit" id="submit" class="button">Start</button>
</form>

J'ai essayé différents tutoriels - sans succès. J'ai besoin de ce formulaire

Je suis très nouveau dans ce domaine, veuillez l'expliquer dans un langage très simple :)

P粉613735289P粉613735289450 Il y a quelques jours467

répondre à tous(1)je répondrai

  • P粉924915787

    P粉9249157872023-09-07 13:36:42

    Diagnostic

    Si soit vérification if 语句为 true,则将设置一个字符串变量 $emailErr.

    Ensuite, le code sort à nouveau du bloc if et le script continue son bon chemin et tente d'envoyer l'e-mail. Il n'y a aucune logique dans le code pour empêcher cela.

    Enfin, $emailErr n'est jamais utilisé car le code redirige l'utilisateur vers une autre page HTML qui ne peut pas impliquer cette variable.

    Solution

    Si une validation échoue, vous avez besoin d'une logique supplémentaire pour indiquer au code d'ignorer la partie d'envoi d'e-mail. Un moyen très simple de procéder intelligemment consiste à utiliser une variable « flag ».

    Par exemple :

    <?php
    require "vendor/autoload.php";
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    
    $name = $_POST["name"];
    $email = $_POST["email"];
    // $email = test_input($_POST["email"]);
    $message = $_POST["message"];
    $valid = true;
    $emailErr = "";
    
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $emailErr = "Invalid email format";
        $valid = false;
    } 
    
    if (!preg_match("/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/", $email)) {
        $emailErr = "Email should contain only letters, numbers, and underscores";
        $valid = false;
    }
    
    //only send if all validations passed:
    if ($valid == true)
    {
      $mail = new PHPMailer(true);
    
      $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    
      $mail->isSMTP();
      $mail->SMTPAuth = true;
    
      $mail->Host = "smtp.gmail.com";
      $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
      $mail->Port = 587;
    
      require_once 'config.php';
      $mail->Username = SMTP_USERNAME;
      $mail->Password = SMTP_PASSWORD;
    
      $mail->setFrom($email, $name);
      $mail->addAddress("myemail@gmail.com", "Ads");
    
      $mail->Subject = $subject;
      $mail->Body =  "Name: $name\nEmail: $email\n\n$message";
      $mail->send();
    
      header("Location: sent.html");
    }
    else
    {
      echo $emailErr;
    }

    P.S. BTW, votre regex est trop restrictive - voir Quels caractères sont autorisés dans les adresses e-mail ? . Puisque vous utilisez déjà FILTER_VALIDATE_EMAIL, vous n’en avez en aucun cas besoin.

    répondre
    0
  • Annulerrépondre