Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][MySQL][PHP]Skrypt wykonuje się 2 razy
Forum PHP.pl > Forum > Przedszkole
goukan
Hello. Pokażę najpierw kody trzech plików:

formularz rejestracji:
  1. <img src="img/mono-icons/userplus32.png" class="box-icon" alt="pic"/>
  2. <h6>Szybka rejestracja</h6>
  3. <div class="box-divider"></div>
  4. <script type="text/javascript" src="js/register_form.js"></script>
  5. <form id="registerForm" action="#" method="post">
  6. <input type="hidden" value="includes/fast_register.php" name="send_register_form" id="send_register_form" />
  7. <div>
  8. <input name="fast_register_nick" id="register_nick" type="text" class="form-poshytip" title="Wpisz swój nick" />
  9. <label>Nick</label>
  10. </div>
  11. <div>
  12. <input name="fast_register_email" id="register_email" type="text" class="form-poshytip" title="Wpisz swój email" />
  13. <label>Email</label>
  14. </div>
  15. <p><input type="button" value="Rejestruj" name="register_submit" id="register_submit" /> <span id="register_error" class="warning">Message</span></p>
  16. </form>
  17.  
  18. <p id="register_success" class="success">Gratulacje! Zarejestrowałeś się.</p>


register_form.js (odbiera dane i przekazuje je dalej metodą post do pliku fast_register.php)
  1. $(document).ready(function(){
  2.  
  3. // hide messages
  4. $("#register_error").hide();
  5. $("#register_success").hide();
  6.  
  7. // on submit...
  8. $("#registerForm #register_submit").click(function() {
  9. $("#register_error").hide();
  10.  
  11. //required:
  12.  
  13. //register_name
  14. var name = $("input#register_nick").val();
  15. if(name == ""){
  16. $("#register_error").fadeIn().text("Wpisz swój nick.");
  17. $("input#register_nick").focus();
  18. return false;
  19. }
  20.  
  21. // register_email
  22. var email = $("input#register_email").val();
  23. if(email == ""){
  24. $("#register_error").fadeIn().text("Wpisz swój email.");
  25. $("input#register_email").focus();
  26. return false;
  27. }
  28.  
  29. // send mail php
  30. var sendMailUrl = $("#send_register_form").val();
  31.  
  32. // data string
  33. var dataString = 'fast_register_nick='+ name
  34. + '&fast_register_email=' + email;
  35.  
  36. $.ajax({
  37. type:"POST",
  38. url: sendMailUrl,
  39. data: dataString,
  40. success: function(response){
  41. var res = $.parseJSON(response);
  42. if(res.error !== undefined){
  43. $("#register_error").fadeIn().text(res.error);
  44. return false;
  45. } else {
  46. if(res.message) {
  47. $("#register_success").fadeIn();
  48. $("#registerForm").fadeOut();
  49. }
  50. }
  51.  
  52. }
  53. });
  54. });
  55.  
  56. // on success...
  57.  
  58. return false;
  59. });


fast_register.php (rejestracja konta)
  1. <?php
  2. include('config.php');
  3. include('function.php');
  4. if($_POST)
  5. {
  6. $data = date("Y-m-d H:i");
  7. $nick = protect($_POST['fast_register_nick']);
  8. $email = protect($_POST['fast_register_email']);
  9. $haslo = protect(passwordGenerator(6));
  10. $sql = mysql_query("select * from uzytkownik where username='$nick'");
  11. $result = mysql_num_rows($sql);
  12. if($result!=0)
  13. {
  14. return print json_encode(array("error"=>"Ten nick już istnieje."));
  15. }
  16. else
  17. {
  18. $from = 'Rejestracja na Moja Strona.';
  19. $subject = "Rejestracja na cake made!";
  20. $headers = "MIME-Version: 1.0\r\n";
  21. $headers .= "Content-type: text/html; charset=UTF-8\r\n";
  22. $headers .= "From: <".$from. ">" ;
  23. $msg = "Witaj, zarejestrowałeś się na stronie MadeCake! O to twoje wygenerowane hasło: $haslo <br>Oczywiście możesz je zmienić w panelu!";
  24.  
  25. mail($email, $subject, $msg, $headers);
  26. mysql_query("insert into uzytkownik values('','$nick','$haslo','$email','$data','')");
  27. return print json_encode(array("message"=>"Zarejestrowałeś się."));
  28. }
  29. }
  30. else
  31. {
  32. echo 'Nie masz tu wstępu kolego.';
  33. }
  34. ?>


