kamilw
28.12.2007, 19:24:46
Witajcie,
Mam spory problem. Zrobiłem sobie pętle while. Generuje ona linie teksty. Chciałbym ją trochę opóźnić tz. pętelka wykona się raz poczeka x sekund i następnie znowu wykona. I tak w kółko. Czy jest to możliwe? Jeśli tak to jak?
Z góry dziękuje za pomoc.
PS. Szczęśliwego Nowego Roku.
czachor
28.12.2007, 19:27:51
sleep()Tylko nie wiem, co oznacza "w kółko", bo jak użytkownik wyłączy przeglądarkę, to pętla też skończy swoje.
kamilw
28.12.2007, 19:42:22
Mój Drogi opóźnia. Tylko gdy uruchomie skrypt to wszystkie opóźnienia są generowane. A dopiero potem wyswietlają się dane z pętli.
Ja chciałybym inaczej
Żeby każde powtórzenie wyświetliło tekst i poczekało x sekund.
Hazel
28.12.2007, 20:08:50
Z tego co się orientuję, to niestety w PHP to nie jest realne.
kamilw
28.12.2007, 20:13:05
Jeśli w php nie. To w jakim języku? javascript?
Hazel
28.12.2007, 20:16:03
Tak, javascript. Tam masz konstrukcje window.setTimeout i window.setInterval, odsyłam do wyszukiwarki po więcej informacji.
Liko
28.12.2007, 20:27:06
Cytat(Hazel @ 28.12.2007, 20:16:03 )

