Php script verwerkt data van contactformulier niet
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
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.
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.
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
Gewijzigd op 13/05/2013 19:19:32 door Ger van Steenderen
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
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:
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
Heb er nu dit van gemaakt (naast de rest dus). En heb de een reset functie toegevoegd.
Code (php)
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
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');
}
?>
// 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
deze).
Even een advies, zorg dat je nogmaals valideert in PHP, ook al valideer je met JS, ook dat kan gemanipuleerd worden.
Je maakt het jezelf te moeilijk, tenminste als je dezelfde plugin als ik gebruik (Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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">';
?>
//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.
Code (php)
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
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');
?>
/*
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