2012-05-07 13 views
6

Mam prostą aplikację, która pozwala użytkownikom przesyłać "problemy", a następnie komentować je. Próbuję stworzyć prosty system głosowania, aby użytkownicy mogli "zagłosować" na problemy, które z kolei popchną ich wyżej na listę. Mam podstawową wiedzę na temat PHP i wszystko do tej pory działa, po prostu nie mogę wymyślić, jak to uruchomić.Prosty system głosowania PHP

Mam następnie samouczek online i do tej pory mam to na mojej stronie problem.php ...

if (isset($_GET['vote'], $_GET['id'])){ 
     add_problem_vote($_GET['id]'], $_GET['vote']); 
    } 

<a href="?vote=up&amp;id=<?php echo $problemID; ?>">Vote</a> 

A na mojej stronie functions.php ...

function add_problem_vote($problemID, $vote){ 

    $problemID = (int)$problemID; 

    $vote = ($vote === 'up') ? '+' : '-'; 

    $sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}"; 

    mysql_query($sql); 
} 

Wszystko moje pola tabeli są poprawnie nazwane. Wiem, że jest wiele rzeczy do rozważenia, jak powtórne głosowanie po zamknięciu sesji, ale tak długo, jak pokazałem, że to nie musi być doskonałe. Z chwilą kliknięcia łącza przekierowuje na stronę, ale głosy nie zmieniają się w tabeli mysql.

+0

check to http://stackoverflow.com/questions/490969/stack-overflow-reddit-voting-system-in-php – nu6A

+0

Jeśli to cała strona problem.php tracisz '' tags wokół klauzuli if. –

+0

Jakiego błędu dostałeś? –

Odpowiedz

0

To nie działa w ten sposób, ponieważ nie udało się nawiązać połączenia z bazą danych MySQL.

Dla moich projektów PHP I (ponownie) użyć klasy Napisałem kiedyś za każdym razem, obejmując wszystkie te funkcje, z właściwą obsługę błędów itp

Może warto pomyśleć o czymś takim, albo przynajmniej potrzebę przed wykonaniem zapytań dodaj mysql_connect.

Nadzieję, że pomaga.

+1

Nie uwzględnił tej części kodu, ponieważ jest to oczywiste ... –

+0

Przepraszamy za bycie niejednoznacznym. To tylko część kodu, wszystko działa inaczej. Zrobiłem połączenie (wszystkie dane na stronie pochodzą z bazy danych mysql) i wszystko działa inaczej niż te ostatnio wprowadzane linie kodu. – GuerillaRadio

0

spróbuj tego:

"UPDATE `problems` SET `votes` = `votes` ".mysql_real_escape_string($vote)." 1 WHERE `id` = ".mysql_real_escape_string($problem_id); 
+0

Nie działa Obawiam się. Jak mogę przetestować, czy funkcja działa po kliknięciu łącza? – GuerillaRadio

0

Nie dość pewny na ten temat w ogóle, ale:

$problemID = (int)$problemID; 

powinno być:

$problemID = intval($problemID); 

Ilekroć coś przestaje działać zawsze dodać

echo $sql; 

Przed wywołaniem mysql_query(); w ten sposób mogę skopiować i wkleić wynik do przeglądarki SQL i sprawdzić, czy jest poprawny.

EDIT: Gdyby inny wygląd i jak ktoś wcześniej uciekł SQL Pomyślałem, że może warto byłoby wspomnieć spróbować:

$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}"; 

Do:

$sql = "UPDATE `problems` SET `votes` = `votes` {".$vote."} 1 WHERE `id` = {$problem_id}"; 

ale jeśli wszystko SQL robi się, to dlaczego nie spróbować:

$sql = "UPDATE `problems` SET `votes` = `votes`+1 WHERE `id` = {$problem_id}"; 

jak to jest dokładnie to, co robisz, a następnie Nie ma potrzeby, aby parametr $ vote był przekazywany.

Inne opcje są łatwe debugowanie:

print_r($_POST); // to show all the POSTED variables from a form 
print_r($_GET); // to show all the parameters from the URL 

BBloke

1
$sql = "UPDATE `problems` SET `votes` = `votes` ".$vote." 1 WHERE `id` = ".$problem_id; 
mysql_query($sql) or die(mysql_error()); 

Sprawdź jaki błąd otrzymujesz?

0

pierwsze zapytanie nie jest poprawna

$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}"; 

Korekta

$sql = "update `problems` set `votes` = '$vote' where `id` = '$problem_id'"; 

będę sugerować inną drogę. Stwórz tabelę głosów z tymi kolumnami: - użytkownik (identyfikator użytkownika) - pytanie (identyfikator przedmiotu, który musi zostać poddany pod głosowanie) - głosowanie (lub liczba (przykład: od 0 do 4) lub opcja (a, b, c ...))

klucz podstawowy = user, pytanie

teraz można bezproblemowej wstawiania/aktualizowania głos

mysql_query("replace into votes values ($userid, $question, $vote)"); 

gotowe! i możesz łatwo uzyskać avg (jeśli wybrałeś głos na numer) lub liczbę głosów (jeśli wybrałeś opcje)!

+0

To nie jest dobre rozwiązanie i podlega warunkom wyścigu i traci głosy, jeśli strona jest zajęta. –

+0

Jeśli chcesz, aby działał z warunkami wyścigu, możesz użyć rowversion $ sql = "update' problems' zestaw 'votes' = '$ vote', rowversion = $ rowversion + 1 gdzie 'id' =' $ problem_id ' i rowversion = $ rowversion "; następnie możesz sprawdzić dotknięte wiersze ... –

+0

