Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX + PHP] Pobieranie danych i przesyłanie.
Forum PHP.pl > Forum > XML, AJAX
Gazder
Witam, jako, że jestem w tym dość zielony proszę o małą pomoc.
Chciałem stworzyć Formularz Kontaktowy przez AJAX'a w połączeniu z PHP. Wszystko szło sprawnie, do momentu testów biggrin.gif
Tyle co udało mi się na stukać:
AJAX:
  1. <script type="text/javascript">
  2. var XMLHttpRO = false;
  3.  
  4. function PrzetwarzajDane() {
  5. xmlHttpRO = GetXmlHttpObject();
  6. var name = document.contact.name.value;
  7. var subject = document.contact.subject.value;
  8. var address = document.contact.address.value;
  9. var body = encodeURIComponent(document.contact.body.value);
  10. xmlHttpRO.open("POST", "check_email.php");
  11. xmlHttpRO.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  12. XMLHttpRO.send('&name=' + name + '&subject=' + subject + '&address=' + address + '&body=' + body);
  13. xmlHttpRO.onreadystatechange = stateChanged;
  14. }
  15.  
  16. function stateChanged() {
  17. if (xmlHttpRO.readyState == 4 || xmlHttpRO.readyState == "complete") {
  18. document.getElementById("edytor").innerHTML=xmlHttp.responseText;
  19. }
  20. }
  21.  
  22. function GetXmlHttpObject() {
  23. var request = null;
  24. if (window.XMLHttpRequest) {
  25. request = new XMLHttpRequest();
  26. }
  27. else if (window.ActiveXObject) {
  28. request=new ActiveXObject("Microsoft.XMLHTTP");
  29. }
  30. return request;
  31. }
  32. </script>


check_email.php PHP:
  1. <?PHP
  2. $freaky['config']['to'] = 'bomba9871@wp.pl';
  3. if(isSet(!$_POST['name'] or !$_POST['subject'] or urldecode(!$_POST['body']))){
  4. echo("<html><script>alert('Nie mozna kontynuowac, przeoczyles/as wymagane pola!');</script></html>");
  5. }
  6. else{
  7. $freaky['header'] = 'From: $_POST['name'] <$_POST['address']>';
  8. $freaky['name'] = $_POST['name'];
  9. $freaky['subject'] = $_POST['subject'];
  10. $freaky['body'] = urldecode($_POST['body']);
  11. $contact = mail($freaky['config']['to'],$freaky['subject'],$freaky['body'],$freaky['header']);
  12. if($contact) {
  13. echo("<html><script>alert('Sukces! Informacje, ktore umiesciles w formularzu zostaly wyslane.');</script></html>");
  14. }
  15. else {
  16. echo("<html><script>alert('Blad! Nie można kontynuować(?).');</script></html>");
  17. }
  18. }
  19. ?>


PHP:
  1. <?PHP
  2. echo '<style type="text/css">.submit { width:150px;height:30px; }</style>
  3. Currently, all the fields are required for a fast response.<br /><br />
  4. <form name="contact" method="post" action="">
  5. <table border="0" cellpadding="4" cellspacing="1" width="100%">
  6. <tr><td colspan="2"><span style="font-weight:bold;">Contact Form</span></td></tr>
  7. <tr><td width="20%">Name</td><td width="80%"><input type="text" name="name" /></td></tr>
  8. <tr><td>Subject</td><td><input type="text" name="subject" /></td></tr>
  9. <tr><td>E-mail</td><td><input type="text" name="address" /></td></tr>
  10. <tr><td>Message</td><td><textarea cols="40" rows="10" name="body"></textarea></td></tr>
  11. <td><input type="button" value="Wyślij" onclick="PrzetwarzajDane(value);" /></td><td><input type="reset" value="Wyczyść" class="submit" /></td></tr>
  12. </table>';
  13. ?>


