【问题标题】:Mysql: ON DUPLICATE KEY UPDATE throwing errorsMysql:ON DUPLICATE KEY UPDATE 抛出错误
【发布时间】:2012-11-25 01:32:45
【问题描述】:

我有一个漫画网站,我正在尝试实施喜欢/不喜欢系统。每个用户只能对特定漫画投票一次。漫画存储在“漫画”表中,艺术品存储在“艺术作品”中,我有一个带有列(ip、table_name、imgid)的“投票”表。

当有人投票时,我想将他们的 IP 与该图像 ID 和表存储在“投票”表中。如果他们再次尝试投票,它将检查该表以查看他们是否已投票。

另外,我想做一个 ON DUPLICATE KEY UPDATE,如果有该 IP 的人再次尝试投票,它将更新投票表中的主键“ip”。

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

有什么想法吗?

【问题讨论】:

  • @MarkByers 你的回答怎么了?哈哈。我只是回应了它。错误消息是它不允许我再次投票,即使我有一张新图片
  • 那么错误信息是什么?
  • @Growler:你在我回答后更改了问题,所以我的回答不再有意义,所以我删除了它。
  • @MarkByers 好的,我现在要发布没有喜欢/不喜欢功能的网站:/

标签: php mysql mysqli


【解决方案1】:

table 是一个reserved word in MySQL。如果要使用它,则必须将其括在反引号中。但是,就您而言,我认为您打算改用table_name

$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`)";

从查询的语法来看,您应该考虑使用REPLACE

REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。

所以你的查询会解决这个问题:

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

【讨论】:

    【解决方案2】:
       $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)";
    

    您的列是“ip”、“table_name”和“imgid”,因此当您设置 VALUES 时,除了列名作为 VALUES() 的参数 + 您编写了“table = VALUES(table)”并且您的列名是“表名”。此处不存在“表”列。只需将其更改为“table_name = VALUES(table_name)”即可。

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 2012-02-29
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2014-10-18
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多