Lub po prostu 'problem z aktualizacją zestaw głosów = (głosów + 1), gdzie id = '$ problem_id'' i nie martw się o sprawdzanie zagrożonych wierszy i próbuje ponownie zastosować głosowanie, itp., Jak to zawsze będzie działać. –

0

Przykro mi z powodu mojego złego angielskiego. Mam nadzieję, że to zrozumiesz :) Więc na pierwszym jest lepsze użycie mysqli lub pdo. A jeśli utworzysz nową tabelę do głosowania, będziesz miał do wyboru więcej opcji w przyszłości (dołącz do rangi użytkowników, przeciętne konkretne stopnie użytkowników, sprawdź, czy użytkownik głosował wcześniej, ...)

Inspiracje zrobić: stronie użytkownika (do użytku wyślij jQuery - ajax):

<a href="IDOFPROBLEM" title="VoteUp" class="voteUp">VoteUp</a> 
    <script> 
     $(document).ready(function() { 
      $(".voteUp").click(function(e) { 
       e.preventDefault(); 

       var id = $(this).attr("href"); 

       $.ajax({ 
        type: "POST", 
        //This is destination of php script 
        url: "YOURVOTEUPFILE.php?vote=up", 
        data: {id: id} 
       }) 
         .done(function(msg) { 
        //msg contains data from php script so you can show message to user good or bad :) 
        alert(msg); 
       }); 
      }); 
     }); 
    </script> 

stronie serwera:

final class manageVote { 

    /** 
    * Id of problem 
    * @var int|string 
    */ 
    private $voteFor; 
    /** 
    * Id of user 
    * @var int|string 
    */ 
    private $whoVote; 

    /** 
    * Mysqli 
    * @var \mysqli 
    */ 
    private $database; 

    /** 
    * Construct - initialize variable 
    * @param int|string $voteFor 
    * @param int|string $whoVote 
    * @param \mysqli $db 
    */ 
    public function __construct($voteFor, $whoVote, &$db) { 

     $this->voteFor = $voteFor; 
     $this->whoVote = $whoVote; 
     $this->database = $db; 
    } 

    /** 
    * Try to make vote 
    * @param string $upOrDown "up" or "down" 
    * @return boolean 
    */ 
    public function vote($upOrDown) { 
     if (!$this->verifyIfUserCannote() || ($upOrDown != "up" && $upOrDown != "down")) 
      return false; 
     //Change database name to your name 
     //Better solution is sql table for all ranks 
     //And you need "whoVote" because I think one problem - one vote for one user 
     /* 
     * Table could be: 
     * idvote PK NN AI 
     * vote INT NN 
     * idproblems FK NN 
     * whoVote FK NN 
     */ 
     $sql = "INSERT INTO `DATABASENAME`.`problems` (`idproblems`, `vote`, `whoVote`) VALUES('" . $this->voteFor . "', '" . 
       ($upOrDown == "up" ? 1 : -1) . "', '" . $this->whoVote . "')"; 
     $query = $this->database->query($sql); 
     if (!$query) 
      return false; 
     return true; 
    } 


    private function verifyIfUserCannote() { 
     $sql = "SELECT COUNT(*) AS 'cnt' FROM `DATABASENAME`.`problems` WHERE `idproblems` = '" . $this->voteFor . "' AND `whoVote` = '" . $this->whoVote . "'"; 

     $query = $this->database->query($sql); 

     if (!$query) 
      return false; 

     $result = mysqli_fetch_array($query); 

     return ($result["cnt"] == 0 ? true : false); 
    } 

} 

if (isset($_GET["vote"])) { 
    $voteClass = new manageVote($_POST["id"], $someYourIdentificatorWhoVote, $mysqliDatabaseReference); 

    echo ($voteClass->vote($_GET["vote"]) == true ? "TRUE" : "FALSE"); 
} 
else 
    echo "FALSE"; 

dla ostatecznej rangi polecenia SQL SELECT SUM użycie głos (głosowanie) FROM .... ... GROUP BY idProblems

0

Jeśli chcesz przejść z pierwszego rozwiązania zapytanie powinno być:

$sql = "update `problems` set `votes` = `votes` + 1 where `id` = '$problem_id'"; 
0

proszę sprawdzić następujące za błędy

  • obejmować functions.php w problem.php
  • Użyj mysqli_query ($ sql) wstawionego mysql_query ($ sql). Ponieważ jest przestarzałe.Możesz użyć PDO również
  • Użyj funkcji (mysqli_error ($ connection_varible)) do śledzenia błędów sql.
0

Użyj "I" między obydwoma danymi w funkcji set-set lub po prostu jedną z danych można użyć do funkcji set-set.

if (isset($_GET['vote'] && $_GET['id'])){ 
       add_problem_vote($_GET['id]'], $_GET['vote']); 
      } 

     <a href="?vote=up&amp;id=<?php echo $problemID; ?>">Vote</a> 



    function add_problem_vote($problem_id,$vote) 
{ 
$query_select="select votes from problems where id='".$problem_id."'"; 
$query_run=mysql_query($query_select); 
if(mysql_num_rows($query_run)>0) 
{ 
$vote_num=mysql_result($query_run,0,votes) 
if($vote==up) 
$vote_num=+$vote_num; 
else 
$vote_num=-$vote_num 
} 
$sql = "UPDATE `problems` SET `votes` = '$vote_num' WHERE `id` = '".$problem_id.'""; 

    mysql_query($sql); 

} 
+0

Twój przykład kodu jest pełen błędów. –

+0

proszę podać błąd, aby poprawić swoje programowanie. Każdy programista rozwiązuje problem na swój własny sposób, użyłem najprostszej funkcji, która jest łatwa do zrozumienia, ale jeśli mają błąd, niż chcę znać miejsca, w których błąd kończy się, –

Powiązane problemy