jQuery/Ajax submit naar post.php, maar krijg variabelen niet in de mail

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marjolein Boer

Marjolein Boer

20/01/2011 16:29:54
Quote Anchor link
Heel wat afgezocht op zoek naar een oplossing maar het lukt steeds maar niet. Wat doe ik fout?

Mijn jQuery:

jQuery('#contactform').submit(function() {
var voornaam = jQuery("input#voornaam").val();
var achternaam = jQuery("input#achternaam").val();
var email = jQuery("input#email").val();

var dataString = 'voornaam ='+ voornaam + ' achternaam =' + achternaam' email =' + email;

jQuery.ajax({
type: "POST",
url: "post.php",
data: dataString,
succes: function() {}
});
});

Mijn php:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$voornaam
= $_REQUEST['voornaam'];
$achternaam = $_REQUEST['achternaam'];

$tijd = time();
$datum = strftime('%d/%m/%y %H:%M', $tijd);
$headers = "From: ".$email;
$subject = "Bericht van Contactformulier";
$message = "Voornaam : $voornaam\nAchternaam : $achternaam";

mail('[email protected]', $subject, $message, $headers);
?>




Als ik dit verzend krijg ik in mijn email wel
Voornaam :
Achternaam :

maar de plek waar de variabelen moeten komen blijft leeg :(

Iemand een idee?
 
PHP hulp

PHP hulp

25/12/2024 05:19:20
 

20/01/2011 16:33:51
Quote Anchor link
Serialize.
Variabelen buiten quotes houden.
mail injections mogelijk.
Headers ontbreken?
 
Kris Peeters

Kris Peeters

20/01/2011 16:52:22
Quote Anchor link
Waar heb je zo-iets als voorbeeld gezien?

var dataString = 'voornaam ='+ voornaam + ' achternaam =' + achternaam' email =' + email;


Je moet die coderen zoals de variabelen in een url (maar dan niet een ? ipv. een eerste &)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
var dataString = 'voornaam='+ voornaam + '&achternaam=' + achternaam + '&email=' + email;



Jij hebt nu trouwens een vette parse error in die lijn; je ontbreekt een +.
 
Thijs Damen

Thijs Damen

20/01/2011 17:07:28
Quote Anchor link
Karl je zeurt weer eens lekker. Nooit dat jij het geleerd heb met 300 links in een keer.

Wat hij mist is gewoon '&' tags tussen z'n variablen.

Daarnaast: Waarom zou je serialize gebruiken?
Daarnaast: Waarom variablen uit de quotes halen? Das een convention. Meer niet. En als je iets gaat zeggen over een performance winst. Dat is op dit niveau absoluut niet van toepassing.
Daarnaast: Welke headers?

@Poster:
Wat je wel fout doet is het volgende:
"Succes" is in het engels "success". Die succes: function() { } zal dus niet aangeroepen worden.
 

20/01/2011 18:03:04
Quote Anchor link
Thijs Damen op 20/01/2011 17:07:28:
Karl je zeurt weer eens lekker. Nooit dat jij het geleerd heb met 300 links in een keer.

Driehonderd links in één keer? Hmm... Ik denk dat je bedoelt dat ik naar Google verwijs over mail injections? Dat heb ik dus wel op die manier geleerd... Er is genoeg over te vinden, vanuit veel verschillende bronnen. Dus wat maakt het uit of ik hier een selectie dump of dat iemand gewoon zelf effe lekker zoekt.

Thijs Damen op 20/01/2011 17:07:28:
Wat hij mist is gewoon '&' tags tussen z'n variablen.

Dat is naïef.

Thijs Damen op 20/01/2011 17:07:28:
Daarnaast: Waarom zou je serialize gebruiken?

Daarnaast vind ik dit verband niet zo heel lekker. Ik zou eerder dus gebruiken. Maar goed, waarom serialze? Laten we eens de omschrijving van de jQuery docs bekijken:
jQuery docs over serialize:
The .serialize() method creates a text string in standard URL-encoded notation. It operates on a jQuery object representing a set of form elements. The form elements can be of several types:

Aha, dat is mooi. We krijgen dus een van een form element de data terug, die gelijk goed ge-encoded is. We hoeven dus niet zelf (moeilijk doen) alle elementen bij langs in het form om te kijken wat hun waarde is (wat soms ook weer op een speciale manier moet). De data is ook nog eens veilig om te versturen.
Stel, iemand vult bij voornaam dit in: Jan & Piet.
De string zou dan bij jouw dus dit worden: voornaam=Jan & Piet&email...
Het gedeelte '& Piet' zal dus bij jou oplossing wegvallen. Misschien verslikken sommige servers zich er wel over. Data / url encoding is niet voor niets. Het is ervoor om te zorgen dat de data veilig aankomt. Misschien stopt iemand wel een umlaut in zijn naam. Nou, volgens mij kan jij niet garanderen dat de data goed aankomt.
Daarom serialize.

Thijs Damen op 20/01/2011 17:07:28:
Daarnaast: Waarom variablen uit de quotes halen? Das een convention. Meer niet. En als je iets gaat zeggen over een performance winst. Dat is op dit niveau absoluut niet van toepassing.

Door variabelen buiten quotes te halen kan je bepaalde fouten voorkomen. Door de variabelen buiten quotes te halen zie je goed welke variabelen je gebruikt en of ze bijvoorbeeld geen tikfouten bevatten.
Ook is het goed om consequent te zijn. In javascript mag je geen variabelen binnen quotes te hebben, als je gewoon overal in elke taal die je gebruikt variabelen buiten quotes haalt (volgens mij is er geen enkele taal die je verplicht om variabelen binnen quotes te stoppen) krijg je ook geen fouten zoals de TS-er nu heeft, een plusje vergeten in de string.
Meestal denken mensen dat je variabelen verplicht binnen quotes moet doen, dus dan krijg je onzin als strtolower("$string");.

Thijs Damen op 20/01/2011 17:07:28:
Daarnaast: Welke headers?

De juiste mailheaders.
 
Thijs Damen

Thijs Damen

20/01/2011 18:19:22
Quote Anchor link
Karl,
De laatste paar posts die ik van jou heb gezien bestaan uit een paar links, wat dingen die een persoon niet of wel moet doen (zonder uitleg) en je verwacht dat iedereen je begrijpt.
Dit is precies wat je doet met een link naar serialize zonder verdere uitleg.
Hier heeft deze persoon absoluut niks aan. Doe dan op z'n minst een voorbeeld geven met hoe deze persoon het kan gebruiken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
var data = serialize($("#contatform");
jQuery.ajax({
    type: "POST",
    url: "post.php",
    data: data,
    success: function() {}
});


of iets overzichtelijkere code (wat mijn voorkeur heeft):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
jQuery.ajax({
    type: "POST",
    url: "post.php",
    data: {
        "voornaam": voornaam,
        "achternaam": achternaam,
        "email": email
    }
    success: function() {}
});


Also, Serialize kan hele vervelende bijwerkingen hebben.
Om trouwens die umlauts aan te laten komen moet je gewoon even je content-type goed zetten, maar dat wist jij natuurlijk al lang.

Over het quote verhaal; Het is en blijft een naming convention, ik zet ze buiten de quotes, maar er is niks op tegen om dit binnen de quotes te doen. Het vergeten van plusjes, of puntjes in PHP overkomt mij dagelijks, dat is iets menselijks. En gelukkig werk strtolower("$string") gewoon :).

Header linkje helemaal super man! vaker doen, uitleg geven.

Je post was verassend constructief. Behalve het aanhalen van mijn nederlands, we zijn heir niet op een taalpuristen forum geloof ik. Ik denk dat veel mensen er wat aan zullen hebben en de TS zal zeker velen malen meer kunnen met de uitleg die jij hebt gegeven in je 2e post dan in je 1e post.
 
Marjolein Boer

Marjolein Boer

20/01/2011 18:19:46
Quote Anchor link
Ok, naar aanleiding van bovenstaande advies & kijkend naar hier

kwam ik op het volgende:

jQuery:

var voornaam = encodeURIComponent($("#voornaam").val());
var achternaam = encodeURIComponent($("#achternaam").val());
var email = encodeURIComponent($("#email").val());
var dataString = 'voornaam='+voornaam+"achternaam="+achternaam+"email="+email;

jQuery.ajax({
type: "POST",
url: "post.php",
data: dataString,
success: function() {}
});


php:

$data["voornaam"]=$_POST["voornaam"];
$data["achternaam"]=$_POST["achternaam"];
$data["email"]=$_POST["email"];

$tijd = time();
$datum = strftime('%d/%m/%y %H:%M', $tijd);
$subject = "Bericht van Contactformulier";
$message = serialize($data);

mail('[email protected]', $subject, $message, 'From: '.$email);



Goede nieuws is dat ik eindelijk wel waardes krijg.
Slechte nieuws is dat het met rommel erbij wordt gemaild.
Wat ik binnen krijg:

a:3:{s:8:"voornaam";s:37:"[email protected]";s:10:"achternaam";N;s:5:"email";N;}

Terwijl ik op zoek ben naar een nette oplossing van:
voornaam : marjolein
achternaam : boer
Gewijzigd op 20/01/2011 18:22:17 door Marjolein Boer
 
Thijs Damen

Thijs Damen

20/01/2011 18:22:33
Quote Anchor link
Marjolein.
De geserializde string (geen idee of dat engels of nederlands is of beide niet) moet je eerst "unserializen".

in PHP doe je dat als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$array = unserialize($string)


Maar je maakt een grote fout. De bedoeling van Karl is om het formulier te serializen Voordat je het verstuurd. Niet nadat je het ontvangen hebt. Ik heb in een post hierboven een voorbeeld gegeven hoe je dit doet.
 
Marjolein Boer

Marjolein Boer

20/01/2011 18:25:30
Quote Anchor link
ah ok, duidelijk. Ik ga er even voor zitten.
 

20/01/2011 20:10:16
Quote Anchor link
Thijs Damen op 20/01/2011 18:19:22:
Karl,
De laatste paar posts die ik van jou heb gezien bestaan uit een paar links, wat dingen die een persoon niet of wel moet doen (zonder uitleg) en je verwacht dat iedereen je begrijpt.
Dit is precies wat je doet met een link naar serialize zonder verdere uitleg.
Hier heeft deze persoon absoluut niks aan. Doe dan op z'n minst een voorbeeld geven met hoe deze persoon het kan gebruiken.

(...)
Dat is het mooie aan handleidingen / docs / api. Daarin staat alles al uitgelegd. Als je even kijkt, dan zie je dat onder de uitleg van wat de functie doet, een voorbeeld staat.
Het is heel simpel: Lees wat de functie doet. Kijk hoe het voorbeeld is.
Ik plaats er expres geen rommel meer bij, aangezien het allemaal geconcentreerd staat op één plek. Volgens mij is dat duidelijker dan hier nog eens halve blaat te gaan doen. Als de handleiding gewoon wordt gelezen, dan is het duidelijk hoe die serialize werkt.
Dat zou jij ook eens moeten doen. Gewoon naar de handleiding kijken (want die weet per definitie hoe het werkt).
Het voorbeeld wat jij geeft:
Thijs Damen op 20/01/2011 18:19:22:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
var data = serialize($("#contatform");
jQuery.ajax({
    type: "POST",
    url: "post.php",
    data: data,
    success: function() {}
});

is fout.
Serialize zit in de namsepace van jQuery. Zoals je het nu zou doen krijg je een foutmelding. Je roept serialize aan op het form element. Dit staat allemaal in de documentatie.
Verder hebben blijkbaar jou voorbeelden niet veel geholpen.

Thijs Damen op 20/01/2011 18:19:22:
Also, Serialize kan hele vervelende bijwerkingen hebben.

Also, jij bent gek. Ik leg soms dan niet veel uit, ik verwijs wel naar de uitleg, of waar staat dat het fout is.

Thijs Damen op 20/01/2011 18:19:22:
Om trouwens die umlauts aan te laten komen moet je gewoon even je content-type goed zetten, maar dat wist jij natuurlijk al lang.

Toch houd ik mij ook liever aan de standaard en verstuur ik nette data.

Thijs Damen op 20/01/2011 18:19:22:
Over het quote verhaal; Het is en blijft een naming convention, ik zet ze buiten de quotes, maar er is niks op tegen om dit binnen de quotes te doen. Het vergeten van plusjes, of puntjes in PHP overkomt mij dagelijks, dat is iets menselijks.

Natuurlijk vergeet je het wel eens. Logisch. Het hele punt is dat je eigenlijk altijd moet concatten, als je gewoon leert dat dat moet, dan zul je ook veel minder fouten maken.
Thijs Damen op 20/01/2011 18:19:22:
En gelukkig werk strtolower("$string") gewoon :).

Ja, in een sloot springen werkt ook. Maar of het nut heeft en handig is...
Meestal niet. Dit soort constructies zijn gewoon onzin. Waarom zou je er nog quotes omheen zetten? Nergens voor, het is totaal nergens voor nodig.

Header linkje helemaal super man! vaker doen, uitleg geven.

Thijs Damen op 20/01/2011 18:19:22:
Je post was verassend constructief. Behalve het aanhalen van mijn nederlands, we zijn heir niet op een taalpuristen forum geloof ik. Ik denk dat veel mensen er wat aan zullen hebben en de TS zal zeker velen malen meer kunnen met de uitleg die jij hebt gegeven in je 2e post dan in je 1e post.

Kijk, jij stelt dat ik zeur, je zegt dat ik zeur. Dat is jou mening. Ik vind niet dat ik zeur. Ik vind dat ik meer zeg met die link dan alles wat jij hier in dit topic hebt gezegd. Wat ik ook vind is dat jou bepaalde woordkeuze niet helemaal lekker is in het verband. Dat geef ik dan ook aan, net zo goed zoals jij aangeeft dat jij vind dat ik zeur. Als je wilt zeuren dat ik zeur, doe het dan goed of doe het niet.
Natuurlijk had ik iets wat uitgebreider kunnen wezen over de headers. De enige headers die in dit topic voorkomen zijn de e-mail headers. Misschien waren die weggelaten vanwege irrelevantie. Verder ben ik van mening dat de documentatie van jQuery en google resultaten over mail injections genoeg informatie opleveren om van te leren. Ik kan hier nog wel eens gaan uitleggen hoe het moet, maar waarom zou ik als het allemaal uitgelegd is (en veel uitgebreider dan hier nuttig is om te doen).

Marjolein Boer op 20/01/2011 18:19:46:
Ok, naar aanleiding van bovenstaande advies & kijkend naar

Ik neem aan dat je nu ziet dat je alleen naar die ene pagina op de jQuery site hoeft te kijken?

Thijs Damen op 20/01/2011 18:22:33:
Marjolein.
De geserializde string (geen idee of dat engels of nederlands is of beide niet) moet je eerst "unserializen".

in PHP doe je dat als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$array = unserialize($string)


Maar je maakt een grote fout. De bedoeling van Karl is om het formulier te serializen Voordat je het verstuurd. Niet nadat je het ontvangen hebt. Ik heb in een post hierboven een voorbeeld gegeven hoe je dit doet.

Alsjeblieft, alsjeblieft, alsjeblieft! Lees de documentatie. Serialize doet geen php serialize maar die doet url encoding. Die zorgt er dus voor dat als iemand ? (Black sun with rays, \u2600 &#9728; Clear weather) in de tekst stopt, dat jij dat dan ook binnenkrijgt en geen rare rommel.
 
Marjolein Boer

Marjolein Boer

20/01/2011 21:42:59
Quote Anchor link
Nou jongens, dankzij jullie beiden ben ik eruit gekomen :-)

Uiteindelijke code:

jQuery:

var data = jQuery('#contactform').serialize();

jQuery.ajax({
type: "POST",
url: "post.php",
data: data,
success: function() {}
});


php:

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
<?php
$voornaam
= $_REQUEST['voornaam'];
$achternaam = $_REQUEST['achternaam'];
$bedrijf = $_REQUEST['bedrijf'];
$email = $_REQUEST['email'];
$telefoon = $_REQUEST['telefoon'];
$straat = $_REQUEST['straat'];
$postcode = $_REQUEST['postcode'];
$plaats = $_REQUEST['plaats'];
$provincie = $_REQUEST['provincie'];
$opmerking = $_REQUEST['opmerking'];

$tijd = time();
$datum = strftime('%d/%m/%y %H:%M', $tijd);
$subject = "Bericht van Contactformulier";
$message = "voornaam : ".$voornaam."\nachternaam : ".$achternaam."\nbedrijf : ".$bedrijf."\nemail : ".$email."\ntelefoon : ".$telefoon."\nstraat : ".$straat."\npostcode : ".$postcode."\nplaats : ".$plaats."\nprovincie : ".$provincie."\nopmerking : ".$opmerking;
    
mail('[email protected]', $subject, $message, 'From: '.$email);
?>




Heel erg bedankt!! :-D
 



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.