Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana rekordu po określonym czasie
Forum PHP.pl > Forum > PHP
Dyqmin
Witam!
Chcę dodać do kodu skrypt, który by umożliwił dodanie monet dla gracza po określonym czasie.
Jest to swego typu "misja", w której czas do jej zakończenia musi być gdzieś przechowywany.

Próbowałem już nawet dodanie końca misji do rekordu w bazie danych, ale monety dodają się tylko po odświeżeniu strony.

  1. <?php
  2. $host = "localhost";
  3. $db_user = "root";
  4. $db_password = "";
  5. $db_name = "gra";
  6.  
  7. $connection = mysql_connect($host, $db_user, $db_password)
  8. or die ("Could not connect to server ... \n" . mysql_error ());
  9. mysql_select_db($db_name)
  10. or die ("Could not connect to database ... \n" . mysql_error ());
  11.  
  12. $wynik = mysql_query("SELECT monety FROM gracze WHERE nick ='domin' ")
  13. or die('Błąd zapytania');
  14.  
  15. if(mysql_num_rows($wynik) > 0) {
  16. while($r = mysql_fetch_assoc($wynik)) {
  17. $monety = $r['monety'];
  18. }
  19. }
  20.  
  21. echo "Masz aktualnie $monety monet <br />";
  22.  
  23. if(isset($_POST['SubmitButton'])){
  24. echo "Rozpocząłeś polowanie!";
  25. $sql = 'UPDATE gracze SET monety = monety + 1 WHERE nick = "domin" ';
  26. mysqli_query($sql, $connection);
  27.  
  28. }
  29. ?>


Dla zobrazowania: Klik submit -> rozpoczęcie misji, start licznika -> po zakończeniu (np. po 30s) dodają się monety

Proszę o nakierowanie mnie na jakąś dobrą drogę.
Z góry dzięki.
adrianpl20
użyj do tego javascriptu + ajaxa
Riggs
Lepiej będzie zakolejkować jakieś zadanie z czasem rozpoczęcia i z poziomu crona wywołanego co jakiś czas te monety dodawać... Ale to już zależy od architektury Twojego systemu.
Dyqmin
Nocka zarwana na ulepszanie kodu.

skrypt ajaxa (kod znalazłem i pozmieniałem na własne potrzeby):
  1. $(document).ready(function() {
  2.  
  3.  
  4. $("#FormSubmit").click(function (e) {
  5. e.preventDefault();
  6.  
  7. $("#FormSubmit").hide(); //hide submit button
  8.  
  9.  
  10. var myData = 'content_txt='+ $("#contentText").val(); //build a post data structure
  11. jQuery.ajax({
  12. type: "POST", // HTTP method POST or GET
  13. url: "re2.php", //Where to make Ajax calls
  14. dataType:"text", // Data type, HTML, json etc.
  15. data:myData, //Form variables
  16. success:function(response){
  17. $("#responds").append(response);
  18. $("#contentText").val(''); //empty text field on successful
  19. $("#FormSubmit").show(); //show submit button
  20.  
  21. },
  22. error:function (xhr, ajaxOptions, thrownError){
  23. $("#FormSubmit").show(); //show submit button
  24. alert(thrownError);
  25. }
  26. });
  27. });
  28. });
  29. function refresh_div() {
  30. jQuery.ajax({
  31. url:'re3.php',
  32. type:'POST',
  33. success:function(results) {
  34. jQuery(".result").html(results);
  35. }
  36. });
  37. }
  38.  
  39. t = setInterval(refresh_div,1000);

Jeden wysyła zadanie zmiany rekordu końca misji, drugi odświeża co sekunde z zapytaniem do bazy, czy koniec jest równy aktualnej dacie.
Kontynuacja index.php
  1. <?php
  2. $host = "localhost";
  3. $db_user = "root";
  4. $db_password = "";
  5. $db_name = "gra";
  6.  
  7. $connection = mysql_connect($host, $db_user, $db_password)
  8. or die ("Could not connect to server ... \n" . mysql_error ());
  9. mysql_select_db($db_name)
  10. or die ("Could not connect to database ... \n" . mysql_error ());
  11.  
  12. $wynik = mysql_query("SELECT monety FROM gracze WHERE nick ='domin' ")
  13. or die('Błąd zapytania');
  14.  
  15. if(mysql_num_rows($wynik) > 0) {
  16. while($r = mysql_fetch_assoc($wynik)) {
  17. $monety = $r['monety'];
  18. }
  19. }
  20.  
  21. echo "<div class=\"result\"></div>";
  22.  
  23. ?>
  24.  
  25. <div class="form_style">
  26. <button id="FormSubmit">Add record</button>
  27. </div>

re2.php
  1. <?php
  2. $username = "root"; //mysql username
  3. $password = ""; //mysql password
  4. $hostname = "localhost"; //hostname
  5. $databasename = 'gra'; //databasename
  6.  
  7. //connect to database
  8. $mysqli = new mysqli($hostname, $username, $password, $databasename);
  9.  
  10. $zero = "0000-00-00 00:00:00";
  11. $time = date('Y-m-d H:i:s', strtotime('+10 second'));
  12. $data = date('Y-m-d H:i:s');
  13.  
  14. $check = $mysqli->query("SELECT koniec FROM gracze WHERE nick = 'domin' ");
  15. while($row = $check->fetch_assoc())
  16. {
  17. $kuniec = $row["koniec"];
  18.  
  19. }
  20. if($kuniec!=$zero){
  21. echo "Aktualnie robisz zadanie";
  22. } else{
  23. $tez = $mysqli->query("UPDATE gracze SET koniec = '$time' WHERE nick = 'domin'");
  24. }
  25. ?>


re3.php
  1. <?php
  2. $username = "root";
  3. $password = "";
  4. $hostname = "localhost";
  5. $databasename = 'gra';
  6.  
  7. //connect to database
  8. $mysqli = new mysqli($hostname, $username, $password, $databasename);
  9. $dodaj = $mysqli->query("SELECT monety FROM gracze WHERE nick = 'domin' ");
  10. while($row = $dodaj->fetch_assoc())
  11. {
  12. echo 'Masz aktualnie '.$row["monety"].'monet';
  13.  
  14. }
  15. $zero = "0000-00-00 00:00:00";
  16. $data = date('Y-m-d H:i:s');
  17.  
  18. $check = $mysqli->query("SELECT koniec FROM gracze WHERE nick = 'domin' ");
  19. while($row = $check->fetch_assoc())
  20. {
  21. $time = $row["koniec"];
  22.  
  23. }
  24.  
  25.  
  26. if($time<=$data && $time != $zero){
  27. $tez = $mysqli->query("UPDATE gracze SET koniec = '$zero' WHERE nick = 'domin'");
  28. $dodaj = $mysqli->query("UPDATE gracze SET monety = monety + 1 WHERE nick = 'domin'");
  29. }
  30.  
  31. ?>


Zastanawiam się, czy te co sekundowe odświeżanie diva ajaxa będzie okej, czy nie będzie obciążało serwera.
Wybaczcie za to mieszanie mysql i mysqli, ale skupiłem się na rozbudowie tego skryptu, zamiast na wyszczupleniu kodu.
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.