No i problem jest taki że jeżeli uzupełnię formularz rejestracji, po czym kliknę button to skrypt wykonuję się 2 razy i nie mam pojęcia czemu;/ W chromie w zakładce Network widzę, że po kliknięciu buttona otwiera się 2 razy plik fast_register.php, który powoduje wrzucenie do bazy danych danego użytkownika 2 razy. To samo jest z login. Formularz, javascript, oraz skrypt logowania jest podobny i również w network widzę że plik który nadaję sesje użytkownika otwiera się 3 razy, każdy z tymi samymi danymi z formularza przesłane postem. Oczywiście taki problem wydłuża czas oczekiwania na pojawienie się odpowiedniego tekstu z błędem (jeżeli użytkownik o podanym nicku istnieje, lub są złe wprowadzone dane dla danego użytkownika podczas logowania). Proszę o pomoc

Chyba doszedłem do tego, że prawdopodobnie kawałek kodu z .js przy lini success: w ajaxie jest źle napisany. I myślę że przez tą funkcję otwiera się 2 razy plik i skrypt wykonuje się dwa razy.

Oryginalnie było tak:
  1. $.ajax({
  2. type:"POST",
  3. url: sendMailUrl,
  4. data: dataString,
  5. success: success()
  6. });
  7. });
  8. // on success...
  9. function success(){
  10. $("#contact_success").fadeIn();
  11. $("#contactForm").fadeOut();
  12. }


i jak jest to tak napisane to wykonuje się raz skrypt.

