Avatar billede coolcom Nybegynder
05. september 2009 - 20:54 Der er 9 kommentarer og
2 løsninger

Gensender formular

Hej

Jeg har et problem med min kontaktformular. Når jeg har sendt den og trykker opdater i browseren bliver den samme email sendt igen og man kan på den måde spamme min email.

Kan man gøre noget ved dette udover tilføje AJAX?

contact.php:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" id="contact_form" method="post">
                         
                    <?php echo $response; ?>
                         
                    <div id="form_fields">

                        <input type="hidden" name="string" id="string" value="<?php echo $new_string; ?>" />
       
                        <p><label for="name">Name:</label>
                        <input class="text_field required" minlength="2" type="text" name="name" id="name" /></p>
                                   
                        <p><label for="email">Email:</label>
                        <input class="text_field required" type="text" name="email" id="email" /></p>
                                   
                        <p><label for="subject">Subject:</label>
                        <input class="text_field required" type="text" name="subject" id="subject" /></p>
                           
                        <p><label for="message">Message:</label>
                        <textarea class="text_area required" rows="10" name="message" id="message" ></textarea></p>
                                   
                        <p><label for="verification">Verification</label>
                        <?php
                                echo "<img class=\"verification_image\" src=\"verification.png\" alt=\"Verification\" />";
                                echo "<input class=\"text_field verification_input required\" name=\"verification\" id=\"verification\" type=\"text\" value=\"\" /></p>";
                        ?>

                        <span class="button_margin"><input type="submit" value="Submit" name="submit" id="submit" class="button" /></span>
                               
                  </div> <!-- end form_fields -->

                </form>

og sendEmail.php:

<?php

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

    $string            = $_POST['string'];
    $name             = trim($_POST['name']);
    $email             = $_POST['email'];
    $subject         = $_POST['subject'];
    $message         = $_POST['message'];
    $verification     = $_POST['verification'];
   
    $site_owners_email = 'steffan@lildholdt.dk'; // Replace this with your own email address
    $site_owners_name = 'Test Name'; // Replace with your name
   
    // Check for error in the name field
    if (empty($name)) {
        $error['name'] = "Please enter your full name";   
    }
   
    // Check for error in the email field
    if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
        $error['email'] = "Please enter a valid email address";   
    }
   
    // Check for error in the subject field
    if (empty($subject)) {
        $error['subject'] = "Please enter a subject";   
    }
   
    // Check for error in the message field
    if (empty($message)) {
        $error['message'] = "Please enter a message.";
    }
   
    // Check for error in the verification field
    if ($verification != $string) {
        $error['verification'] = "The verification code was wrong.";
    }
   
    // If no error occured send the email
    if (!$error) {
       
        require_once('phpMailer/class.phpmailer.php');
        $mail = new PHPMailer();
       
        $mail->From = $email;
        $mail->FromName = $name;
        $mail->IsHTML(true);
        $mail->Subject = $subject;
        $mail->AddAddress($site_owners_email, $site_owners_name);
       
        $mail->Body = $message;

        $mail->Send();
       
        $response = "<ul class=\"email_succes\"> <li> Congratulations, " . $name . ". We've received your email. We'll be in touch as soon as we possibly can. </li></ul>";
       
    } // end if no error
    else {
       
        $response = "<ul class=\"email_error\">";
        $response .= (isset($error['name'])) ? "<li>" . $error['name'] . "</li> \n" : null;
        $response .= (isset($error['email'])) ? "<li>" . $error['email'] . "</li> \n" : null;
        $response .= (isset($error['subject'])) ? "<li>" . $error['subject'] . "</li> \n" : null;
        $response .= (isset($error['message'])) ? "<li>" . $error['message'] . "</li>" : null;
        $response .= (isset($error['verification'])) ? "<li>" . $error['verification'] . "</li>" : null;
        $response .= "</ul>";
       
    } // end if there was an error sending

}
?>
Avatar billede olebole Juniormester
05. september 2009 - 21:04 #1
<ole>

At bruge Ajax, kan ikke gøre noget ved problemet. Det kan derimod den løsning, f.eks. Eksperten bruger:

Formen fyres af mod et dokument response.php, som behandler data og redirect'er til siden med formen:


<form action="response.php" method="post">
<input type="hidden" name="ret_page" value="<?php print $_SERVER['PHP_SELF'] ?>">



response.php

<?php
// Her behandles data

$ret_page = isset($_POST['ret_page']) ? $_POST['ret_page'] : "index.php";
header("Location: ".$ret_page);
?>



/mvh
</bole>
Avatar billede Slettet bruger
05. september 2009 - 21:16 #2
Hvis det bliver et problem kan du prøve med et CAPTCHA, et af de bedste gratis hedder reCAPTCHA og kan fås her:
http://recaptcha.net/

Ellers kan du gemme brugerens ip-adresse og tidspunkt for afsendelse af mail, og derefter tjekke om brugeren har afsendt en mail inden for de sidste par minutter.
Avatar billede olebole Juniormester
05. september 2009 - 21:38 #3
Brugerens problem opstår vist ved refresh af browseren - f.eks. ved tryk på F5. Det adresserer den løsning, jeg viste - samtidig med, man samler sine response funktioner i ét dokument. I så fald diskriminerer men udfra et hidden field:


<form action="response.php" method="post">
<input type="hidden" name="ret_page" value="<?php print $_SERVER['PHP_SELF'] ?>">
<input type="hidden" name="contxt" value="sendContactMail">



- og noget i stil med:


<?php
function sendContactMail() {
    // Send en mail
}

if (isset($_POST['contxt'])) {
    switch ($_POST['contxt']) {
        case "sendContactMail":
            sendContactMail();
            $ret_page = isset($_POST['ret_page']) ? $_POST['ret_page'] : "index.php";
            header("Location: ".$ret_page);
            exit();
        break;
       
        default:
            header("Location: error.php?error=context_not_known");
            exit();   
    }
} else {
    header("Location: error.php?error=no_context");
    exit();
}
?>



- hvor man så udvider antallet af cases og funktioner - eller inkluderer et dokument med funktioner
Avatar billede coolcom Nybegynder
06. september 2009 - 11:39 #4
Tak for svarene.

Men det virker ikke helt.

Jeg får beskeden:
Warning: Cannot modify header information - headers already sent

Er der ikke en anden måde at redirecte på?
Avatar billede Slettet bruger
06. september 2009 - 12:55 #5
Det er fordi du har et tegn, højst sandsynligt et mellemrum eller linjeskift før din PHP kode. Slet det, og så virker det.
Avatar billede coolcom Nybegynder
06. september 2009 - 17:22 #6
Jep. Lige præcis.

I kan begge smide et svar for point :)
Avatar billede olebole Juniormester
06. september 2009 - 17:27 #7
*griiiiiiiiiiiiiiiiiiiiiiiiiib*  =)
Avatar billede Slettet bruger
06. september 2009 - 17:55 #8
Gerne.

Jeg er glad for at det lykkedes for dig :)
Avatar billede coolcom Nybegynder
06. september 2009 - 18:45 #9
Tak for hjælpen :)
Avatar billede olebole Juniormester
06. september 2009 - 19:30 #10
Selvtak - og tak for pints  =)
Avatar billede olebole Juniormester
07. september 2009 - 15:55 #11
- ehhhhh ... ikke pints *hik* men points  ;D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester