Problema refresh/reload la submit


(Alex Mieila) #1

Buna ziua, revin cu o problema. Se da un form.

        if ($countIpVoted == 0) {
            echo '<br>'.'<form name="myform" action="setvote.php" method="POST">';
            echo '<input type="hidden" name="postId" value="'.$postid.'" />';
            echo '<input type="submit" name="confirmedVote" value="TRUE" id="trues" />';
            echo '<input type="submit" name="fakeVote" value="FALSE" id="falses" />';
            echo'</form>';
        }
        else {
            echo '<p>IP '.$ipaddress.' already used for voting</p>';
            $rowIpVoted = $resultIpVoted->fetch_assoc();
            //Only if you want the results to be seen.
            //echo 'confirmed: '.$rowIpVoted['confirmedVote'].'<br>';
            //echo 'Fake: '.$rowIpVoted['fakeVote'].'<br>';
        }

Acesta verifica daca ip-ul a fost folosit pentru a vota un articol de pe site, si astfel creeaza sau nu form-ul cu burtoanele pentru fiecare articol in parte.

Cum as putea sa fac in momentul in care apas pe butoanele de submit, sa trimita intrarea in baza de date fara sa se mai faca refresh sau reload la pagina.

if (isset($_POST['confirmedVote'])) {
    $confirmed = 1;
} else if (isset($_POST['fakeVote'])) {
    $fake = 1;
} else {
    echo "Nu a functionat";
}

if ($confirmed + $fake == 1){
    $sqlInsert = 'INSERT INTO dbtable (values) values (values)';
    echo $sqlInsert.'<br>';
    $dbInsert =mysqli_Query($connection, $sqlInsert);
} else {
    echo "Nu a functionat";
}

Multumesc frumos!


(Ionuț Staicu) #2

Folosești AJAX. Dacă folosești jQuery pe frontend, poți folosi API-ul lui (nu include jQuery doar pentru AJAX…)


(Alex Mieila) #3

Am incercat ceva cu Ajax, normal pentru frontend am mai multe facute in jQuery (datepicker, searchbar etc…) Dar tot nu imi dau seama cum ar trebui folosit, cum sa fac acel Post prin Ajax.


(Ionuț Staicu) #4

Uite aici un articol, s-ar putea să te ajute:


(Eduard-Dan Stanescu) #5

S-a mai discutat si aici:


(István F.) #6

Problema ta e foarte simpla, nu trebuie jquery sau ceva complex.

Partea proasta e ca iti trebuie un API pe backend la care sa faci call de pe frontend si o metoda de a verifica daca un vot este valid sau nu, altfel cineva se uita la cod si da cate requesturi (voturi) are el chef.

Partea buna, este ca crearea si consumarea de api-uri este extrem de importanta si solutia recomandata.

Pe scurt:

  1. Creezi un buton sau orice element html caruia ii pui cursor: pointer; in css si ii aplici un id sau o clasa gen ‘trimitevot’.
  2. Folosesti let buton = document.querySelector('#trimitevot') sau ‘.trimitevot’ (daca ai pus o clasa) in JS ca sa iei elementul.
  3. Pui un event listener pentru click-uri pe acel element si la event trimiti spre server un vot:
buton.addEventListener('click', function( event ) {
 fetch("/api.php", { // sau folosesti GET cu /api.php?userid=26&votare
  method: "POST", 
  body: '{"userid": 26, "votare": true}'; // Date trimise spre server in format JSON 
}).then(raspuns => {
  console.log("Date trimise cu succes: ", raspuns);
  // aici poti seta un cookie pe care sa il verifici inainte sa trimiti votul, 
  //sa ascunzi formularul, sa returnezi un mesaj...
 });
});

In api.php faci un if sa vezi daca votare din body-ul cu json este true dupa ce il decodezi, atunci salvezi un vot pentru userid-ul primit in baza de date si raspunzi cu 200 ok sau dai alte comenzi/date pentru frontend.

Dupa poti dezvolta, gen sa adaugi un captcha pe pagina si sa ceri raspunsul la captcha in json-ul trimis, sa setezi un cookie si o variabila in localStorage, sa loghezi ip-ul si user-agent-ul sau chiar sa ceri un cont facebook cu minim un anumit numar de prieteni legat de sesiune.