我有一个漫画网站,我想允许用户每个漫画投票一次,每件艺术品投票一次。
我的代码似乎有两个问题:
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)
非常感谢任何帮助!
答案 0 :(得分:2)
您所看到的是table
是MySQL 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脏工作。更好的方法是使用CodeIgnighter,CakePHP或FuelPHP之类的框架为您提供构建基础。从头开始手工构建应用程序非常耗时且更容易出错。
另外需要注意的是,您应该尝试在代码中使用一致的命名。您将$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)
你可以只选择一个答案(喜欢/不喜欢),不要多于此,请参阅下面的代码链接