• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Strona nie odświeża rekordów za pierwszym razem, tak jakby skrypt nie był gotowy.

Object Storage Arubacloud
0 głosów
158 wizyt
pytanie zadane 22 sierpnia 2020 w PHP przez Kacperhehe Bywalec (2,930 p.)

Mam problem, ogólnie cały skrypt działa w pewnym sensie. Pod guzik jest dopisany "roll" który aktywuje nam przez request funkcje, wszystko byłoby fajnie ale pierwsze kliknięcie jakby nic nie robi, to znaczy. Dodaje mi rekord do bazy danych losuje liczbie itp. Ale nie odświeża się jakby strona, tabela która wyświetla mi punkty na stronie jak i aktywności jest bez tego rekordu który pojawia się jako nowy za 1 kliknięciem, za drugim gdy skrypt jest jakby w gotowości to dodaje mi punkty i aktywność. Zależy mi na tym żeby po kliknięciu od razu dodało nam tą aktywność i punkty użytkownikowi, bo na razie wygląda tak jakby nic się nie stało. 


Dokładniej można to zobaczyć na filmiku: https://i.imgur.com/CDR1Ddt.mp4

 

Skrypt:

          <form action="faucet" method="post">
           <h1 class="title counter is-size-1 mt-5">
            <?php
    if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['roll']))
    {
        func();
        unset($_POST['roll']);
    }
function func()
{
$db = mysqli_connect('localhost', 'root', '', 'app');
$db_activity = mysqli_connect('localhost', 'root', '', 'activity');

$dateFromDatabase = strtotime($_SESSION['last_faucet_claim']);
$dateTwelveHoursAgo = strtotime("-12 hours");

if ($dateFromDatabase >= $dateTwelveHoursAgo) {
    echo "Sorry, but you used the faucet not long ago";
}
else {
    $roll = rand(1,69998);
    echo $roll;
    $date = date('Y-m-d');
    switch ($roll) {
    case in_array($roll, range(1,69999)):
      $faucet_reward = $_SESSION['points'] + 10;
      // Update the points
      $sql = "UPDATE users SET points='$faucet_reward' WHERE id =  ".$_SESSION['id'];
      mysqli_query($db, $sql);
      // Add roll to the activity
      $sql = "INSERT INTO ".$_SESSION['username']." (title, description, timestamp, count_points) VALUES ('Faucet', 'You roll $roll on the faucet', '$date', 10)";
      mysqli_query($db_activity, $sql);
    break;
    case in_array($roll, range(70000, 89999)):
      $faucet_reward = $_SESSION['points'] + 15;
      // Update the points
      $sql = "UPDATE users SET points='$faucet_reward' WHERE id = ".$_SESSION['id'];
      mysqli_query($db, $sql);
      // Add roll to the activity
      $sql = "INSERT INTO ".$_SESSION['username']." (title, description, timestamp, count_points) VALUES ('Faucet', 'You roll $roll on the faucet', '$date', 15)";
      mysqli_query($db_activity, $sql);
    break;
    case in_array($roll, range(90000, 96999)):
      $faucet_reward = $_SESSION['points'] + 20;
      // Update the points
      $sql = "UPDATE users SET points='$faucet_reward' WHERE id = ".$_SESSION['id'];
      mysqli_query($db, $sql);
      // Add roll to the activity
      $sql = "INSERT INTO ".$_SESSION['username']." (title, description, timestamp, count_points) VALUES ('Faucet', 'You roll $roll on the faucet', '$date', 20)";
      mysqli_query($db_activity, $sql);
    break;
    case in_array($roll, range(97000, 98999)):
      $faucet_reward = $_SESSION['points'] + 50;
      // Update the points
      $sql = "UPDATE users SET points='$faucet_reward' WHERE id = ".$_SESSION['id'];
      mysqli_query($db, $sql);
      // Add roll to the activity
      $sql = "INSERT INTO ".$_SESSION['username']." (title, description, timestamp, count_points) VALUES ('Faucet', 'You roll $roll on the faucet', '$date', 50)";
      mysqli_query($db_activity, $sql);
    break;
    case in_array($roll, range(99000, 99998)):
      $faucet_reward = $_SESSION['points'] + 100;
      // Update the points
      $sql = "UPDATE users SET points='$faucet_reward' WHERE id = ".$_SESSION['id'];
      mysqli_query($db, $sql);
      // Add roll to the activity
      $sql = "INSERT INTO ".$_SESSION['username']." (title, description, timestamp, count_points) VALUES ('Faucet', 'You roll $roll on the faucet', '$date', 100)";
      mysqli_query($db_activity, $sql);
    break;
    }
}

};
            ?>
           </h1>
           <button class="button is-success is-large is-fullwidth is-rounded" name="roll">Roll the faucet</button>
          </form>