Co jest źle? Dlaczego przy próbie wysłania formularza nic nie następuje? Żadnych błędów, wiadomości a e-mail nie wychodzi.
Proszę o pomoc, z góry dziękuję.
amii
1. Podstawowa sprawa, gdzie masz odpalaną funkcję PrzetwarzajDane w Twoim skrypcie widzę tylko przypisanie
var XMLHttpRO = false;

2. Sprawdzaj też status odpowiedzi na zasadzie + obsługa błędów:
if (myrequest.readyState==4 && myrequest.status==200) {
//do sth
}
Gazder
Nie wiem dokładnie o co chodzi z tym pierwszym podpkt., ale skasowałem w tym wypadku FALSE.
A funkcję wywołuję tu:
  1. <td><input type="button" value="Wyślij" onclick="PrzetwarzajDane(value);" /></td><td><input type="reset" value="Wyczyść" class="submit" /></td></tr>

Co do drugiego podpkt. to dodałem ten nowy warunek.
Znalazłem jeszcze jeden mały błąd, ale w efekcie czego dalej nie działa.
Proszę o pomoc, wkleję to co zmieniłem.
  1. <script type="text/javascript">
  2. var XMLHttpRO;
  3.  
  4. function PrzetwarzajDane() {
  5. xmlHttpRO = GetXmlHttpObject();
  6. var name = document.contact.name.value;
  7. var subject = document.contact.subject.value;
  8. var address = document.contact.address.value;
  9. var body = encodeURIComponent(document.contact.body.value);
  10. xmlHttpRO.open("POST", "check_email.php");
  11. xmlHttpRO.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  12. XMLHttpRO.send('&name=' + name + '&subject=' + subject + '&address=' + address + '&body=' + body);
  13. xmlHttpRO.onreadystatechange = stateChanged;
  14. }
  15.  
  16. function stateChanged() {
  17. if ((xmlHttpRO.readyState == 4 || xmlHttpRO.readyState == "complete") && xmlHttpRO.status==200) {
  18. document.getElementById("edytor").innerHTML=xmlHttpRO.responseText;
  19. }
  20. }
  21.  
  22. function GetXmlHttpObject() {
  23. var request = null;
  24. if (window.XMLHttpRequest) {
  25. request = new XMLHttpRequest();
  26. }
  27. else if (window.ActiveXObject) {
  28. request=new ActiveXObject("Microsoft.XMLHTTP");
  29. }
  30. return request;
  31. }
  32. </script>


  1. <?PHP
  2. echo '<style type="text/css">.submit { width:150px;height:30px; }</style>
  3. Currently, all the fields are required for a fast response.<br /><br />
  4. <form name="contact" method="post" action="">
  5. <table border="0" cellpadding="4" cellspacing="1" width="100%">
  6. <tr><td colspan="2"><span style="font-weight:bold;">Contact Form</span></td></tr>
  7. <tr><td width="20%">Name</td><td width="80%"><input type="text" name="name" /></td></tr>
  8. <tr><td>Subject</td><td><input type="text" name="subject" /></td></tr>
  9. <tr><td>E-mail</td><td><input type="text" name="address" /></td></tr>
  10. <tr><td>Message</td><td><textarea cols="40" rows="10" name="body"></textarea></td></tr>
  11. <td><input type="button" value="Send" onclick="PrzetwarzajDane(value);" class="submit" /></td><td><input type="reset" value="Clear" class="submit" /></td></tr>
  12. </table></form>';
  13. ?>


  1. <?PHP
  2. $freaky['config']['to'] = 'bomba9871@wp.pl';
  3. if(isSet(!$_POST['name'] or !$_POST['subject'] or urldecode(!$_POST['body']))){
  4. echo("<html><script>alert('Nie mozna kontynuowac, przeoczyles/as wymagane pola!');</script></html>");
  5. }
  6. else{
  7. $freaky['header'] = 'From: $_POST['name'] <$_POST['address']>';
  8. $freaky['name'] = $_POST['name'];
  9. $freaky['subject'] = $_POST['subject'];
  10. $freaky['body'] = urldecode($_POST['body']);
  11. $contact = mail($freaky['config']['to'],$freaky['subject'],$freaky['body'],$freaky['header']);
  12. if($contact) {
  13. echo("<html><script>alert('Sukces! Informacje, ktore umiesciles w formularzu zostaly wyslane.');</script></html>");
  14. }
  15. else {
  16. echo("<html><script>alert('Blad! Nie można kontynuować(?).');</script></html>");
  17. }
  18. }
  19. ?>
