Php script verwerkt data van contactformulier niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kev Rama

Kev Rama

13/05/2013 17:55:09
Quote Anchor link
Hallo allemaal,
Vraagje. Ik zit weer met een contactformulier gerelateerd probleem (mijn verstand van php, javascript en ajax zijn eigenlijk nagenoeg nihil). Ik heb dit formulier in een Wordpress sjabloon pagina verwerkt – een sidebar (een wp contact form plugin is geen optie voor mij: veel te rigide).

Over het formulier
Het formulier wordt gevalideerd door jquery (de bekende validatie plugin). Als het formulier succesvol is gevalideerd dan moet ajax (ook hiervoor heb ik een jquery plugin) ervoor zorgen dat het formulier, zonder de pagina te herladen, de waardes verstuurd. En een php script doet de rest, althans dat is de bedoeling. Verder wil ik ook het formulier leegmaken bij een succesvolle verwerking, alleen ik weet niet hoe.

Het probleem
De validatie werkt (neem zelf maar een kijkje ). Alleen nadat de juiste waardes zijn ingevuld lijkt het erop of alles wel verwerkt wordt maar ik ontvang niets – en de spam map is leeg in mijn inbox, daarnaast lukt het wel als ik een ander script gebruik maar dan is er geen validatie. Net als of ajax wel een ok geeft maar het php bestand niet inschakelt (dat hoort ajax toch te doen?).

In Firebug zie ik een GET string met de data maar afhankelijk van wat geëxperimenteer (na aanleiding van allerlei informatie op internet over php contactformulieren) krijg ik onder het tabje ‘Console’ of ‘Net’ (in Firebug) een melding (een 404’tje) dat het php script er niet is of er staat geen foutmelding.

Ik heb de scripts op Pastebin gedropt. Als iemand een kijkje wil nemen en mij daarna van wat feedback voorziet, dat zou ik echt waarderen.

De pagina met het formulier
http://pastebin.com/0Ucn306n

jQuery script
http://pastebin.com/xxPdV7eL

Php formulier verwerkingsscript
http://pastebin.com/1LKVPx2v
 
PHP hulp

PHP hulp

22/12/2024 23:36:25
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/05/2013 18:57:26
Quote Anchor link
Je zet in je mail header(s) de from op een mail adres wat in het formulier wordt ingevuld.
Bij de meeste mail servers is het tegenwoordig zo ingesteld dat als dat geen adres is wat op die server bestaat, een 'relaying denied' wordt terug gegeven.
 
Kev Rama

Kev Rama

13/05/2013 19:05:59
Quote Anchor link
Ger van Steenderen op 13/05/2013 18:57:26:
Je zet in je mail header(s) de from op een mail adres wat in het formulier wordt ingevuld.
Bij de meeste mail servers is het tegenwoordig zo ingesteld dat als dat geen adres is wat op die server bestaat, een 'relaying denied' wordt terug gegeven.


Okay, dus als ik daar van maak '[email protected]' dan zou ik dat probleem al niet hebben? Dit php script heb ik al eens gebruikt op dezelfde server/host - althans zeker de 'from': e-mailadres uit het formulier wijze. En toen werkte het wel.

In ieder geval ga ik het meteen uitproberen. Natuurlijk zoek ik ook dit forum af, want er staan veel problemen die wel lijk op die mij van mij maar net iets anders zijn.

Zelf denk ik dat er iets niet klopt met wat ik met ajax doe. Want als ik ajax weglaat - en het custom jQuery script wat wijzig dan stuurt hij wel post door. Alleen het probleem is dat de validatie het verzenden niet tegenhoudt als er op de knop wordt gedrukt terwijl de ingevulde gegevens niet kloppen.

Ajax moet het php scriptje triggeren. En volgens mij gebeurt dat niet. Maar sowieso bedankt voor je hulp. Ik stel dat zeer op prijs.
Gewijzigd op 13/05/2013 19:06:41 door Kev Rama
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/05/2013 19:18:55
Quote Anchor link
Ik denk dat je de aanroep van form.ajaxSubmit op de verkeerde plaats doet, dat zou volgens mij binnen de success: van de validatie moeten.
Gewijzigd op 13/05/2013 19:19:32 door Ger van Steenderen
 
Kev Rama

Kev Rama

