Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odliczanie w czasie rzeczywistym dla wielu zdarzeń!
Forum PHP.pl > Forum > PHP
nikestylex7
Witam mam taki problem ponieważ napisałem skrypt który będzie odliczał czas użytkownikowi. Wszystko działa lecz napotkałem problem gdyż jak są trzy lub więcej takich zdarzeń na stronie czyli odliczanie większej ilości ludzi to skrypt działa tylko do jednej osoby. Div z id czas jest w powtarzany tyle ile jest użytkowników. Pewnie chodzi tutaj o to że każdy użytkownik ma to same id diva. Męczę się z tym skryptem 6 godzin i na razie witać to co widać. Pomoże ktoś?wink.gif

  1. $pozostalo = 134343444;
  2.  
  3. print "<script type='text/javascript'>
  4. function czas()
  5. {
  6. var a = ".$pozostalo.";
  7. var aCzas = new Date();
  8. var prz = Math.floor(aCzas.getTime()/1000);
  9. var pCzas = (a - prz);
  10. if (pCzas > 0)
  11. {
  12. var minuty = pCzas / 60;
  13. var godziny = pCzas / 60;
  14. var sLeft = Math.floor(pCzas % 60);
  15. var minLeft = Math.floor(minuty % 60);
  16. var hLeft = Math.floor(godziny / 60);
  17. if (minLeft < 10)
  18. minLeft = '0' + minLeft;
  19. if (sLeft < 10)
  20. sLeft = '0' + sLeft;
  21. return '0'+hLeft + ' : ' + minLeft + ' : ' + sLeft;
  22. }
  23. else
  24. a = document.getElementById('czas').innerHTML = 'Zwolniona';
  25. return a;
  26. }
  27. window.onload = function()
  28. {
  29.  
  30. idElement = 'czas';
  31. document.getElementById(idElement).innerHTML = czas();
  32. setInterval('document.getElementById(idElement).innerHTML = czas()', 1000);
  33.  
  34. };</script>";


  1. <div id='czas'></div>
filip11
Nie czytałem kodu, ale proponuję zapoznać się z tym: http://keith-wood.name/countdown.html może pomoże smile.gif Oczywiście nic nie zastąpi doświadczenia nabytego przy pisaniu skryptu samemu smile.gif No ale może liczy się też czas.

Napisz też czy dobrze zrozumiałem: to będzie taka lista z nazwami użytkowników i obok każdego będzie taki countdown?
Sephirus
Przede wszystkim - na pewno chodzi o ID diva wink.gif Każdy div musi mieć inne ID - możesz je uzależnić od na przykład ID usera (jesli to PHP):

  1. <div id="czas_<?php echo $id_user?>">(...)</div>


Ale nie do końca wiem co to za ludzie, którym odliczasz ten czas itd...

Po zapoznaniu się z twoim skryptem nie wyjaśnił mi on odpowiedzi na pytanie "co to za ludzie i o co chodzi" smile.gif
nikestylex7
Są to użytkownicy zablokowani na określony czas. W php nie będzie odliczania rzeczywistego dlatego napisałem to w js i nie wiem dlaczego ale js nie chce obsłużyć mi więcej zdarzeń nawet jak skrypt jest powielony i id użytkowników są inne. To skrypt a niżej zrzut source

  1. $idu = $dane['id'];
  2. print "<script type='text/javascript'><!--\n";
  3. print "function czas()
  4. {";
  5.  
  6. print "var a = ".$pozostalo.";";
  7. var aCzas = new Date();
  8. var prz = Math.floor(aCzas.getTime()/1000);
  9. var pCzas = (a - prz);
  10. if (pCzas > 0)
  11. {
  12. var minuty = pCzas / 60;
  13. var godziny = pCzas / 60;
  14. var sLeft = Math.floor(pCzas % 60);
  15. var minLeft = Math.floor(minuty % 60);
  16. var hLeft = Math.floor(godziny / 60);
  17. if (minLeft < 10)
  18. minLeft = '0' + minLeft;
  19. if (sLeft < 10)
  20. sLeft = '0' + sLeft;
  21. return '0'+hLeft + ' : ' + minLeft + ' : ' + sLeft;
  22. }
  23. else
  24. a = document.getElementById('czas".$idu."').innerHTML = 'Zwolniona';
  25. return a;
  26. }
  27. window.onload = function()
  28. {
  29.  
  30. idElement = 'czas".$idu."';
  31. document.getElementById(idElement).innerHTML = czas();
  32. setInterval('document.getElementById(idElement).innerHTML = czas()', 1000);
  33.  
  34. };";
  35. print "//--></script>\n";


  1. <script type='text/javascript'>
  2. function czas()
  3.  
  4. {var a = 1327341181;
  5.  
  6. var aCzas = new Date();
  7.  
  8. var prz = Math.floor(aCzas.getTime()/1000);
  9.  
  10. var pCzas = (a - prz);
  11.  
  12. if (pCzas > 0)
  13.  
  14. {
  15.  
  16. var minuty = pCzas / 60;
  17.  
  18. var godziny = pCzas / 60;
  19.  
  20. var sLeft = Math.floor(pCzas % 60);
  21.  
  22. var minLeft = Math.floor(minuty % 60);
  23.  
  24. var hLeft = Math.floor(godziny / 60);
  25.  
  26. if (minLeft < 10)
  27.  
  28. minLeft = '0' + minLeft;
  29.  
  30. if (sLeft < 10)
  31.  
  32. sLeft = '0' + sLeft;
  33.  
  34. return '0'+hLeft + ' : ' + minLeft + ' : ' + sLeft;
  35.  
  36. }
  37.  
  38. else
  39.  
  40. a = document.getElementById('czas120').innerHTML = 'Zwolniona';
  41.  
  42. return a;
  43.  
  44. }
  45.  
  46. window.onload = function()
  47.  
  48. {
  49.  
  50.  
  51.  
  52. idElement = 'czas120';
  53.  
  54. document.getElementById(idElement).innerHTML = czas();
  55.  
  56. setInterval('document.getElementById(idElement).innerHTML = czas()', 1000);
  57.  
  58.  
  59.  
  60. };</script>
  61. <tr id='ds' style='display:;'>
  62.  
  63. <td bgcolor='#FF0000'>Andrzej</td>
  64.  
  65. <td bgcolor='#FF0000'>1</td>
  66.  
  67. <td bgcolor='#FF0000'>1</td>
  68.  
  69. <td bgcolor='#FF0000'>6000.00 zł</td>
  70.  
  71. <td bgcolor='#FF0000'><div style='color:lime;' id='czas120'></div></td>