amii
Uruchamiasz skrypt na localhost ?
1. Jeśli tak to poczytaj co piszą tutaj o statusie -> http://www.javascriptkit.com/jsref/ajax.shtml
2. Po za tym spróbuj wywalić: var XMLHttpRO;
3. encodeURIComponent - stosuj na wszystkie parametry, aktualnie tylko filtrujesz body
4. Co to za value jest przesyłane do PrzetwarzajDane w deklaracji funkcja nie przyjmuje żadnych parametrów
5. $freaky['header'] = 'From: $_POST['name'] <$_POST['address']>'; tu masz podwójne ciapki i w ogóle zły zapis albo escape albo stosuj naprzemiennie z "
powinno być tak:
  1. $freaky['header'] = "From:". $_POST['name'] . "<". $_POST['address'].">";
Gazder
Skrypty są na dedyku, więc wszystko powinno ładnie śmigać.
Dodałem poprawki i mam jeszcze jedno pytanie, za co odpowiada ten kawałek:
  1. function stateChanged() {
  2. if ((xmlHttpRO.readyState == 4 || xmlHttpRO.readyState == "complete") && xmlHttpRO.status==200) {
  3. document.getElementById("edytor").innerHTML=xmlHttpRO.responseText;
  4. }
  5. }

Chodzi konkretnie o:
...getElementById("edytor")...

Bo ja to skopiowałem z jakiegoś innego kodu który był w necie.

DNSy mi się zwaliły i nie mogę teraz sprawdzić czy skrypt już działa, jak wszytko będzie działać to dam znać na czym stoimy tongue.gif.
amii
Gazder tu jest pies pogrzebany smile.gif
Ten kod doczepia zwrócony przez php fragment do div z id=edytor, jeśli takiego nie masz to nie dziwne, że nie działa. Swoją drogą takie podstawy wypadałoby już znać bo bez tego tego nie zajedziesz.
Gazder
Aha, no to ładnie biggrin.gif
Stronka już mi działa, ale skrypt nie.

Amii czyli mam rozumieć że gdy dam np.:
  1. <td><div id="edytor">Tekst</div></tr>

To w tymże miejscu pojawi się wynik tego całego AJAX'a?
Czyli np. ujrzę:
Cytat
Blad: Nie można kontynuować, przeoczyłeś/aś wymagane pola!


Jeśli to tak ma działać, to trochę kiepawo, bo chciałem aby błędy nie były wypisywane w danym miejscu tylko wyskakiwały okienka alert z wynikiem AJAX'a (alert('Nie mozna kontynuowac, przeoczyles/as wymagane pola!')wink.gif

