3

我有一个漫画网站,我想允许用户为每部漫画和每件艺术品投票一次。

我的代码似乎有两个问题:

1)我只希望一个用户对每张图像投票一次......所以我想捕获他们的信息并将其存储在数据库中。我有一个 ON DUPLICATE KEY UPDATE,但它给了我以下语法错误,即使我没有发现它有任何问题:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table = VALUES(table), imgid = VALUES(imgid)' at line 7 

一个允许同一 IP 进入数据库的多个条目的示例:

在此处输入图像描述

2)它仍然允许一个用户多次投票。

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

$result = $mysqli->query($sql);
var_dump($result);

完整代码:

<?php 
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 = VALUES(table),
            imgid = VALUES(imgid)";

$mysqli->query($sql);
echo $mysqli->error;
echo "<br/>";

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

$result = $mysqli->query($sql);
echo $mysqli->error;

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";
}
mysqli_close($mysqli);

?>

回显sql:

echo "sql: ". $sql;

产生:

sql: INSERT INTO votes (ip, table_name, imgid) VALUES ("127.0.0.1", "comics", 34) ON DUPLICATE KEY UPDATE ip = VALUES(ip), table = VALUES(table), imgid = VALUES(imgid)

任何帮助将不胜感激!

4

2 回答 2

2

您看到的是tableMySQL保留字之一,但您正试图将其用作列名。不过,您的专栏实际上是table_name根据您的问题调用的。

带有占位符的查询如下所示:

INSERT INTO votes (ip, table_name, imgid) 
  VALUES (?, ?, ?)
  ON DUPLICATE KEY UPDATE
    ip=VALUES(ip),
    table_name= VALUES(table_name),
    imgid=VALUES(imgid)

请记住,mysqli您可以通过以下方式执行此查询:

$sth = $mysqli->prepare("...");
$sth->bind_param("sss", $_SERVER['REMOTE_ADDR'], $table, $imgid);
$sth->execute();

文档对这个过程进行了更详细的描述,但是"sss"thing指的是三个字符串,三个值作为参数传入。

您可能应该使用PDO,因为它比mysqli. 更好的是使用像Doctrine这样的数据库框架来为你做很多 SQL 脏工作。更好的是使用像CodeIgnighterCakePHPFuelPHP这样的框架来为您提供构建基础。从头开始手动构建应用程序非常耗时并且更容易出错。

要注意的另一件事是,您应该尝试在代码中使用一致的命名。您将其$table称为 的值table_name,因此它应该是$table_name从开始的。

于 2012-11-24T06:42:02.213 回答
1

您查询失败但您没有检查并尝试使用 $result 但它不是对象错误false。它失败了,因为你应该是这样的:

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

(字符串值用单引号引起来'

于 2012-11-24T00:36:14.903 回答