?

Tak filip11 użytkownicy i obok ten czas po prostu ma się odliczać tylko a on przechodzi od użytkownika któremu odlicza na tego który nowy został zablokowany tamtemu już się nie wyświetla odliczanie a temu co świeży odlicza.



?
Uriziel01
No jak będziesz ustawiał te id na sztywno zamiast je gdzieś przekazać to na pewno nigdy nie zadziała.
Proszę:
  1. <script type='text/javascript'>
  2. function czas(id_element)
  3.  
  4. {
  5.  
  6. var a = 1327361181;
  7.  
  8. var aCzas = new Date();
  9.  
  10. var prz = Math.floor(aCzas.getTime()/1000);
  11.  
  12. var pCzas = (a - prz);
  13.  
  14. if (pCzas > 0)
  15.  
  16. {
  17.  
  18. var minuty = pCzas / 60;
  19.  
  20. var godziny = pCzas / 60;
  21.  
  22. var sLeft = Math.floor(pCzas % 60);
  23.  
  24. var minLeft = Math.floor(minuty % 60);
  25.  
  26. var hLeft = Math.floor(godziny / 60);
  27.  
  28. if (minLeft < 10)
  29.  
  30. minLeft = '0' + minLeft;
  31.  
  32. if (sLeft < 10)
  33.  
  34. sLeft = '0' + sLeft;
  35.  
  36. document.getElementById(id_element).innerHTML = '0'+hLeft + ' : ' + minLeft + ' : ' + sLeft;
  37.  
  38. }
  39.  
  40. else
  41.  
  42. a = document.getElementById(id_element).innerHTML = 'Zwolniona';
  43.  
  44. return a;
  45.  
  46. }
  47.  
  48. window.onload = function()
  49.  
  50. {
  51.  
  52.  
  53.  
  54. idElement = 'czas120';
  55. setInterval('czas(idElement)', 1000);
  56. idElement2 = 'czas121';
  57. setInterval('czas(idElement2)', 1000);
  58.  
  59.  
  60. };</script>
  61. <tr id='ds' style='display:;'>
  62.  
  63. <td bgcolor='#FF0000'>Andrzej</td>
  64.  
  65. <td bgcolor='#FF0000'>1</td>
  66.  
  67. <td bgcolor='#FF0000'>1</td>
  68.  
  69. <td bgcolor='#FF0000'>6000.00</td>
  70.  
  71. <td bgcolor='#FF0000'><div style='color:lime;' id='czas120'></div></td>
  72. <tr id='ds' style='display:;'>
  73.  
  74. <td bgcolor='#FF0000'>Adam</td>
  75.  
  76. <td bgcolor='#FF0000'>1</td>
  77.  
  78. <td bgcolor='#FF0000'>1</td>
  79.  
  80. <td bgcolor='#FF0000'>6000.00</td>
  81.  
  82. <td bgcolor='#FF0000'><div style='color:lime;' id='czas121'></div></td>
