Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Instrukcja if, jak jej użyć?
Forum PHP.pl > Forum > Przedszkole
cascader
Witam! Jakiś czas temu zacząłem zabawe z PHP.

Bawie się w edytowanie przeglądarkowego silnika gry online. Mój problem jest taki, że w przeglądzie gry, gdy wyślę ludzi/wojsko/flotę czy co tam sobie wymyślę na inną osadę/miasto/planete/galaktykę, pokazują mi się dwie informacje na stronie głównej: o tym kiedy wojsko/flota dotrze do celu i druga informacja kiedy wojsko/flota wróci ( o ile wróci, to zależy od wyniku starcia). Chciałbym żeby pokazywała mi się tylko jedna informacja: kiedy wojsko/flota dotrą do celu i dopiero po dotarciu do celu pokazywałaby się zamiast starej informacji nowa informacja. Dość trudno mi to wytłumaczyć, chociaż wydaje mi się, że to jest dość prosto zrobić.
plik php odpowiadający za przykładową misję:

  1. <?php
  2.  
  3. class MissionCaseStayAlly extends MissionFunctions
  4. {
  5. function __construct($Fleet)
  6. {
  7. $this->_fleet = $Fleet;
  8. }
  9.  
  10. function TargetEvent()
  11. {
  12. $this->setState(FLEET_HOLD);
  13. $this->SaveFleet();
  14. }
  15.  
  16. function EndStayEvent()
  17. {
  18. $this->setState(FLEET_RETURN);
  19. $this->SaveFleet();
  20. }
  21.  
  22. function ReturnEvent()
  23. {
  24. $LNG = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
  25. $StartName = $GLOBALS['DATABASE']->getFirstCell("SELECT name FROM ".PLANETS." WHERE id = ".$this->_fleet['fleet_end_id'].";");
  26.  
  27. $Message = sprintf ($LNG['sys_tran_mess_back'], $StartName, GetStartAdressLink($this->_fleet, ''));
  28. SendSimpleMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_time'], 5, $LNG['sys_mess_tower'], $LNG['sys_mess_fleetback'], $Message);
  29.  
  30. $this->RestoreFleet();
  31. }
  32. }


Czyli na moje oko to powinno wyglądać tak:
Flota/wojsko leci na cel X, jeśli wykona to co ma wykonać dopiero wtedy ma się pokazać, że flota/wojsko wraca.
Próbowałem trochę z instrukcją warunkową if, nie wiem czy akurat wybrałem to co potrzeba, wiem, że to są same podstawy, no ale jednak człowiek czasem potrzebuje pomocy a myślę, że od tego jest ten dział. Poza tym kto pyta nie błądzi wink.gif.
Moim zdaniem powinno to wyglądać mniej więcej tak:

  1. if flota/ statki dolecą
  2. {
  3. flota/statki powraca.
  4. }

Czy dobrze kombinuję?

Z góry dziękuję za odpowiedzi (krytyczne w stosunku do mojej osoby jak i pomocne:) )
Damonsson
W bazie danych po przyleceniu floty, musisz wykonać jakiś update, dzięki któremu będziesz wiedział, że flota doleciała. Zakładam, że w tym skrypcie już jest jakieś pole, które zmienia się, kiedy flota doleci na planetę, nie musi to być konkretnie kolumna "CZY FLOTA DOLECIAŁA" i możliwe wartości 0/1. Tylko, może to być coś, co jak już pisałem pewnie jest, np zniszczenia floty i defaultowo jest to np NULL, a po doleceniu Twojej floty, zamienia się w 0 lub jakąś inną liczbę. Po prostu szukasz takiej kolumny, której wartość się z nimi po doleceniu floty. I wtedy robisz Twój IF, np:


  1. $FlotaDoleciala = $GLOBALS['DATABASE']->getFirstCell("SELECT KolumnaPoKtórejPoznaszŻeFlotaDoleciała FROM ".PLANETS." WHERE id = ".$this->_fleet['fleet_end_id'].";");

o ile to zapytanie Ci zwróci to co trzeba, nie znam tych konstrukcji.

No i dalej robisz
  1. if ($FlotaDoleciala !== NULL) { // NULL, FALSE, 0, czy cokolwiek innego co zwróci baza, dla stanu gdy flota nie doleciała.
  2. $Message = sprintf ($LNG['sys_tran_mess_back'], $StartName, GetStartAdressLink($this->_fleet, ''));
  3.  
  4. SendSimpleMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_time'], 5, $LNG['sys_mess_tower'], $LNG['sys_mess_fleetback'], $Message);
  5. } else {
  6.  
  7. echo 'statki powracaja';
  8. }
