Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skrypt czasowy.
Forum PHP.pl > Forum > PHP
Marysza
Witam!

Mam taki problem. Otóż potrzebny mi był skrypt php do czasowego usuwania danych z bazy danych SQL. Więc zrobiłem coś takiego:

  1. <?php
  2.  
  3. /**
  4.  * @author Marysza
  5.  * @copyright 2010
  6.  */
  7.  
  8.  
  9. while (1) {
  10.  
  11. $seconds = 43200;
  12. sleep(10);
  13. $odbc = odbc_connect("BAZA_DANYCH", "ID_SQL", "PW_SQL");
  14. odbc_exec($odbc, "TRUNCATE TABLE VOTELOG");
  15. print ("DO NOT CLOSE THIS WINDOW! AND KEEP EBENEZER SELECTED! \r\n");
  16. @exec("C:\\WINDOWS\\io.exe \"Voting is now allowed. Please vote for the server for KC!\"");
  17. @exec("C:\\WINDOWS\\io.exe \"Voting is now allowed. Please vote for the server for KC!\"");
  18. sleep($seconds);
  19.  
  20. }
  21.  
  22. ?>


Z tym że skrypt ten usuwa dane z całej tabeli co 12 godzin, nie o takie rozwiązanie mi chodziło...

Chodzi mi o to aby zrobić coś w stylu "Vote Reward System". Czyli gracze głosują na serwer co 12 godzin, na stronkach takich jak http://xtremetop100.com po czym dostają punkty premium za które kupuje się itemki w grze. No ale mniejsza o to.


Oto zrzut ekranu z mojego SQL'a :


Wyjaśnienie:
strAccountID - ID konta z którego został wysłany głos na serwer.
CurrentTime - Jest to czas w którym gracz wysłał głos.
vLink - Link od głosu na serwer. (Jest ich parę)
NextTime - Następna data kiedy gracz może oddać swój głos.

Chodzi mi dokładnie o to, aby skrypt sprawdzał osobno każdego gracza kiedy oddał głos, ponieważ na stronkach typu xtremetop100 głos zapisywany jest na IP (Jeden głos z jednego IP co 12h).

Przy tym ustawieniu każdy gracz może oddać głos co 12h, ponieważ co 12h resetowana jest tabela "VoteLog". Problem tkwi w tym że nawet jeżeli gracz nie odda głosu na właściwej stronie dostanie punkty za oddanie głosu.

Proszę o pomoc!

Z góry uprzejmie dziękuje!

Pozdrawiam!

================================================================================


Panowie pomocy!

Nie jest to trudne, dodam że resztę mam już zrobioną. Zależy mi jedynie na tym skrypcie.

Może jakieś podpowiedzi? Cokolwiek...
fander
No, po pierwsze php ma w ustawieniach czas na wykonanie skryptu, czyli while(1) nie będzie ci działało.
Jeśli chcsz wywoływać skrypt co jakiś cas to użyj crona
co do usuwania robisz skrypt.php w którym masz

Kod
<?php
$odbc = odbc_connect("BAZA_DANYCH", "ID_SQL", "PW_SQL");
odbc_exec($odbc, "DELETE FROM VOTELOG where adddate(CurrentDate(), INTERVAL 12 HOUR) <= now()");
?>

i w cronie ustawiasz aby ten skrypt wykonywał się co 10 min

a w skrypcie do sprawdzania czy ktoś może zagłosować czy nie sprawdzasz czy jego id znajduje się w tabelce VOTELOG

