gpt4 book ai didi

PHP:喜欢/不喜欢计数器

转载 作者:可可西里 更新时间:2023-11-01 08:20:37 26 4
gpt4 key购买 nike

我有一个漫画网站,我希望用户可以为每部漫画和每件艺术品一次投票。

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

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)

如有任何帮助,我们将不胜感激!

最佳答案

您看到的是 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 脏活。更好的是使用像 CodeIgnighter 这样的框架, CakePHPFuelPHP给你一个建立的基础。从头开始手动构建应用程序非常耗时,而且更容易出错。

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

关于PHP:喜欢/不喜欢计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com