13/05/2013 19:23:38
Quote Anchor link
Ger van Steenderen op 13/05/2013 19:18:55:
Ik denk dat je de aanroep van form.ajaxSubmit op de verkeerde plaats doet, dat zou volgens mij binnen de success: van de validatie moeten.


Ga ik ook meteen proberen. Die header wat jij zei heb ik verandert dus in een e-mailadres op het domein. Het rare (ja voor mij dan) is ook dat nadat de knop zegt 'bericht verzonden' ik kan blijven drukken en dan stuurt telken opnieuw dezelfde string. Dit zie ik met Firebug onder 'Net'. En ik weet dat dat eigenlijk niet moet kunnen.
Gewijzigd op 13/05/2013 19:40:25 door Kev Rama
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/05/2013 20:20:12
Quote Anchor link
Dat komt omdat je met ajax werkt.
Ajax vervangt bepaalde inhoud van de pagina, dus als jij een button met verzenden hebt zal die telkens het formulier verzenden.
Om te beginnen kun je dus beter:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
jQuery(form).ajaxSubmit({
    datatype : 'json'
})

Dan kan je in callbacks veel beter afhandelen wat er wel of niet moet gebeuren.
Gewijzigd op 13/05/2013 20:37:39 door Ger van Steenderen
 
Kev Rama

Kev Rama

13/05/2013 20:55:41
Quote Anchor link
Het is me ook opgevallen dat onder ajaxtsettings in de DOM zoals je kunt zien met Firebug de url niet juist is. Die verwijst naar een pagina die niet bestaat. Geen flauw idee hoe dit kan.

Heb er nu dit van gemaakt (naast de rest dus). En heb de een reset functie toegevoegd.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
      // Use Ajax to send everything to processForm.php
      submitHandler: function(form) {
      jQuery('#contact-form .btn').html('Uw bericht wordt nu verzonden <img id="loader" src=".../ajax-loader.gif" /> ');
      jQuery('#contact-form').ajaxSubmit({
        datatype: 'json',        
        target: "#contact-form .btn",
        success: function(responseText, statusText, xhr, $form) {
          jQuery('#contact-form .btn').html('We hebben uw bericht ontvangen! <img id="check" src=".../valid.png" style="margin: -5px 0 -5px 5px">');
          resetInterval = setInterval (resetform, 5000);
        }
      });

      return false;
          }
       });      
  });
 
 var
resetInterval;
function
resetform() {
clearInterval(resetInterval);
$("#contact-form input, #contact-form textarea").each(function () {
    value = $(this).data('value');
    $(this).attr('value',value);
});


$('#contact-form .btn').html('Verzenden');
}

?>
Gewijzigd op 13/05/2013 20:59:43 door Kev Rama
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/05/2013 09:31:18
Quote Anchor link
Je maakt het jezelf te moeilijk, tenminste als je dezelfde plugin als ik gebruik (deze).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//javascript
    submitHandler: function(form) {
        $('#contact-form .btn').html('Uw bericht wordt nu verzonden <img id="loader" src=".../ajax-loader.gif" /> ');
        //form is al een jquery object
        form.ajaxSubmit({
        target: "#contact-form .btn",
        success: function() {
            form.delay(5000).resetForm(); //resetForm is een functie van de plugin!!
        }
    });


//php
//bij een succesvolle verzending

echo 'We hebben uw bericht ontvangen! <img id="check" src=".../valid.png" style="margin: -5px 0 -5px 5px">';
?>

Even een advies, zorg dat je nogmaals valideert in PHP, ook al valideer je met JS, ook dat kan gemanipuleerd worden.
 
Kev Rama

Kev Rama

14/05/2013 13:20:07
Quote Anchor link
Okay, ik heb een redelijke oplossing gevonden. Via de Wordpress codex en wat andere bronnen is me gelukt om een plugin te schrijven. Voor jullie is dit natuurlijk kippetje maar voor mij was echt een breinbreker. En nog is me natuurlijk niet helemaal helder wat er allemaal gebeurt. In elk geval hoop ik met het script hieronder voldaan te hebben aan de eis om ook php te laten valideren (jQuery validatie heb ik ook nog gaande...) als Javascript uit staat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/*
Plugin Name: phphulp Contact Form Shortcode
Plugin URI: http://phphulp.nl
Description: A simple contact form. Usage: <code>[contact email="[email protected]"]</code>
Version: 1.0
Author: phphulp
Author URI: http://phphulp.nl/
*/

// function to get the IP address of the user

function phphulp_get_the_ip() {
    if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
        return $_SERVER["HTTP_X_FORWARDED_FOR"];
    }

    elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
        return $_SERVER["HTTP_CLIENT_IP"];
    }

    else {
        return $_SERVER["REMOTE_ADDR"];
    }
}