nikestylex7
Hmm zaraz to sprawdzę tylko liczba ludzi będzie sie zmieniać a nie chce z góry napisać 100x id element 1 .. 2.. 3 window.onload = function()

{



idElement = 'czas120';
setInterval('czas(idElement)', 1000);
idElement2 = 'czas121';
setInterval('czas(idElement2)', 1000);


}

Twój sposób działa ale jeśli będzie tak jak Ty napisałeś. Jak ja zrobię to w petli while i wydrukuje na ekranie dla każdego użytkownika który ma blokadę to odlicza jednemu i to jest ten błąd, że drukuje skrypt wiele razy lecz działa poprawnie dla 1 osoby. Zmieniłęm go trochę ale dalej to samo.

Przed pętlą while dałem
  1. $dane = mysql_fetch_assoc($mysqlq);
  2. $pozostalo = $dane['wyjdzieza'];
  3. print "<script type='text/javascript'>
  4. function czas(id_element)
  5. {
  6. var a = ".$pozostalo.";
  7.  
  8. var aCzas = new Date();
  9. var prz = Math.floor(aCzas.getTime()/1000);
  10. var pCzas = (a - prz);
  11. if (pCzas > 0)
  12. {
  13. var minuty = pCzas / 60;
  14. var godziny = pCzas / 60;
  15. var sLeft = Math.floor(pCzas % 60);
  16. var minLeft = Math.floor(minuty % 60);
  17. var hLeft = Math.floor(godziny / 60);
  18. if (minLeft < 10)
  19. minLeft = '0' + minLeft;
  20. if (sLeft < 10)
  21. sLeft = '0' + sLeft;
  22. document.getElementById(id_element).innerHTML = '0'+hLeft + ' : ' + minLeft + ' : ' + sLeft;
  23. }
  24. else
  25. a = document.getElementById(id_element).innerHTML = 'Zwolniona';
  26. return a;
  27. }</script>";


