Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX, JS, PHP, MYSQL] Odświeżanie zawartości diva co jakiś czas.
Forum PHP.pl > Forum > XML, AJAX
Pental
Witam! To mój pierwszy temat (i post), ale mam nadzieję, że nie ostatni wink.gif .

Oto moja sytuacja: pragnę z pomocą obiektu XMLHttpRequest pobierać co, dajmy na to, 3 sekundy, dane z bazy danych mySQL. Całe zapytanie powinno odbywać się metodą post - dla bezpieczeństwa i zachowania ogólnej logiki.

Oto mój problem: Dane pobierają się tylko za pierwszym razem! Stworzyłem sobie nawet na potrzeby "debugowania" przycisk "odśwież" wywołujący funkcję aktualizowania. I co? Działa! Oznacza to, że robię błąd z wywoływaniem funkcji co te 3 sekundy. Najprawdopodobniej to jest źródłem owego problemu.

Najważniejsze fragmenty pochodzą z dwóch plików: oczko.js oraz oczkores.php . Wyglądają następująco:

oczkores.php:
  1. ...
  2. if ( isset( $_POST[ "r" ] ) )
  3. {
  4. $r = $_POST[ "r" ];
  5.  
  6. $sql_conn = mysql_connect( $sql_host, $sql_login, $sql_password );
  7. if ( !$sql_conn )
  8. {
  9. die( "Database fail!" );
  10. }
  11.  
  12. mysql_select_db( $sql_base );
  13.  
  14. if ( $r == "rooms" )
  15. {
  16. $query = "SELECT id FROM rooms WHERE game='oczko'";
  17. $query_res = mysql_query( $query );
  18.  
  19. $ark = 0;
  20. while( $id = mysql_fetch_row( $query_res ) )
  21. {
  22. $ar[ $ark ] = $id[ 0 ];
  23. $ark++;
  24. }
  25.  
  26. for( $i = 0; $i < $ark; $i++ )
  27. {
  28. $query = "SELECT login FROM users WHERE room='" . $ar[ $i ] . "'";
  29. $query_res = mysql_query( $query );
  30.  
  31. $a = "";
  32. while( $player = mysql_fetch_row( $query_res ) )
  33. {
  34. $a .= $player[ 0 ] . ", ";
  35. }
  36.  
  37. $b = substr( $a, 0, strlen( $a ) - 2 );
  38.  
  39. echo "<div class=\"scrollListItem\"><span class=\"scrollListItemNumber\">#" .
  40. $ar[ $i ] . "</span>" .
  41. $b . "</div>";
  42. }
  43. }
  44. mysql_close( $sql_conn );
  45. }


oczko.js (swoją drogą - jest tu kolorowanie składni js?)
  1. ....
  2.  
  3. function refreshList()
  4. {
  5. if ( xmlhttp.readyState == 4 || xmlhttp.readyState == 0 )
  6. {
  7. params = "r=rooms";
  8.  
  9. xmlhttp.open( "POST", "oczkores.php", true );
  10.  
  11. xmlhttp.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
  12. xmlhttp.setRequestHeader( "Content-length", params.length );
  13. xmlhttp.setRequestHeader( "Connection", "close" );
  14.  
  15. xmlhttp.onreadystatechange = refreshHandle();
  16.  
  17. xmlhttp.send( params );
  18. xmlhttp.overrideMimeType('text/html; charset=ISO-8859-2');
  19. }
  20. }
  21.  
  22. function refreshHandle()
  23. {
  24. if ( xmlhttp.readyState == 4 && xmlhttp.status == 200 )
  25. {
  26. var a = '<div class="scrollListItem1"><span class="scrollListItemNumber">Pokój:</span>Gracze:</div>' + xmlhttp.responseText;
  27. document.getElementById( "scrollList" ).innerHTML = a;
  28. setTimeout( "refreshList();", 3000 );
  29. }
  30. }
  31.  
  32. ....

Nazwa odświeżanego diva to, jak można się domyślić, scrollList.

