2012-11-24 4 views
0

J'ai un site Web de bandes dessinées où j'essaie de mettre en place un système similaire/antipathique. Chaque utilisateur ne peut voter qu'une seule fois sur une bande dessinée particulière. Les bandes dessinées sont stockées dans la table 'comics', les illustrations stockées dans 'artwork', et j'ai une table 'votes' avec des colonnes (ip, nom_table, imgid).Mysql: ON DUPLICATE KEY UPDATE erreurs de lancement

Quand quelqu'un vote, je veux stocker son adresse IP contre cet id d'image et cette table dans le tableau "votes". S'ils essaient de voter à nouveau, ils vérifieront cette table pour voir s'ils ont voté.

En outre, je veux faire une mise à jour de clé DUPLICATE qui mettra à jour la clé primaire "ip" dans la table des votes si quelqu'un avec cette adresse IP essaie de voter à nouveau.

include 'dbconnect.php'; 
$site = $_GET['_site']; 
$imgid = intval($_GET['_id']); 
$input = $_GET['_choice']; 


if ($site == "artwork") { 
$table = "artwork"; 
} 
else { 
$table = "comics"; 
} 

$result = $mysqli->query("SELECT like_count, dislike_count FROM $table WHERE id = $imgid"); 

list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM); 

$sql = "INSERT INTO 
      votes (ip, table_name, imgid) 
     VALUES 
      (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid) 
     ON DUPLICATE KEY UPDATE 
      ip = VALUES(ip), 
      table_name = VALUES(table_name), 
      imgid = VALUES(imgid)"; 


if (!$mysqli->query($sql)) printf("Error: %s\n", $mysqli->error); 

$sql = "SELECT ip FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND table_name = '$table' AND imgid = $imgid"; 

if ($result = $mysqli->query($sql)) { 

    if ($result->num_rows == 0) { 
     if ($input == "like") { 
      $sql = "UPDATE $table SET like_count = like_count + 1 WHERE id = $imgid"; 
      $mysqli->query($sql);   
      $likes++; 
     } 
     else if ($input == "dislike") { 
      $sql = "UPDATE $table SET dislike_count = dislike_count + 1 WHERE id = $imgid"; 
      $mysqli->query($sql); 
      $dislikes++;   
     } 
    echo "Likes: " . $likes . ", Dislikes: " . $dislikes; 
    } 
    else { 
     echo "You have already voted"; 
    } 
} 
else { 
    printf("Error: %s\n", $mysqli->error); 
} 
mysqli_close($mysqli); 

Des pensées?

+1

Quel est le message d'erreur? –

+0

@MarkByers Qu'est-il arrivé à votre réponse? lol. Je viens de répondre à cela. Le message d'erreur est qu'il ne me permet pas de voter à nouveau même si j'ai une nouvelle image – Growler

+0

Alors, quel est le message d'erreur? – symcbean

Répondre

1

table est un reserved word in MySQL. Si vous voulez l'utiliser, vous devez l'entourer en arrière. Dans votre cas, cependant, je pense que le vous vouliez utiliser table_name à la place:

$sql = "INSERT INTO 
      votes (`ip`, `table_name`, `imgid`) 
     VALUES 
      (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid) 
     ON DUPLICATE KEY UPDATE 
      `ip` = VALUES(`ip`), 
      `table_name` = VALUES(`table_name`), 
      `imgid` = VALUES(`imgid`)"; 

De la syntaxe de votre requête, vous devriez envisager d'utiliser REPLACE:

REPLACE fonctionne exactement comme INSERT, à l'exception Si une ancienne ligne de la table a la même valeur qu'une nouvelle ligne pour un PRIMARY KEY ou un index UNIQUE, l'ancienne ligne est supprimée avant l'insertion de la nouvelle ligne.

Ainsi, votre requête résoudrait à ceci:

$sql = "REPLACE INTO 
      votes (`ip`, `table_name`, `imgid`) 
     VALUES 
      (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)"; 
1
$sql = "INSERT INTO 
      votes (ip, table_name, imgid) 
     VALUES 
      (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid) 
     ON DUPLICATE KEY UPDATE 
      ip = VALUES(ip), 
      table = VALUES(table), 
      imgid = VALUES(imgid)"; 

vos colonnes sont « ip », « nom_table » et « imgid » donc quand vous définissez des valeurs qu'il excepte nom de colonne comme argument pour VALUES() + vous avez écrit "table = VALUES (table)" et votre nom de colonne est "table_name". La colonne "table" n'existe pas ici. Remplacez-le simplement par "nom_table = VALUES (nom_table)".

Questions connexes