Skrypt na throwbin zeby wygodniej bylo czytac:
https://throwbin.io/24qVq0I

komentarz 23 sierpnia 2020 przez Filipczak Gaduła (4,020 p.)
Użyłbym na twoim miejscu javascriptu i gdy użytkownik kliknąłby przycisk wykonywałby się request do innego skryptu php oraz ten javascript zaaktualizowałby dane na tej stronie.

Jeśli chcesz wiedzieć więcej wygoogluj sobie AJAX
komentarz 23 sierpnia 2020 przez Filipczak Gaduła (4,020 p.)
a i jeszcze poczytaj o bind_param ponieważ dodawanie w ten sposób rekordów co ty jest niebezpieczne (ataki sql injection)
komentarz 24 sierpnia 2020 przez VBService Ekspert (253,340 p.)
edycja 24 sierpnia 2020 przez VBService

@Kacperhehe, Filmik zrobiony zbyt chaotycznie "obraz skacze", za szybko przełączasz ekrany, ale spoko jakoś obejrzałem do końca (pauzowanie co sekundę wink).

Ten kod co pokazałeś nie pozwala na znalezienie przyczyny Twojego problemu, zgaduję, że problem jest w miejscu gdzie robisz SELECT-a do bazy aby porać te dane:

no i dalej popełniasz ten sam błąd (już Tobie zwracałem uwagę w innym poście), że nie sprawdzasz czy If, czy w tym przypadku switch w zależności od danych wejściowych spełni warunek. W Twoim kodzie warunek spełnia tylko (ciągle), i tylko wyłącznie pierwszy case:

case in_array($roll, range(1,69999)):

dowód, losują się tylko liczby z tego przedziału: range(1,69999)

przez co gracze tylko dostają po 10 pkt. wink

komentarz 24 sierpnia 2020 przez Kacperhehe Bywalec (2,930 p.)
Wiem że jest rand do 69k ale to nie pytanie którę mam w poście :((
komentarz 24 sierpnia 2020 przez Kacperhehe Bywalec (2,930 p.)
I problem podejrzewam bardziej na post request, bo przeciez rekord po kliknieciu jest dodany do bazy danych ale nie jest odświeżany. próbowałem header(refresh:0)
komentarz 24 sierpnia 2020 przez Kacperhehe Bywalec (2,930 p.)

@VBService, A tak dla prostowania dlaczego mam do 69, dlatego żeby przy testowaniu funkcji nie dodawać do każdego case tego samego, lub dodać do jednego i czekać aż się wylosuje :] 

komentarz 24 sierpnia 2020 przez VBService Ekspert (253,340 p.)
edycja 24 sierpnia 2020 przez VBService

Skoro po pierwszym kliknięciu w button "Roll the faucet" pokazuje się w przeglądarce wylosowana liczba $roll, to już świadczy o tym, że post request, się wykonuje i ten kod też

    if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['roll']))
    {
        func();
        unset($_POST['roll']);
    }

co za tym idzie i funkcja func() jest "wywołana" i w niej wykonuje się kod

else {
    $roll = rand(1,69998);
    echo $roll;
    $date = date('Y-m-d');
    switch ($roll) {
    case in_array($roll, range(1,69999)):
      $faucet_reward = $_SESSION['points'] + 10;
      // Update the points
      $sql = "UPDATE users SET points='$faucet_reward' WHERE id =  ".$_SESSION['id'];
      mysqli_query($db, $sql);
      // Add roll to the activity
      $sql = "INSERT INTO ".$_SESSION['username']." (title, description, timestamp, count_points) VALUES ('Faucet', 'You roll $roll on the faucet', '$date', 10)";
      mysqli_query($db_activity, $sql);
    break;

z tego wnioskuje, że problem jest w kodzie  poniżej tego fragmentu (za tym kodem, "tak dla prostowania" wink),

           </h1>
           <button class="button is-success is-large is-fullwidth is-rounded" name="roll">Roll the faucet</button>
          </form>

który nie udostępniłeś. Moim zdaniem, żeby znaleść przyczynę powstawania Twojego błędu powinieneś udostępnić cały kod pliku faucet.phpwink

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 577 wizyt
pytanie zadane 8 czerwca 2022 w PHP przez peter174 Nowicjusz (130 p.)
0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 25 października 2020 w PHP przez mallow Nowicjusz (120 p.)
+1 głos
5 odpowiedzi 537 wizyt
pytanie zadane 4 listopada 2021 w HTML i CSS przez Bartess Gaduła (3,630 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...