// the shortcode
function phphulp_contact_form_sc($atts) {
    extract(shortcode_atts(array(
        "email" => get_bloginfo('admin_email'),
        "subject" => 'Onderwerp',
        "label_name" => 'Uw naam',
        "label_email" => 'Uw e-mailadres',
        "label_subject" => 'Onderwerp',
        "label_message" => 'Uw bericht',
        "label_submit" => 'Verzenden',
        "error_empty" => 'Alle vakken moeten worden ingevuld.',
        "error_noemail" => 'Geef a.u.b. een geldig e-mailadres op.',
        "success" => '<div class="alert alert-block alert-info fade in"><button class="close" data-dismiss="alert" type="button">×</button><p class="text-info"><strong>Gelukt!</strong> De postbode is onderweg met uw bericht. Wij nemen zonodig razendsnel contact met u op.</p><p><a class="btn btn-primary" href="http://phphulp.nl/">Phphulp lezen?</a></p></div>'
    ), $atts));

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $error = false;
        $required_fields = array("your_name", "email", "message", "subject");

        foreach ($_POST as $field => $value) {
            if (get_magic_quotes_gpc()) {
                $value = stripslashes($value);
            }

            $form_data[$field] = strip_tags($value);
        }


        foreach ($required_fields as $required_field) {
            $value = trim($form_data[$required_field]);
            if(empty($value)) {
                $error = true;
                $result = $error_empty;
            }
        }


        if(!is_email($form_data['email'])) {
            $error = true;
            $result = $error_noemail;
        }


        if ($error == false) {
            $email_subject = "[" . get_bloginfo('name') . "] " . $form_data['subject'];
            $email_message = "Onderwerp\n". $form_data['subject'] ."\r\n\r\n". "Naam\n". $form_data['your_name'] ."\r\n\r\n". "E-mailadres\n". $form_data['email'] ."\r\n\n". "Bericht\n\n". $form_data['message'] ."\n\nIP: " . phphulp_get_the_ip();
            $headers  = "From: ".$form_data['your_name']." <".$form_data['email'].">\n";
            $headers .= "Content-Type: text/plain; charset=UTF-8\n";
            $headers .= "Content-Transfer-Encoding: 8bit\n";
            wp_mail($email, $email_subject, $email_message, $headers);
            $result = $success;
            $sent = true;
        }
    }


    if($result != "") {
        $info = '<p class="text-error">'.$result.'</p>';
    }

    $email_form = '<form id="contact-form" class="form-horizontal" method="post" action="'.get_permalink().'">
        <fieldset>
        
        <legend></legend>
        
        <div class="control-group">
            <label class="control-label" for="cf_name">'
.$label_name.':</label>
            <div class="controls">
                <input type="text" name="your_name" id="cf_name" class="input-xlarge" value="'
.$form_data['your_name'].'" />
                <p class="help-block">Hier kunt u uw naam invullen</p>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="cf_email">'
.$label_email.':</label>
            <div class="controls">                    
                <input type="text" name="email" id="cf_email" class="input-xlarge" value="'
.$form_data['email'].'" />
                <p class="help-block">Hier kunt u uw e-mailadres invullen</p>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="cf_subject">'
.$label_subject.':</label>
            <div class="controls">
                <select id="cf_subject" name="subject" class="input-xlarge">
                  <option>Alarmopvolging</option>
                  <option>Collectieve surveillance</option>
                  <option>Objectbewaking</option>
                  <option>Ordehandhaving</option>
                  <option>Veiligheidsplan</option>
                </select>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="cf_message">'
.$label_message.':</label>
            <div class="controls">
                <textarea name="message" id="cf_message">'
.$form_data['message'].'</textarea>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label">Formulier verzenden</label>
            <div class="controls">
                <button type="submit" id="cf_send" class="btn btn-large btn-primary" name="send">'
.$label_submit.'</button>
            </div>
        </div>
    </fieldset>
</form>'
;
    
    if($sent == true) {
        return $info;
    }
else {
        return $info.$email_form;
    }
}
add_shortcode('contact', 'phphulp_contact_form_sc');

?>
Gewijzigd op 15/05/2013 00:28:44 door Kev Rama
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.