czytałem też o funkcji unbind, ale nie działa ona
Damonsson
jak dasz alert(0); zamiast $.ajax to ile razy się pokazuje alert?
goukan
również 2 razy
com
[JAVASCRIPT] pobierz, plaintext
  1. success: function(response){
  2. var res = $.parseJSON(response);
  3. if(res.error !== undefined){
  4. $("#register_error").fadeIn().text(res.error);
  5. return false;
  6. } else {
  7. if(res.message) {
  8. $("#register_success").fadeIn();
  9. $("#registerForm").fadeOut();
  10. }
  11. }
[JAVASCRIPT] pobierz, plaintext


To w takim razie co przez to chciałeś osiagnać?

W ajax do każdego masz przecież to tak:
[JAVASCRIPT] pobierz, plaintext
  1. var jqxhr = $.ajax( "example.php" )
  2. .done(function() {
  3. alert( "success" );
  4. })
  5. .fail(function() {
  6. alert( "error" );
  7. })
  8. .always(function() {
  9. alert( "complete" );
  10. });
[JAVASCRIPT] pobierz, plaintext
goukan
no to chciałem osiągnąć by wysyłało dane ajaxem i wywalało komunikat?
com
no ok, to w takim razie to chyba raczej tak:
[JAVASCRIPT] pobierz, plaintext
  1. success: function(response){
  2. var res = $.parseJSON(response);
  3. if(res.error){
  4. $("#register_error").fadeIn().text(res.error);
  5. return false;
  6. } else if(res.message) {
  7. $("#register_success").fadeIn();
  8. $("#registerForm").fadeOut();
  9. }
  10. }
[JAVASCRIPT] pobierz, plaintext


a najlepiej wrzuć alert zaraz po var res = $.parseJSON(response); i spr jak wygl wartość z res.error i res.message
goukan
res.error ma wartość - Ten nick już istnieje.
res.message ma wartość - zarejestrowałeś się.

i w zależności od tego czy podany nick istnieje już w bazie danych to wywala res.error, w przeciwnym wypadku res.message i również wywala te komunikaty dwa razy. (fast_register.php)
com
zgadza sie to ja wiem, ale chodzi o to że trzeba znaleźć przyczynne czemu robi to 2 razy dlatego chciałem żebyś sobie wpisał na sztywno i pokazał efekt...
goukan
  1. success: function(response){
  2. var res = $.parseJSON(response);
  3. console.log(res.error);
  4. console.log(res.message);
  5. if(res.error){
  6. $("#register_error").fadeIn().text(res.error);
  7. return false;
  8. } else if(res.message) {
  9. $("#register_success").fadeIn();
  10. $("#registerForm").fadeOut();
  11. }
  12. }


i w konsoli pojawia się 2 razy
  1. Ten nick już istnieje. register_form.js:41
  2. undefined register_form.js:42
  3. Ten nick już istnieje. VM850:41
  4. undefined


dlatego napisałem na forum bo ja nie mogę znaleźć przyczyny tego powtarzającego się wysyłania formularza. Jeszcze raz dodam, że szukałem na zagranicznych forach i tam bardzo często pomaga ludziom coś takiego jak: $('#registerForm').unbind('submit'); ale u mnie to nie działa
com
spróbuj dać zamiast :
if($_POST):

  1. if(isset($_POST['fast_register_nick']))
Damonsson
[JAVASCRIPT] pobierz, plaintext
  1. $("#registerForm #register_submit").click(function() {
  2. alert(0);
  3. });
[JAVASCRIPT] pobierz, plaintext

Cokolwiek (np alert jak wyżej) byś tam wstawił wykona się 2 razy prawda?

Coś łapie podwójne kliknięcie, a wtedy było ok, bo chyba wywołanie innej funkcji ( success() ) kończy poprzednią(?)
goukan
  1. $(document).ready(function(){
  2. $("#registerForm #register_submit").click(function() {
  3. alert(0);
  4. });
  5. return false;
  6. });


zostawienie tak zapisanego pliku register_form.js również skutkuje pojawieniem się 2 razy alertu...
nie mam pojęcia o co chodzi. hmm tak pomyślałem, że może to jest przyczyną ale pokażę. mój plik z formularzem rejestracji ma również w sobie formularz do logowania:
  1. <div id="reel">
  2. <div class="slides_container">
  3. <div class="slide-box">
  4. <div class="box-container">
  5. <img src="img/mono-icons/check32.png" class="box-icon" alt="pic"/>
  6. <h6>Logowanie</h6>
  7. <div class="box-divider"></div>
  8. <script type="text/javascript" src="js/login_form.js"></script>
  9. <form id="loginForm" action="#" method="post">
  10. <input type="hidden" value="includes/login.php" name="send_login_form" id="send_login_form" />
  11. <div>
  12. <input name="nick" id="login_nick" type="text" class="form-poshytip" title="Wpisz swój nick" />
  13. <label>Nick</label>
  14. </div>
  15. <div>
  16. <input name="password" id="login_password" type="password" class="form-poshytip" title="Wpisz swoje hasło" />
  17. <label>Hasło</label>
  18. </div>
  19. <input type="button" value="Zaloguj" name="login" id="login_submit" /> <span id="login_error" class="warning">Message</span>
  20. </form>
  21. <p id="login_success" class="success">Zalogowałeś się. <a href="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>">Odswież stronę.</a></p>
  22. </div>
  23. <!-- ----------------------------------------------------------------------------------------------------------------- -->
  24. <div class="box-container">
  25. <img src="img/mono-icons/userplus32.png" class="box-icon" alt="pic"/>
  26. <h6>Szybka rejestracja</h6>
  27. <div class="box-divider"></div>
  28. <script type="text/javascript" src="js/register_form.js"></script>
  29. <form id="registerForm" action="#" method="post">
  30. <input type="hidden" value="includes/fast_register.php" name="send_register_form" id="send_register_form" />
  31. <div>
  32. <input name="fast_register_nick" id="register_nick" type="text" class="form-poshytip" title="Wpisz swój nick" />
  33. <label>Nick</label>
  34. </div>
  35. <div>
  36. <input name="fast_register_email" id="register_email" type="text" class="form-poshytip" title="Wpisz swój email" />
  37. <label>Email</label>
  38. </div>
  39. <p><input type="button" value="Rejestruj" name="register_submit" id="register_submit" /> <span id="register_error" class="warning">Message</span></p>
  40. </form>
  41.  
  42. <p id="register_success" class="success">Gratulacje! Zarejestrowałeś się.</p>
  43. </div>
  44. </div>
  45. </div>
  46. <a href="#" class="prev"></a>
  47. <a href="#" class="next"></a>
  48. </div>


ale formularz logowania ma wszystkie id inaczej nazwane które również mam podłączone z podobnym plikiem js tyle że przy logowaniu wykonuje się cały skrypt 3 razy ;/
Damonsson
Coś musisz mieć namieszane w kodzie czego nie pokazujesz, bo tutaj ( http://jsfiddle.net/ZB4q5/ ) wykonuje się 1 raz
goukan
no widzę;/ w kodzie mam okej, nie mam pojęcia co może być nie tak. :| nie mam zielonego pojęcia co może być nie tak. może problem leży po stronie tego json_encode? co jest w login.php i fast_register.php. Ale jest to po to by dawało tekst do wyświetlenia kiedy jest błąd. Mój formularz kontaktowy który jest też na podstawie tych plików i tego formularza wysyła się raz, jednak tam nie ma tego json_encode.
dam wszystkie pliki jakie inculduje w index.php (gdzie jest ta rejestracja)

header.php
http://wklej.org/id/1199827/

panel_uzytkownika.php (gdzie jest formularz rejestracji i logowania)
http://wklej.org/hash/89c2aa1ee96/

footer.php
http://wklej.org/hash/9ca6e5b9a81/

register_form.js
http://wklej.org/hash/1b31c1af9a4/

login_form.js
http://wklej.org/hash/58bb4717158/

fast_register.php
http://wklej.org/hash/6899dc22b0e/

login.php
http://wklej.org/hash/8717e1e1b8b/
Damonsson
Podaj już przetworzony kod, czyli bez PHP sam HTML + JS. Najlepiej link online do strony, to spróbuję pomóc.

AJAX ani PHP nie ma nic wspólnego, jeśli zamiast

[JAVASCRIPT] pobierz, plaintext
  1. $.ajax({
  2.  
  3. type:"POST",
  4.  
  5. url: sendMailUrl,
  6.  
  7. data: dataString,
  8.  
  9. success: function(response){
  10.  
  11. var res = $.parseJSON(response);
  12.  
  13. if(res.error !== undefined){
  14.  
  15. $("#register_error").fadeIn().text(res.error);
  16.  
  17. return false;
  18.  
  19. } else {
  20.  
  21. if(res.message) {
  22.  
  23. $("#register_success").fadeIn();
  24.  
  25. $("#registerForm").fadeOut();
  26.  
  27. }
  28.  
  29. }
  30.  
  31.  
  32.  
  33. }
  34.  
  35. });
[JAVASCRIPT] pobierz, plaintext

wpisujesz

[JAVASCRIPT] pobierz, plaintext
  1. alert(0);
[JAVASCRIPT] pobierz, plaintext


i masz 2x alerta
goukan
Rozwiązane..
problemem okazała się ta linijka:
  1. <script type="text/javascript" src="js/register_form.js"></script>

przed formularzem. Po wstawieniu tej linijki do sekcji <head></head> wszystko działa.
Jakby ktoś wiedział czemu przez to, wysyłało dwa razy dane to niech napiszę.
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.