Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt, który zmieni wartość rekordu w bazie danych danych i go zmieni po 2 sekundach
Forum PHP.pl > Forum > PHP
Machro
Witam, szukam skryptu, który zmieni wartość rekordu w bazie danych danych i go zmieni po 2 sekundach.

Np. skrypt zmienia wartość na "tak", a jak miną 2 sekundy, to aby zmienił się on w bazie danych na "nie".

Da się tak zrobić?

Pozdrawiam.
.chudy.
Możesz zrobić tak:
1. zapytanie do bazy danych
2. sleep(2);
3. zapytanie do bazy danych
Machro
Cytat(.chudy. @ 15.12.2007, 15:52:54 ) *
Możesz zrobić tak:
1. zapytanie do bazy danych
2. sleep(2);
3. zapytanie do bazy danych


A skąd to wie, które instrukcje pod sleep ma wykonywać?
2 linijki instrukcji, 10, czy może wszystkie?
Nie za bardzo jasne to jest ... ; \

Ma ktoś może inny sposób?
Nattfarinn
  1. <?php
  2. sleep($ilosc_sekund);
  3. ?>

Wstrzymuje wykonywanie całego skryptu na czas podany jako argument (w sekundach). Więc wykonywane jest wszystko do momentu Sleep, odczekane dwie sekundy i skrypt leci dalej. Inne rozwiązanie ociera się już o AJAXa smile.gif.

A do czego potrzebne Ci takie coś? Może uda się zaleźć inne rozwiązanie smile.gif

Pozdrawiam,
-- Nattfarinn
Machro
Dobra, napiszę po co mi to jest, ale pewnie i tak nikt nie zrozumie :-)

Piszę grę internetową pod przeglądarkę i mam tam dział Miasto, gdzie gracze mogą chodzić i się spotykac online, jednak chcę wlasnie zrobic ograniczenia ruchu, czyli jeden ruch co 2 sekundy.

1. Osoba wykonuje ruch
2. Zapytanie robi blokadę na chodzenie na "tak"
3. Mijają 2 sekundy podczas ktorych gracz nie moze chodzic
4. Blokada w mysql zmienia się na "nie"
5. Gracz moze wykonac kolejny ruch
Nattfarinn
Cytat(Machro @ 15.12.2007, 18:23:09 ) *
1. Osoba wykonuje ruch
2. Zapytanie robi blokadę na chodzenie na "tak"
3. Mijają 2 sekundy podczas ktorych gracz nie moze chodzic
4. Blokada w mysql zmienia się na "nie"
5. Gracz moze wykonac kolejny ruch

Trochę bez sensu to rozwiązanie. O wiele lepiej będzie przechowywać w bazie czas, kiedy nastepny ruch jest możliwy i zamiast zmieniać wartość w bazie wielokrotnie, poprostu sprawdzać czy gracz nie wykonał ruchu za wcześnie (porównać obecny czas wykonywania ruchu z wartością z bazy mówiącą kiedy będzie mógł wykonać). Po poprawnym ruchu zmienić w bazie blokadę ruchu na czas: teraz + 2 sekundy i tak w kółko. smile.gif

Pozdrawim,
-- Nattfarinn
ayeo
Sorry, ale to bezsensu smile.gif
W tabeli z USERAMI zrób sobie kolumnę last_move i tam dawaj (może być time_stamp) poprostu datę i czas. Później tylko sprawdzasz czy minęły 2 sekundy od ostatniego ruchu, jeśli nie to dajesz komunikat lub czekasz sleep(2) i to tyle...
Po co wstawiać tak/nie questionmark.gif

EDIT: Nattfarinn mnie ubiegł winksmiley.jpg
Machro
Już tak robiłem jak piszecie, ale spotkalem sie z problemem - jak sprawdzić czy minęły 2 sekundy?
Nattfarinn
Cytat(Machro @ 15.12.2007, 18:33:50 ) *
Już tak robiłem jak piszecie, ale spotkalem sie z problemem - jak sprawdzić czy minęły 2 sekundy?

Nie napiszę przecież:

NOW() + 2 sekundy

A po co Ci sprawdzać czy upłynęły już dwie sekundy? Wystarczy sprawdzić czy czas już dawno minął czy jeszcze nie. Dla przykładu, jeśli przechowujesz w bazie czas w postaci Uniksowej, to po wykonanym ruchu zmieniasz starą wartość na: "time()+2;". Później jak osoba chce się poruszyć to sprawdasz czy time() jest większe czy mniejsze od wartości w bazie. Jeśli jest większe to znaczy że minęlo już wiecej niż 2 sekundy, jeśli jest mniejsze to ktoś klika zbyt szybko.

Pozdrawiam,
-- Nattfarinn
Machro
Cytat(Nattfarinn @ 15.12.2007, 18:37:27 ) *
A po co Ci sprawdzać czy upłynęły już dwie sekundy? Wystarczy sprawdzić czy czas już dawno minął czy jeszcze nie. Dla przykładu, jeśli przechowujesz w bazie czas w postaci Uniksowej, to po wykonanym ruchu zmieniasz starą wartość na: "time()+2;". Później jak osoba chce się poruszyć to sprawdasz czy time() jest większe czy mniejsze od wartości w bazie. Jeśli jest większe to znaczy że minęlo już wiecej niż 2 sekundy, jeśli jest mniejsze to ktoś klika zbyt szybko.

Pozdrawiam,
-- Nattfarinn


Mogę sobie sprawdzać, czy 4 < 5, ale to chyba nie będzie przecież działać z czasem?

if (time() > $row[mozliwy_ruch] )

Przecież to wykaże błąd :] Bo to nie są liczby, tylko mają jeszcze dwukropki itp ..
Nattfarinn
Cytat(Machro @ 15.12.2007, 18:40:19 ) *
if (time() > $row[mozliwy_ruch] )

Przecież to wykaże błąd :] Bo to nie są liczby, tylko mają jeszcze dwukropki itp ..

Jesteś pewien? tongue.gif time() zwraca czas uniksowy, czyli liczbę sekund które upłynęły od 1 stycznia 1970 roku. winksmiley.jpg To jest aktualnie bodajże 32-bitowy signed integer smile.gif
Machro
Zaraz to sprawdzę : ) I dam znac

Edit:

Mm, wygląda na to, że działa :-)
Zaraz tego użyję w grze.

Edit2:

Działa tylko, gdy
time() jest mniejsze od $linia[Mapa_mozliwy_ruch]

A powinno być większe .. Nie rozumiem

Edit3:

Dziala tylko tak:

  1. <?php
  2. if(time() < $linia[Mapa_mozliwy_ruch])
  3.  {
  4.  $blad_ruchu = "Mozliwy tylko jeden ruch na sekunde!";
  5.  }
  6. ?>


Gdy jest:

  1. <?php
  2. if(time() > $linia[Mapa_mozliwy_ruch])
  3.  {
  4.  $blad_ruchu = "Mozliwy tylko jeden ruch na sekunde!";
  5.  }
  6. ?>


To błąd pokazuje się zawsze gdy chcę sie ruszyc.
Nattfarinn
I działa dobrze. Nie wiem o co Ci chodzi właściwie teraz. Time() zwraca czas Teraz. W pierwszym przypadku komunikat wyświetli się tylko gdy czas odpowiedzialny za ruch jeszcze nie minął. W drugim pokaże się za każdym razem gdy czas minął. W czym więc rzecz?
Machro
Tak, już zauwazylem, ze to jednak nie jest błąd :-)
Troche za duzo w tym mieszalem i mi się wszystko pomieszalo

Dzieki z rady :-)
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.