0

I am trying make a contact form with php mailer, validate it and submit it on the same page. My site is a one page, so I would not want another page for processing this data form.

I can send form mail e receive it in my inbox. But when I let it empty or in a wrong way, I can see the error message and it SENDS the form anyway!

So, I want my validation prevent the form from submit in cases of it not pass in validation.

Here is my code (all in the same page):

<?php

if (isset($_POST['enviarFormulario'])) {


$enviaFormularioParaNome = 'Gilberto Junior';
$enviaFormularioParaEmail = '[email protected]';

$caixaPostalServidorEmail = '[email protected]';
$caixaPostalServidorSenha = 'password';

$remetenteNome  = $_POST['remetenteNome'];
$remetenteEmail = $_POST['remetenteEmail'];
$telefone1  = $_POST['telefone1'];
$telefone2  = $_POST['telefone2'];
$mensagem = $_POST['mensagem'];

$mensagemConcatenada = 'Formulário gerado via website'.'< br/>'; 
$mensagemConcatenada .= '-------------------------------< br/>< br/>'; 
$mensagemConcatenada .= 'Nome: '.$remetenteNome.'< br/>'; 
$mensagemConcatenada .= 'E-mail: '.$remetenteEmail.'< br/>'; 
$mensagemConcatenada .= 'telefone 1: '.$telefone1.'< br/>';
$mensagemConcatenada .= 'telefone 2: '.$telefone2.'< br/>';
$mensagemConcatenada .= '-------------------------------< br/>< br/>'; 
$mensagemConcatenada .= 'Mensagem: "'.$mensagem.'"< br/>';


require_once('php-mailer/PHPMailerAutoload.php');

$mail = new PHPMailer();

$mail->IsSMTP();
$mail->SMTPAuth  = true;
$mail->Charset   = 'utf8_decode()';
$mail->Host  = 'smtp.'.substr(strstr($caixaPostalServidorEmail, '@'), 1);
$mail->Port  = '587';
$mail->Username  = $caixaPostalServidorEmail;
$mail->Password  = $caixaPostalServidorSenha;
$mail->From  = $caixaPostalServidorEmail;
$mail->FromName  = utf8_decode($caixaPostalServidorNome);
$mail->IsHTML(true);
$mail->Subject  = utf8_decode('Contato');
$mail->Body  = utf8_decode($mensagemConcatenada);

$mail->AddAddress($enviaFormularioParaEmail,utf8_decode($enviaFormularioParaNome));

if(!$mail->Send()){
$mensagemRetorno = 'Erro ao enviar formulário: '. print($mail->ErrorInfo);
}else{
$mensagemRetorno = 'Formulário enviado com sucesso!';
} 

}
?>


<?php
// Initialize variables and set to empty strings
$remetenteNome=$remetenteEmail="";
$remetenteNomeErr=$remetenteEmailErr="";

// Validate input and sanitize
if ($_SERVER['REQUEST_METHOD']== "POST") {
   if (empty($_POST["remetenteNome"])) {
      $remetenteNomeErr = "First name is required";
   }
   else {
      $remetenteNome = test_input($_POST["remetenteNome"]);
   }
   if (empty($_POST["remetenteEmail"])) {
      $remetenteEmailErr = "Last name is required";
   }
   else {
      $remetenteEmail = test_input($_POST["remetenteEmail"]);
   }
}

// Sanitize data
function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>

<form class="pl-md-5" id="form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST">
    <p><input name="remetenteNome" value="<?php echo $remetenteNome;?>" class="w-100" type="text" placeholder="Nome"></p>
    <span class="error">* <?php echo $remetenteNomeErr;?></span>
    <p><input name="remetenteEmail" class="w-100" type="email" placeholder="E-mail"></p>
  <span class="error">* <?php echo $remetenteEmailErr;?></span> 
    <p class="flex-row d-flex">
        <input name="telefone1" class="w-50 mr-4" type="tel" placeholder="Telefone 1">
        <input name="telefone2" class="w-50" type="tel" placeholder="Telefone 2">
    </p>                
    <p><textarea name="mensagem" class="w-100" placeholder="Mensagem"></textarea></p>
    <p>
        <button type="submit" name="enviarFormulario" class="btn btn-yellow g-recaptcha" data-sitekey="6LcNJnEUAAAAAI1fcViM6ZWuZF0AI2e4CEEU1zyG"    data-callback="OnSubmit">Enviar</button>
        <?php
        if(isset($mensagemRetorno)){
        echo $mensagemRetorno;
        }
        ?>  
    </p>
</form>

1 Answer 1

1

You are sending the email and then validating it. Change the order and add some logic:

// Validate input and sanitize
$valid = true;
if ($_SERVER['REQUEST_METHOD'] == "POST") {
   if (empty($_POST["remetenteNome"])) {
      $remetenteNomeErr = "First name is required";
      $valid = false;
   }
   else {
      $remetenteNome = test_input($_POST["remetenteNome"]);
   }
   if (empty($_POST["remetenteEmail"])) {
      $remetenteEmailErr = "Last name is required";
      $valid = false;
   }
   else {
      $remetenteEmail = test_input($_POST["remetenteEmail"]);
   }
}

if (isset($_POST['enviarFormulario']) && $valid) {
    // The rest of the code
}
Sign up to request clarification or add additional context in comments.

1 Comment

It works! I really did not think in the logic. Now it's clear. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.