2013-03-17 3 views
0

J'essaie de faire fonctionner mon système de vote. J'ai 3 tables de base de données: utilisateurs, messages, votesproblème de base de données - mêmes valeurs dans différentes rangées

les utilisateurs de la table a un nom d'utilisateur de champ en tant que clé primaire. Le poste de table a post_id comme clé primaire. (il y a plus de champs mais ils n'affectent pas la question/problème)

Dans le tableau des votes j'ai 3 champs: username, post_id, vote. le vote est enum('positive', 'negative'). Ce que j'essaye de réaliser est que si un utilisateur vote pour un article spécifique qui est affiché sur une page, la requête: INSERT INTO votes ('username','post_id','vote') VALUES('$user_name','$post_id', 'positive'); sera exécuté.

Ça marche si l'on dit utilisateur 123123 n'a donné de note à aucun poste. Lorsque cet utilisateur vote, disons pour le post 1, cette requête fonctionne bien. Mais si cet utilisateur veut voter pour un message différent, (son vote est compté - je viens de copier la partie du code qui ne fonctionne pas, le reste fonctionne bien) la requête d'insertion n'est pas exécutée. Si l'utilisateur abcd veut voter pour un poste spécifique, cela fonctionne à nouveau, mais seulement une fois. Il me semble qu'il y a une sorte de problème avec la base de données, de sorte qu'il ne peut y avoir qu'une seule entrée avec la même username ou post_id. Comment puis-je résoudre ce problème si je veux qu'un utilisateur puisse voter pour plusieurs messages? Y a-t-il une meilleure stratégie pour cela?

if($runloggedin->num_rows == 1) 
{ 
    // If there was no vote for the current posting, then execute this query 
    $query = "SELECT * FROM posts WHERE post_id='".$post_id."' AND user_name='".$user_name."'";   //get username and the post id 
    $result = $mysqli->query($query); 
    $query1 = "SELECT * FROM votes WHERE post_id='".$post_id."' AND username='".$user_name."'";   //check if there is a vote for this post already 
    $result1 = $mysqli->query($query1); 

    if ($result->num_rows == 1 && $result1->num_rows == 0) 
    { 
     $vote = "INSERT INTO votes ('username','post_id','vote') VALUES('$user_name','$post_id', 'positive')";   // this isn't working. everything else seems to be working (still test it more) 
     $savevote = $mysqli->query($vote); 
     $addvote = "UPDATE posts SET posvotes=posvotes+1 WHERE post_id='".$post_id."'"; 
     $runvote = $mysqli->query($addvote); 
     echo "Thank you for your vote"; 
    } 
} 
+0

Vous êtes absent le point avec des déclarations préparées, vous ne prépariez vraiment rien. Le point avec les instructions préparées est de le faire accepter plus tard les variables exécutées afin qu'elles soient insérées dans la requête en tant que chaînes, rendant la requête plus sûre à partir des injections SQL. – Jonast92

Répondre

0

Sans voir comment votre table votes a été créé, je suppose que username a été mis en place comme la clé primaire. Cela fera fonctionner le premier INSERT, mais tous les futurs échoueront. Ce que vous devez faire est de changer pour avoir username & post_id être la clé primaire

ALTER TABLE `votes` DROP PRIMARY KEY , ADD PRIMARY KEY ( `username`, `post_id`) 
Questions connexes