Co może być źle skoro dalej nie trybi?
Wkleje kody.

  1. <script type="text/javascript">
  2. function PrzetwarzajDane() {
  3. xmlHttpRO = GetXmlHttpObject();
  4. var name = encodeURIComponent(document.contact.name.value);
  5. var subject = encodeURIComponent(document.contact.subject.value);
  6. var address = encodeURIComponent(document.contact.address.value);
  7. var body = encodeURIComponent(document.contact.body.value);
  8. xmlHttpRO.open("POST", "check_email.php");
  9. xmlHttpRO.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  10. XMLHttpRO.send('&name=' + name + '&subject=' + subject + '&address=' + address + '&body=' + body);
  11. xmlHttpRO.onreadystatechange = stateChanged;
  12. }
  13.  
  14. function stateChanged() {
  15. if ((xmlHttpRO.readyState == 4 || xmlHttpRO.readyState == "complete") && xmlHttpRO.status==200) {
  16. document.getElementById("edytor").innerHTML=xmlHttpRO.responseText;
  17. }
  18. }
  19.  
  20. function GetXmlHttpObject() {
  21. var request = null;
  22. if (window.XMLHttpRequest) {
  23. request = new XMLHttpRequest();
  24. }
  25. else if (window.ActiveXObject) {
  26. request=new ActiveXObject("Microsoft.XMLHTTP");
  27. }
  28. return request;
  29. }
  30. </script>


  1. <?PHP
  2. echo '<style type="text/css">.submit { width:150px;height:30px; }</style>
  3. Currently, all the fields are required for a fast response.<br /><br />
  4. <form name="contact" method="post" action="">
  5. <table border="0" cellpadding="4" cellspacing="1" width="100%">
  6. <tr><td colspan="2"><span style="font-weight:bold;">Contact Form</span></td></tr>
  7. <tr><td width="20%">Name</td><td width="80%"><input type="text" name="name" /></td></tr>
  8. <tr><td>Subject</td><td><input type="text" name="subject" /></td></tr>
  9. <tr><td>E-mail</td><td><input type="text" name="address" /></td></tr>
  10. <tr><td>Message</td><td><textarea cols="40" rows="10" name="body"></textarea></td></tr>
  11. <td><input type="button" value="Send" onclick="PrzetwarzajDane();" class="submit" /></td><td><input type="reset" value="Clear" class="submit" /></td></tr>
  12. <td><div id="edytor">Tekst?</div></tr>
  13. </table></form>';
  14. ?>


  1. <?PHP
  2. $freaky['config']['to'] = 'xsalon@wp.pl';
  3. if(isSet(!$_POST['name'] or !$_POST['subject'] or urldecode(!$_POST['body']))){
  4. echo "<font color='red'>Blad:</font> Nie można kontynuować, przeoczyłeś/aś wymagane pola!";
  5. }
  6. else{
  7. $freaky['header'] = 'From: '.$_POST['name'].' <'.$_POST['address'].'>';
  8. $freaky['name'] = ''.$_POST['name'].'';
  9. $freaky['subject'] = ''.$_POST['subject'].'';
  10. $freaky['body'] = 'urldecode($_POST['body'])';
  11. $contact = mail($freaky['config']['to'],$freaky['subject'],$freaky['body'],$freaky['header']);
  12. if($contact) {
  13. echo "<font color='green'>Sukces!</font> Informacje, które umieściłeś w formularzu zostały wysłane.";
  14. }
  15. else {
  16. echo "<font color='red'>Blad:</font> Nie można kontynuować(?).";
  17. }
  18. }
  19. ?>


Odświeżam. Dalej potrzebuje pomocy.

Odświeżam. Dalej potrzebuje pomocy.
amii
Gazder popróbuj trochę sam masz tu proste tutoriale do AJAX:
http://www.w3schools.com/ajax/default.asp
http://www.javascriptkit.com/jsref/ajax.shtml
po polsku:
http://gajdaw.pl/ajax/wprowadzenie/p1.html

Od siebie dodam, że tu masz tak:
XMLHttpRO.send('&name=' + name + '&subject=' + subject + '&address=' + address + '&body=' + body);
a powinno być tak (poświęciłem na to pół minuty i zajrzałem w tutoriala):
XMLHttpRO.send('name=' + name + '&subject=' + subject + '&address=' + address + '&body=' + body);
Po za tym jeśli nie będzie działać pozmieniaj wszystko w/g przykładów z kursów i powstawiaj tylko swoje dane specyficzne dla formularza i wartości parametrów. Listuje błędy, testuj. To są absolutne podstawy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.