Pozdrawiam,
Pental!
neovigo
Zamień

  1. setTimeout( "refreshList();", 3000 );

na

  1. setInterval( "refreshList();", 3000 );
Pental
Nie ma to sensu - funkcja będzie się wywoływać po pewnym czasie tysiąc razy na sekundę!

Nie takie jest moje zamierzenie.

Pozdrawiam,
Pental
mat-bi
Wujek Google gryzie? Przejrzyj sobie, co robią te funkcje...
nospor
nie: xmlhttp.onreadystatechange = refreshHandle();
a: xmlhttp.onreadystatechange = refreshHandle;

Poczytaj jak się tworzy callbacki smile.gif
Pental
Dobrze. Widzę, że pojawiło się kilka odpowiedzi. Odpowiadam więc i ja smile.gif .

Cytat
Wujek Google gryzie? Przejrzyj sobie, co robią te funkcje...

No tu mnie pan trochę zasmucił, a to dlatego, że wiem, co robią te funkcje. setInterval sprawi, że przy pierwszym wywołaniu refreshHandle zacznie się wywoływanie funkcji co jakiś czas. Po każdym wywołaniu nastąpi kolejny timer i kolejne wywołania co jakiś czas. Po x czasu zacznie się wywoływanie co y czasu funkcji ( x / y ) razy. Widać, że po pierwsze: Nie chce pan mi pomóc, a po drugie: Nie myśli pan logicznie i nie wie, co setInterval tu by zrobiło wink.gif . A po trzecie: Nie mam pojęcia dlaczego pan jeszcze nie został ukarany warnem za nabicie posta.
Cytat
nie: xmlhttp.onreadystatechange = refreshHandle();
a: xmlhttp.onreadystatechange = refreshHandle;

Poczytaj jak się tworzy callbacki smile.gif

Kurczę, nie wiem jak to możliwe, ale tak było i działało o.o . Teraz sobie odpalam, a tu nie działa. Usuwam nawiasy i znów działa o.o .

OMG, teraz działa, i w dodatku odświeża się cały czas. Nie wiem jak to możliwe, w każdym bądź razie wielkie dzięki nospor! Wiszę ci piwo.
nospor
Cytat
Nie wiem, czy wiesz, ale JS ignoruje takie błędy
tja.... jasne....

Chyba ty nie wiesz co oznacza taki kod:
xmlhttp.onreadystatechange = refreshHandle();
Taki kod spowoduje wywołanie funkcji refreshHandle już w tym momemncie a dla onreadystatechange przypisanie wyniku tej funkcji.
A zakładam, że Twoim życzeniem było raczej wykonanie funkcji refreshHandle dopiero na zdarzenie onreadystatechange smile.gif
Pental
Stary, zedytowałem już posta. Wcześniej serio działało, tylko tak, jak opisałem w pierwszym poście, czyli nie do końca po mojej myśli. Przepraszam za moje oburzenie smile.gif .

Nie mniej jednak, dziwna sprawa jak dla mnie. Nawet gdyby wywołało to refreshHandle, to i tak nie powinno nic odczytywać, bo musiałoby być opóźnienie z serwera = 0ms. A to niemożliwe.
nospor
Cytat
Nie mam pojęcia dlaczego pan jeszcze nie został ukarany warnem za nabicie posta.
mat-bi ty nabijaczu postów.... dostajesz ode mnie milion procent ostrzeżenia.... wink.gif

@Pental wyluzuj trochę.... kolega poprostu nie doczytał, że ty te setTimeout wykonujesz w sobie nawzajem i masz już zapętlenie. NIe oskarżaj ludzi co chcą ci pomóc o nabijanie postów a tym bardziej nie strasz ich ostrzeżeniami.

Czytaj też z uwagą wskazówki innych, bo widzę wkońcu jednak raczyłeś się dostosować do tego co ci napisałem i jednak działa (skreśliłeś też mądrzenie się o mojej niewiedzy w tym temacie) wink.gif


