PHP:喜欢/喜欢反击

时间:2012-11-24 00:34:50

标签: php mysql

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

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

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的示例:

enter image description here

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 个答案:

答案 0 :(得分:2)

您所看到的是tableMySQL reserved words之一,但您尝试将其用作列名。不过,您的专栏实际上会根据您的问题调用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"事物引用了三个字符串,并且三个值作为参数传递。

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

另外需要注意的是,您应该尝试在代码中使用一致的命名。您将$table称为table_name的值,因此大概应该$table_name开始。

答案 1 :(得分:1)

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

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

(字符串值引用单引号'

答案 2 :(得分:0)

答案 3 :(得分:0)

你可以只选择一个答案(喜欢/不喜欢),不要多于此,请参阅下面的代码链接

Php - Ajax like / dislike button

相关问题