2012-05-07 12 views
6

Ho una semplice applicazione che consente agli utenti di inviare "problemi" e quindi commentarli. Sto tentando di creare un sistema di votazione semplice in modo che gli utenti possano "votare" i problemi che a loro volta li spingeranno più in alto in una lista. Ho alcune conoscenze di base di PHP e tutto quello che funziona finora, non riesco a capire come farlo funzionare.Simple PHP Voting System

ho seguito un tutorial on-line e finora hanno questo sulla mia pagina 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> 

E sulla mia pagina 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); 
} 

Tutto i miei campi della tabella sono definiti correttamente. So che ci sono molte cose da considerare come la votazione dopo la chiusura della sessione, ma finché ho dimostrato che non deve essere perfetto. Nel momento in cui viene fatto clic sul link, viene reindirizzato a una pagina, ma i voti non cambiano nella tabella mysql.

+0

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

+0

Se questa è la vostra pagina di problem.php intero che ti manca '' tag attorno alla tua clausola if. –

+0

Che tipo di errore stai ottenendo? –

risposta

0

Questo non funziona in questo modo perché non hai stabilito una connessione MySQL al tuo database, immagino.

Per i miei progetti di PHP I (ri) utilizzare una classe, una volta ho scritto ogni volta, avvolgendo tutte queste funzioni, con la gestione d'errore ecc

Forse si dovrebbe pensare a qualcosa di simile, o che almeno bisogno di aggiungi mysql_connect prima di eseguire le query.

Spero che questo aiuti.

+1

Non ha incluso quella parte del codice dal momento che è ovvio ... –

+0

Ci scusiamo per essere ambigui. Questa è solo una sezione di codice, tutto funziona diversamente da questo. Ho effettuato una connessione (tutti i dati della pagina provengono da un database mysql) e tutto funziona diversamente da queste righe di codice inserite di recente. – GuerillaRadio

0

provare questo:

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

Non funziona, ho paura. Come posso verificare che la funzione sia effettivamente in esecuzione quando si fa clic sul collegamento? – GuerillaRadio

0

Non del tutto sicuro su questo a tutti, ma:

$problemID = (int)$problemID; 

dovrebbe essere:

$problemID = intval($problemID); 

Ogni volta che qualcosa smette di funzionare ho sempre aggiungere un

echo $sql; 

Prima di chiamare mysql_query(); in questo modo posso copiare e incollare il risultato in un browser SQL e vedere se è corretto.

EDIT: Aveva un altro sguardo e, come qualcuno ha già sfuggito l'istruzione SQL ho pensato che potrebbe essere degno di nota per provare:

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

A:

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

ma se tutto lo SQL perché non provare:

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

come è esattamente quello che stai facendo poi Non è necessario che il parametro $ vote venga passato.

Altre opzioni di facile debug sono:

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()); 

Controllare quale errore hai trovato?

0

In primo luogo la query non è corretta

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

Correzione

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

io suggerisco un altro modo. Crea un voto di tavolo con queste colonne: - utente (id dell'utente) - domanda (id della cosa che deve essere votata) - voto (o un numero (esempio: da 0 a 4) o l'opzione (a, b, c ...))

chiave primaria = user, in discussione

ora è possibile easilly inserimento/aggiornamento voto

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

FATTO! e puoi facilmente ottenere la media (se hai scelto il voto per essere un numero) o il numero di voti (se hai scelto le opzioni)!

+0

Questa non è una buona soluzione ed è soggetta alle condizioni della gara e perderà i voti se il sito è occupato. –

+0

Bene se vuoi che funzioni con le condizioni di gara puoi usare rowversion $ sql = "update' problems' set 'votes' = '$ vote', rowversion = $ rowversion + 1 dove' id' = '$ problem_id' e rowversion = $ rowversion "; quindi puoi controllare le righe interessate ... –

+0

O semplicemente "aggiorna i problemi imposta voti = (voti + 1) dove id =" $ problem_id "e non preoccuparti di controllare le righe interessate e provare a riapplicare il voto, ecc. funzionerà sempre –

0

Mi dispiace per il mio cattivo inglese. Spero lo capirete :) Quindi per prima cosa è meglio usare mysqli o pdo. E se crei una nuova tabella per il voto, avrai più opzioni da fare in futuro (unisciti ai ranghi con gli utenti, ranghi di utenti concreti medi, verifica se l'utente ha votato prima, ...)

Ispirazione fare: lato utente (ad uso send 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> 

lato server:

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"; 

per classifica finale del comando SQL utilizzo voto SUM SELECT (votazione) FROM .... ... GROUP BY idProblems

0

Se si vuole andare avanti con la prima soluzione la query deve essere:

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

Controllare quanto segue per gli errori

  • includere il functions.php in problem.php
  • Usa mysqli_query ($ sql) insted di mysql_query ($ sql). Perché è deprecato. Puoi usare anche PDO
  • Usa la funzione die (mysqli_error ($ connection_varible)) per tracciare gli errori sql.
0

Utilizzare "E" tra entrambi i dati nella funzione di impostazione predefinita o semplicemente uno dei dati può essere utilizzato per la funzione di impostazione predefinita.

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

L'esempio di codice è pieno di errori. –

+0

si prega di specificare l'errore in modo da migliorare la mia programmazione. Ogni programmatore risolve un problema a suo modo, ho usato la cosa più semplice che è facile da capire, ma se hanno errori di quanto vorrei sapere i luoghi in cui l'errore si interrompe, –