a to pętla

  1. while($dane = mysql_fetch_assoc($mysqlq)){
  2. $czas = mktime();
  3. if($dane['wyjdzieza'] > $czas){
  4. $idu = $dane['id'];
  5. print "<script type='text/javascript'>
  6. window.onload = function()
  7. {
  8. idElement".$idu." = 'czas".$idu."';
  9. setInterval('czas(idElement".$idu.")', 1000);
  10. };
  11. </script>";

.
.
.

dodam jeszcze że a czyli czas dla każdego użytkownika jest inny
Uriziel01
Najprościej będzie jeżeli będziesz wyciągnięte z bazy dane pakował do tablicy, tzn:
  1. var user = ['". $id ."', '" . $oczekiwany_czas . "'];

Potem po petli leciesz po elementach tablicy, przekazujac dane z niej do funkcji czas, tak aby kazdy mogl miec inne id oraz pozostaly czas smile.gif Nie mam teraz czasu aby ci coś przykładowego pokazać niestety. Bynajmniej zamiast:
  1. idElement = 'czas120';
  2. setInterval('czas(idElement)', 1000);
  3. idElement2 = 'czas121';
  4. setInterval('czas(idElement2)', 1000);

Stworzoną tablicę przekaż do nowej funkcji i ustaw tylko jeden 'setInterval' który będzie tę funkcję uruchamiał. W jej ciele zrób pętle po wszystkich elementach tablicy i dla każdego wywołuj funkcję `czas` z użyciem wartości z aktualnego elementu jako parametrów tej funkcji.
nikestylex7
Mógłbyś jak będziesz miał czas mi to rozpisać ponieważ chciałbym się tego nauczyć przećwiczyć ten przykład. Z góry dziękuje
Uriziel01
Zdajesz sobie sprawę że nie powinniśmy dawać tutaj gotowców ? wink.gif
Oczywiście musisz usunąć blok w którym na sztywno wpisałem dane które powinny być dociągane z bazy danych, i `odkomentować` linie odpowiedzialne za bazę właśnie.
  1. $js_code = '
  2. <script>
  3. var users= [];';
  4.  
  5. //////////////////////////////////////
  6. //$loop = 0;
  7. //while ($row = $wynik->fetch_assoc())
  8. //{
  9. // $js_code .= 'users[' . $loop . '] = ["' . $row['id'] . '","' . $row['czas'] . '"]';
  10. // $loop++;
  11. //}
  12. //////////////////////////////////////
  13.  
  14. //////////////////////////////////////
  15. $js_code .= '
  16. users[0] = ["120","1327549181"];
  17. users[1] = ["121","1327558184"];';
  18. //////////////////////////////////////
  19.  
  20. $js_code .= '
  21. function refresh_all_timers()
  22. {
  23. var size = users.length;
  24. for (x=0; x < size; x++)
  25. {
  26. czas("czas" + users[x][0],users[x][1]);
  27. }
  28. return true;
  29. }
  30. function czas(id,czas)
  31. {
  32. var a = czas;
  33. var aCzas = new Date();
  34. var prz = Math.floor(aCzas.getTime()/1000);
  35. var pCzas = (a - prz);
  36. if (pCzas > 0)
  37. {
  38. var minuty = pCzas / 60;
  39. var godziny = pCzas / 60;
  40. var sLeft = Math.floor(pCzas % 60);
  41. var minLeft = Math.floor(minuty % 60);
  42. var hLeft = Math.floor(godziny / 60);
  43. if (minLeft < 10)
  44. minLeft = \'0\' + minLeft;
  45. if (sLeft < 10)
  46. sLeft = \'0\' + sLeft;
  47. document.getElementById(id).innerHTML = \'0\'+hLeft + \' : \' + minLeft + \' : \' + sLeft;
  48. }
  49. else
  50. a = document.getElementById(id).innerHTML = \'Zwolniona\';
  51. return a;
  52. }
  53. setInterval("refresh_all_timers()",1000);
  54. </script>';
  55.  
  56. echo $js_code;
  57.  
  58. <tr id='ds' style='display:;'>
  59. <td bgcolor='#FF0000'>Andrzej</td>
  60. <td bgcolor='#FF0000'>1</td>
  61. <td bgcolor='#FF0000'>1</td>
  62. <td bgcolor='#FF0000'>6000.00 zł</td>
  63. <td bgcolor='#FF0000'><div style='color:lime;' id='czas120'></div></td>
  64.  
  65. <tr id='ds' style='display:;'>
  66. <td bgcolor='#FF0000'>Adam</td>
  67. <td bgcolor='#FF0000'>1</td>
  68. <td bgcolor='#FF0000'>1</td>
  69. <td bgcolor='#FF0000'>6000.00 zł</td>
  70. <td bgcolor='#FF0000'><div style='color:lime;' id='czas121'></div></td> ";
nikestylex7
mam jeszcze problem wyskakuje mi błąd Call to a member function fetch_assoc() przecież $row jest pobierany z $wynik tablicy asociacyjnej więc nie wiem co jest

  1. if(isSet($_GET['page'])){
  2. $strr = (int)$_GET['page'] - 1;
  3. $mysqlq = mysql_query("SELECT * FROM user WHERE wiezienie>'0' ORDER by wiezienie DESC, przydomek ASC, user ASC LIMIT ".$strr.",10");
  4. }
  5. else{
  6. $mysqlq = mysql_query("SELECT * FROM user WHERE wiezienie>'0' ORDER by wiezienie DESC, przydomek ASC, user ASC LIMIT 0,10");
  7. }
  8.  
  9. while($dane = mysql_fetch_assoc($mysqlq)){
  10. $czas = mktime();
  11. if($dane['wyjdzieza'] > $czas){
  12. $idu = $dane['id'];
  13. $wynik = mysql_query("SELECT id, wyjdzieza FROM user WHERE wiezienie>'0'");
  14. $js_code = '
  15. <script>
  16. var users= [];';
  17.  
  18. $loop = 0;
  19. while ($row = $wynik->fetch_assoc())
  20. {
Uriziel01
Przed linią:
  1. while($dane = mysql_fetch_assoc($mysqlq)){


zrób var_dump($mysqlq); i zobacz sobie wynik. Zapewne nie jest to poprawny uchwyt.
nikestylex7
dump zwraca resource(7) of type (mysql result)

Kombinowałem różnie
  1. if($result = mysql_query($mysqlq)){
  2. $loop = 0;
  3. while ($row = $result->fetch_assoc())
  4. {
  5. $js_code .= 'users[' . $loop . '] = ["' . $row['id'] . '","' . $row['wyjdzieza'] . '"];';
  6. $loop++;
  7. }
  8. }else{
  9. echo"Błąd!!!...";
  10. }


dalej ten sam blad Call to a member function fetch_assoc() on a non-object in a gdy zamienie $result->fetch_assoc() na mysql_fetch_assoc($result) to działa lecz wyświetla wtedy nieskończoną ilość wyników
sebekzosw
  1. <div class="Countdown" time="1327361181">12:54:71</div>
  2. <div class="Countdown" time="1327361181">12:54:71</div>
  3. <div class="Countdown" time="1327361181">12:54:71</div>
  4. <div class="Countdown" time="1327361181">12:54:71</div>


do tego funkcja each w jquery i to do setInterval 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.