Pozdrawiam
Marysza
Masz na myśli cos takiego?

  1. <?php
  2.  
  3. /**
  4.  * @author Jaybird
  5.  * @copyright 2010
  6.  */
  7.  
  8. if(!defined('Panel'))
  9. die("You cannot access this page directly.");
  10.  
  11. if(empty($_SESSION['account']))
  12. die("You must be logged in to view this page.");
  13.  
  14. print '<center><b>Please vote for some quick KC. You may vote once every 24 hours per voting Link.</b></center><br /><br />';
  15. if (!isset($_POST['submit'])) {
  16. print '<center><form method="post" action=""><select size="1" name="VLink">
  17. <option value="1">Jag Top list</option>
  18. <option value="2">Top Of Games</option>
  19. <option value="3">MMORPG Top List</option>
  20. <option value="4">Game Sites 100</option>
  21. <option value="5">GTop 100</option>
  22. </select> ' . '<input type="submit" name="submit" value="Vote"></form></center>';
  23. } else {
  24.  
  25. switch($_POST['VLink']){
  26. case '1': $vlink = 'http://www.jagtoplist.com/in.php?site=13797'; break;
  27. case '2': $vlink = 'http://topofgames.com/index.php?do=votes&id=19233'; break;
  28. case '3': $vlink = 'http://www.mmorpgtoplist.com/in.php?site=28640'; break;
  29. case '4': $vlink = 'http://www.gamesites100.net/in.php?site=19173&cookie_test=true'; break;
  30. case '5': $vlink = 'http://www.gtop100.com/in.php?site=46168'; break;}
  31.  
  32.  
  33.  
  34. $account = $_SESSION['account'];
  35. $h = "SELECT COUNT(*) AS \"ACCOUNTS\" FROM VOTELOG WHERE STRACCOUNTID = '$account' AND VLINK = '$vlink'";
  36. $v = odbc_exec($db->odbc, $h);
  37. $row = odbc_fetch_array($v);
  38.  
  39. if ($row['ACCOUNTS'] == '0') {
  40. $d = "SELECT KC FROM TB_USER WHERE STRACCOUNTID = '$account'";
  41. $o = odbc_exec($db->odbc, $d);
  42. while ($w = odbc_fetch_array($o)) {
  43. $okc = $w['KC'];
  44. $newkc = ($okc + '25');
  45. odbc_exec($db->odbc, "DELETE FROM VOTELOG WHERE STRACCOUNTID = '$account' AND VLINK = '$vlink'");
  46. odbc_exec($db->odbc, "UPDATE TB_USER SET KC = '$newkc' WHERE STRACCOUNTID = '$account'");
  47. $date = date('Ymd');
  48. $ndate = ($date + 1);
  49. $j = "INSERT INTO VOTELOG (strAccountID, CurrentTime, vlink, NextTime) VALUES ('$account', '$date', '$vlink', '$ndate')";
  50. odbc_exec($db->odbc, $j);
  51. $return = 'true';
  52. print '<script>document.location="' . $vlink . '";</script>';
  53. }
  54. }
  55.  
  56. $q = "SELECT * FROM VOTELOG WHERE STRACCOUNTID = '$account'";
  57. $e = odbc_exec($db->odbc, $q);
  58. while ($r = odbc_fetch_array($e)) {
  59. $time = explode("20100", $r['time']); // Time the Last Vote Happened.
  60. $CTime = explode("20100", date('Ymd')); // Current Time
  61. $TimeCheck = ($CTime[1] + 1);
  62.  
  63. if ($r['CurrentTime'] == $r['NextTime']) {
  64. $d = "SELECT KC FROM TB_USER WHERE STRACCOUNTID = '$account'";
  65. $o = odbc_exec($db->odbc, $d);
  66. while ($w = odbc_fetch_array($o)) {
  67. $okc = $w['KC'];
  68. $newkc = ($okc + '25');
  69. odbc_exec($db->odbc, "DELETE FROM VOTELOG WHERE STRACCOUNTID = '$account' AND VLINK = '$vlink'");
  70. odbc_exec($db->odbc, "UPDATE TB_USER SET KC = '$newkc' WHERE STRACCOUNTID = '$account'");
  71. $date = date('Ymd');
  72. $ndate = ($date + 1);
  73. $j = "INSERT INTO VOTELOG (strAccountID, CurrentTime, vlink, NextTime) VALUES ('$account', '$date', '$vlink', '$ndate')";
  74. print '<script>document.location="' . $vlink . '";</script>';
  75. odbc_exec($db->odbc, $j);
  76. $return = 'true';
  77. }
  78.  
  79. } else {
  80.  
  81. if ($r['CurrentTime'] > $r['NextTime']) {
  82. $d = "SELECT KC FROM TB_USER WHERE STRACCOUNTID = '$account'";
  83. $o = odbc_exec($db->odbc, $d);
  84. while ($w = odbc_fetch_array($o)) {
  85. $okc = $w['KC'];
  86. $newkc = ($okc + '25');
  87. odbc_exec($db->odbc, "DELETE FROM VOTELOG WHERE STRACCOUNTID = '$account' AND VLINK = '$vlink'");
  88. odbc_exec($db->odbc, "UPDATE TB_USER SET KC = '$newkc' WHERE STRACCOUNTID = '$account'");
  89. $date = date('Ymd');
  90. $ndate = ($date + 1);
  91. $j = "INSERT INTO VOTELOG (strAccountID, CurrentTime, vlink, NextTime) VALUES ('$account', '$date', '$vlink', '$ndate')";
  92. print '<script>document.location="' . $vlink . '";</script>';
  93. odbc_exec($db->odbc, $j);
  94. $return = 'true';
  95. }
  96.  
  97. } else {
  98. $return = 'false';
  99. }
  100.  
  101. if($return = 'false')
  102. die("<center><b>You may not vote twice for the same site within 12 hours.</b></center><br />");
  103. }
  104. }
  105.  
  106.  
  107. }
  108.  
  109. ?>
CuteOne
eee... zadałeś pytanie jak odpalać funkcje, która usunie z tabeli wpisy co 12h, więc powiedz mi gdzie w Twoim skrypcie jest na to odp?

ps. wygoogluj sobie coś na temat cronjobów, poszukaj(jeżeli nie masz na serwerze) darmowego crona i odpalaj skrypt usuwający tą tabelę.
fander
Tak kolego z tym że tutaj nie potrzebujesz crona, dlaczego ? ponieważ sprawdzasz przy "zagłosowaniu" czy w przeciągu określonego czasu nie było już oddanego głosa na danym portalu. Jeśli w przeciągu 12h był już oddany to wyświetlasz komunikat o tym że nie można zagłosować, jeśli nie to aktualizujesz votelog.
Możesz to tak rozwiązać, ale w tym rozwiązaniu nie potrzebujesz do tego crona.
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.