Cytat
Stary, zedytowałem już posta
Stary, jak pisałem swojego to Twój nie był jeszcze w edycji, nie komentuj tak bo to bezsensu. Na przyszłość nie usuwaj treści, tylko dopisuj kolejną
Pental
Cytat
mat-bi ty nabijaczu postów.... dostajesz ode mnie milion procent ostrzeżenia.... wink.gif

@Pental wyluzuj trochę.... kolega poprostu nie doczytał, że ty te setTimeout wykonujesz w sobie nawzajem i masz już zapętlenie. NIe oskarżaj ludzi co chcą ci pomóc o nabijanie postów a tym bardziej nie strasz ich ostrzeżeniami.

Zrozum, że ja tu oczekuję odpowiedzi, a ktoś mi wyjeżdża z "szukaj w google". Nie obchodzi mnie, że nie doczytał. Zamiast wnieść coś konstruktywnego to sobie jaja robi. Takich ludzi odnoszących się do googli jest pełno. Później ja szukam rozwiązania w googlach, a tu każdy "szukaj w google" ;/ . Cholernie denerwujący taki pseudo - trolling.

A "Pomógł" dałem ci już zanim zacząłeś pisać tego posta (zakładając, że pisałeś go mniej niż 5 minut...)

Jeśli chodzi o dostosowanie się do wskazówki... JS robi mi już niezłe wybryki. I na każdym etapie mnie zaskakuje biggrin.gif . Może to przyzwyczajenia z Javy, która była bardziej logiczna...
nospor
Cytat
Zrozum, że ja tu oczekuję odpowiedzi, a ktoś mi wyjeżdża z "szukaj w google". Nie obchodzi mnie, że nie doczytał.Zamiast wnieść coś konstruktywnego to sobie jaja robi.
Oj, długo bez ostrzeżenia to ty na tym forum nie zabawisz....
Ja w pierwszej chwili miałem napisać dokładnie to samo co mati. Ale przed napisaniem posta mimo wszystko jeszcze raz przeczytałem Twój kod i znalazłem właściwy błąd. mati może tego nie zauważył i na pewno nie robił sobie jaj z Ciebie. Wystarczy więc, że odpiszesz grzecznie, ze pętla jest tu i tu i że błąd lezy na pewno gdzieś indziej. Naprawdę nie ma potrzeby zastraszanie osób, którą chcą ci pomóc.

Cytat
A "Pomógł" dałem ci już zanim zacząłeś pisać tego posta (zakładając, że pisałeś go mniej niż 5 minut...)
Jak zacząłem pisać, to jeszcze nie było. A o pomógł wspomniałem tylko dlatego, że straszyłeś innych ostrzeżeniem. Zazwyczaj nie przykładam do tego większej wagi.

Cytat
Jeśli chodzi o dostosowanie się do wskazówki... JS robi mi już niezłe wybryki. I na każdym etapie mnie zaskakuje
Nie wiem za bardzo jaki tu wybryk mógł być. Dajesz nawias to wykonujesz od razu - logiczne. Nie dajesz nawiasu - tworzysz callback - też logiczne. To była właśnie ta wskazówka smile.gif
mat-bi
Ech, proszę.

Piszesz:
Cytat
Nie ma to sensu - funkcja będzie się wywoływać po pewnym czasie tysiąc razy na sekundę!
\

Więc cię grzecznie kieruję do google, by zobaczyć, co te funkcje robią. Tamtego nie sprawdziłem dokładnie, więc przepraszam, mój błąd. Ale to nie znaczy, ze mam dostawać warna za "nabijanie postów"
nospor
mat-bi no ale teraz to się zaczynasz pogrążać. Spójrz jeszcze raz na kod.
W kodzie jest już zrobiona pętla z setTimeout(). Ta pętla działa. Zamienienie tego na setInterval(), gdzie w pętli znowu będzie odpalane setInterval() niestety da efekt o jakim napisał Pental smile.gif
mat-bi
Oj, sorka, już się wyłączam. Kodu nie przejrzalem dokładnie, poleciałem po 1 odpowiedzi smile.gif
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.