Tak, javascript. Tam masz konstrukcje window.setTimeout i window.setInterval, odsyłam do wyszukiwarki po więcej informacji.
Ja również odsyłam po więcej informacji Ciebie do manuala
PHP.
Kod w PHP:
<?php
for($iFoo = 0; $iFoo <= 10; $iFoo++) {
printf("Int: %s <br />", $iFoo);
}
?>
Hazel
28.12.2007, 20:32:31
Przykro mi, ale to tak nie działa. Wyświetla się wszystko naraz po 10x sekund, gdzie x to argument sleep().
A faktycznie jedynym sposobem na to, żeby strona wyswietlała się dynamicznie, jest używanie JavaScriptu.
Liko
28.12.2007, 20:35:43
Przykro mi to Ci mówić, ale działa. Lecz jeżeli używasz IE to musisz wysłać 256 bajtów wcześniej abyś zobaczył efekt. A więcej masz w dokumentacji:
Cytat
Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.
Server modules for Apache like mod_gzip may do buffering of their own that will cause flush() to not result in data being sent immediately to the client.
Even the browser may buffer its input before displaying it. Netscape, for example, buffers text until it receives an end-of-line or the beginning of a tag, and it won't render tables until the </table> tag of the outermost table is seen.
Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.
Mam nagrać Tobie film i pokazać localhosta?
Hazel
28.12.2007, 20:40:21
Nie wiem w czym leży problem, ale pod żadną przeglądarką nie działa tak jak powinno. Filmu nagrywać nie musisz, wierzę Ci, ale niestety u mnie nie działa nigdzie. Sprawdzałem pod FF, Operą, IE, Safari, Flock i wiecej mi się nie chciało. Po prostu u mnie to nie działa. Ani pod PHP 5, ani pod PHP 4.
Liko
28.12.2007, 20:45:11
Tak więc oboje mamy rację. Chodzi o to, że PHP wysyła dane, lecz przeglądarka ich nie wyrzuca, lub też drugi przypadek kiedy na serwerze w php.ini nie masz ustawione implicit_flush = on, output_buffering = off. Wtedy powinieneś widzieć zamierzony efekt.
Hazel
28.12.2007, 20:51:12
No już chciałem powiedzieć, że mnie przekonałeś, bo to faktycznie byłoby miłe i burzyłoby parę moich teorii na temat php, i umożliwiało znaczące działania bez js, więc byłem gotowy przyznac Ci rację z uśmiechem, ale niestety nawet po zmianie ustawień implicit_flush i output_buffering nic specjalnego się nie dzieje. A że PHP wysyła dane, to jest fakt, tak właśnie działa sleep(). Ale chodzi bardziej o efekt niż fakt...
Liko
28.12.2007, 21:05:18
Konkluzja ostateczna: za dużo zachodu, aby działało to u wszystkich. Także zwracam rację Hazelowi i przepraszam za porywczość. Jednak pomysł z wykorzystaniem JS znacznie prostszy i wygodniejszy w zastosowaniu.
kamilw
28.12.2007, 21:40:25
A możecie pomóć? Jestem zielony w js.
Hazel
28.12.2007, 21:51:53
<div id="przykladowy_div"> <script type="text/javascript"> function display()
{
document.getElementById("przykladowy_div").innerHTML += "dodany tekst";
}
window.setInterval(display, 1000);
</script>
Coś takiego, nie wiem, czy dokładnie o to chodzi. Jeśli nie, to daj kawałek kodu i będziemy radzić
kamilw
28.12.2007, 22:07:31
Jako że moja pętla jest skomplikowana daje prosty szkielet
<?
$i = 1;
while ($i <= 10) {
}
?>
Chciałbym żeby skrypt wyświetlił "1" poczekał x sekund,wyświetlił "2" itd.
Hazel
28.12.2007, 22:14:04
Podałem rozwiązanie. Stosuj setInterval, nie baw się w timeouty wewnątrz pętli, bo nic dobrego z tego nie wyjdzie. Daj cały kod, jeśli czegoś nie rozumiesz.
kamilw
28.12.2007, 22:18:00
Ale Twoje rozwiązanie nie działa. Wyświetli 1,2,3 i potem powtarza dodatkowy text. A ja chciałbym żeby wyświetliło 1 + ewentualny dodatkowy text wtedy poczekał i wyświetlił 2.
Hazel
29.12.2007, 09:32:38
Nie wiem czy dokładnie rozumiem, ale jak chcesz to możesz zmienić ten kod żeby nie wyświetlał samych liczb, tylko coś jeszcze...
<script type="text/javascript"> var counter = 0;
Update();
function Update()
{
if (counter<10)
{
counter++;
document.getElementById("cos").innerHTML=counter;
ID=window.setTimeout("Update();",1000);
}
}
kamilw
29.12.2007, 10:50:05
Nie, nie.
Mam w pętli php zmienną. I chciałbym tak.
Wyświetliło zmienną { Czyli wykonało
Poczekało { 1 raz pętle.
Wyświetliło zmienną { Czyli wykonało
Poczekało { 2 raz pętle.
........................
Tylko w formacie
zmienna <br />
zmienna </br>
Żeby nie podmnieniało tylko jedno pod drugim.
Hazel
29.12.2007, 10:52:04
<script type="text/javascript"> var counter = 0;
Update();
function Update()
{
if (counter<10)
{
counter++;
document.getElementById("cos").innerHTML+="<br>" + counter;
ID=window.setTimeout("Update();",1000);
}
}
edit: Do tego można dołożyć wykrywanie funkcjonalności metody getElementById:
<script type="text/javascript"> var counter = 0;
Update();
function Update()
{
if (counter<10)
{
if(document.getElementById)
{
counter++;
document.getElementById("cos").innerHTML+="<br>" + counter;
ID=window.setTimeout("Update();",1000);
}
else
{
document.write("
<br>" + counter);
ID=window.setTimeout("Update();",1000);
}
}
}
kamilw
29.12.2007, 11:23:43
No dzięki działa. A jak teraz do tego wsadzic inne dane niż liczby. Zaznaczam że mam pętle w php.
Hazel
29.12.2007, 11:28:47
Ergh...
Pisałem Ci n postów temu, żebyś lepiej dał cały kod php, opracowałem Ci cały js, a Ty mówisz mi teraz że nie o to chodzi
Daj ten kod php.
kamilw
29.12.2007, 14:04:54
<?php
$ciosu=$users[atk]-$zdarz[obr]; if($ciosu < 0){$ciosu=0; } //Cios postaci
$ciosp=$zdarz[atk]-$users[obr]; if($ciosp < 0){$ciosp=0; }//Cios potwora
$atakp=$users[hp];
$ataku=$zdarz[hp];
while ($a=1){
$ataku=$ataku-$ciosu;
$atakp=$atakp-$ciosp;
if($c==8){$ciosu=$ciosu*2;}
echo"<div id='useratak'><strong>$_SESSION[zalogowany]</strong> zadał cios"; if($c==8
){echo" krytyczny";} echo" dla <strong>$zdarz[nazwa]</strong> o wartosci <strong>$ciosu</strong>. <h id='hppot'>"; if($ataku < 0
){$ataku=0;} echo" $ataku</h><h id='hpusr'>"; if($atakp < 0
){$atakp=0;} echo" $atakp</h></div>"; if($c==8
){$ciosu=$ciosu/2;} if($ataku <= 0
){}else{echo"<div id='potworatak' ><strong>$zdarz[nazwa]</strong> zadał cios dla <strong>$_SESSION[zalogowany]</strong> o wartosci <strong>$ciosp</strong>. <h id='hppot'>"; if($atakp < 0
){$ataku=0;} echo" $ataku</h><h id='hpusr'>"; if($atakp < 0
){$atakp=0;} echo" $atakp</h></div>";}
if($ataku <= 0
){ echo"Wygrałes<br /> "; $kas=rand($zdarz[kas
], $zdarz[kasm
]); $kasu=$users[kas]+ $kas;
$dsw=$users[dsw]+ $zdarz[dsw];
$a = "UPDATE users SET hp='$atakp', kas='$kasu', dsw='$dsw', ruch='$ruch' WHERE login = '$_SESSION[zalogowany]'";
echo" zyskales: <strong>$kas$</strong><br/> Doświadczenie + $zdarz[dsw] ";
break; }
if($atakp <= 0
){ echo"Przegrałeś<br />";
$kas=rand($zdarz[kas
], $zdarz[kasm
]); $kasu=$users[kas]- $kas;
$dsw=$users[dsw]- $zdarz[dsw];
if($dsw < 0){$dsw=0; }
$a = "UPDATE users SET kas='$kasu', dsw='$dsw', ruch='$ruch', hp='$atakp' WHERE login = '$_SESSION[zalogowany]'";
echo" straciles: <strong>$kas$</strong><br/> Doświadczenie - $zdarz[dsw]";
break;}
}
?>
Wpadłem na inny pomysł. Wystarczy mi tylko zrobić żeby w divie o jakims tam id wyświetliiło zawartosc poczekało x sekund i wyswietliło zawartosc innego diva
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.