cascader
W bazie danych mam zakładkę fleets, gdzie myślę powinno to być, jest pole jak "fleet_mess". Po wysłaniu floty na taką misję jest wartość 0, gdy flota doleci wartość zmienia się na 1, myslę, że to jest za to odpowiedzialne. Postanowiłem popracować nad inną misją niż poprzednio, bo mam większą wiedze o tej misji co się dzieje tutaj.
oto kod:

  1. class MissionCaseTransport extends MissionFunctions
  2. {
  3. function __construct($Fleet)
  4. {
  5. $this->_fleet = $Fleet;
  6. }
  7.  
  8. function TargetEvent()
  9. {
  10. $StartPlanet = $GLOBALS['DATABASE']->getFirstRow("SELECT name FROM ".PLANETS." WHERE `id` = '". $this->_fleet['fleet_start_id'] ."';");
  11. $StartName = $StartPlanet['name'];
  12. $StartOwner = $this->_fleet['fleet_owner'];
  13.  
  14. $TargetPlanet = $GLOBALS['DATABASE']->getFirstRow("SELECT name FROM ".PLANETS." WHERE `id` = '". $this->_fleet['fleet_end_id'] ."';");
  15. $TargetName = $TargetPlanet['name'];
  16. $TargetOwner = $this->_fleet['fleet_target_owner'];
  17.  
  18. $LNG = $this->getLanguage(NULL, $StartOwner);
  19. $Message = sprintf($LNG['sys_tran_mess_owner'], $TargetName, GetTargetAdressLink($this->_fleet, ''), pretty_number($this->_fleet['fleet_resource_metal']), $LNG['tech'][901], pretty_number($this->_fleet['fleet_resource_crystal']), $LNG['tech'][902], pretty_number($this->_fleet['fleet_resource_deuterium']), $LNG['tech'][903]);
  20. SendSimpleMessage($StartOwner, 0, $this->_fleet['fleet_start_time'], 5, $LNG['sys_mess_tower'], $LNG['sys_mess_transport'], $Message);
  21. if ($TargetOwner != $StartOwner)
  22. {
  23. $LNG = $this->getLanguage(NULL, $TargetOwner);
  24. $Message = sprintf($LNG['sys_tran_mess_user'], $StartName, GetStartAdressLink($this->_fleet, ''), $TargetName, GetTargetAdressLink($this->_fleet, ''), pretty_number($this->_fleet['fleet_resource_metal']), $LNG['tech'][901], pretty_number($this->_fleet['fleet_resource_crystal']), $LNG['tech'][902], pretty_number($this->_fleet['fleet_resource_deuterium']), $LNG['tech'][903] );
  25. SendSimpleMessage($TargetOwner, 0, $this->_fleet['fleet_start_time'], 5, $LNG['sys_mess_tower'], $LNG['sys_mess_transport'], $Message);
  26. }
  27.  
  28. $this->StoreGoodsToPlanet();
  29. $this->setState(FLEET_RETURN);
  30. $this->SaveFleet();
  31. }
  32.  
  33.  
  34. function EndStayEvent()
  35. {
  36. return;
  37. }
  38.  
  39. function ReturnEvent()
  40. {
  41. $LNG = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
  42. $StartName = $GLOBALS['DATABASE']->getFirstCell("SELECT name FROM ".PLANETS." WHERE id = ".$this->_fleet['fleet_start_id'].";");
  43. $Message = sprintf($LNG['sys_tran_mess_back'], $StartName, GetStartAdressLink($this->_fleet, ''));
  44. SendSimpleMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_time'], 5, $LNG['sys_mess_tower'], $LNG['sys_mess_fleetback'], $Message);
  45. $this->RestoreFleet();
  46. }
  47. }


Po linii 34 próbowałem dopisać

  1. $FlotaDoleciala = $GLOBALS['DATABASE']->getFirstCell("SELECT fleet_mess FROM ".FLEETS." WHERE id = ".$this->_fleet['fleet_end_id'].";");
  2. if ($FlotaDoleciala !== NULL) { // NULL, FALSE, 0, czy cokolwiek innego co zwróci baza, dla stanu gdy flota nie doleciała.
  3. $Message = sprintf ($LNG['sys_tran_mess_back'], $StartName, GetStartAdressLink($this->_fleet, ''));
  4.  
  5. SendSimpleMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_time'], 5, $LNG['sys_mess_tower'], $LNG['sys_mess_fleetback'], $Message);
  6. } else {
  7.  
  8. echo 'return';
  9. }

jednak to nie działa ;/ Wydaje mi się, że w bazie danych znalazłem odpowiednie pole, jednak nie iwem co tu nie działa. Dalej na stronie głównej mam informacje : flota X doleci na Y za Z czasu.
i druga wiadomość: flota X powraca z Y za Z czasu.
A chciałem zrobić tak jak powinno być- po pierwszej informacji ma się pojawiać druga.
Damonsson
Cytat
jest pole jak "fleet_mess". Po wysłaniu floty na taką misję jest wartość 0, gdy flota doleci wartość zmienia się na 1


A później robisz

  1. if ($FlotaDoleciala !== NULL) { // NULL, FALSE, 0, czy cokolwiek innego co zwróci baza, dla stanu gdy flota nie doleciała.


0 / 1 / NULL - 0 występuje w bazie danych gdy flota nie doleciała / 1 występuje w bazie danych gdy flota doleciała / NULL - nigdy nie występuje w bazie danych, więc if nigdy nie będzie spełniony.

1. Upewnij się, że jak flota jeszcze nie doleciała to zwracana jest wartość '0'. Czyli :

  1. $FlotaDoleciala = $GLOBALS['DATABASE']->getFirstCell("SELECT fleet_mess FROM ".FLEETS." WHERE id = ".$this->_fleet['fleet_end_id'].";");
  2. var_dump($FlotaDoleciala); // To wywalisz po upewnieniu się, że jest 0.
  3. die; // To wywalisz po upewnieniu się, że jest 0.
  4. if ($FlotaDoleciala !== NULL) { // NULL, FALSE, 0, czy cokolwiek innego co zwróci baza, dla stanu gdy flota nie doleciała.


2. Jeśli zwracane jest 0. To nie możesz sprawdzać czy zwracane jest NULL, tylko właśnie to 0, które oznacza, że flota nie doleciała, a więc:

  1. if ($FlotaDoleciala !== '0') { // NULL, FALSE, 0, czy cokolwiek innego co zwróci baza, dla stanu gdy flota nie doleciała.


napisałem Ci to w komentarzu przecież, NULL było przykładowe, bo nie wiedziałem co tam siedzi w bazie.
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.