我有一个简单的应用程序,允许用户提交“问题”,然后对它们发表评论。我试图建立一个简单的投票系统,这样用户就可以“投票”出问题,这反过来会把他们推到一个清单上面。我有一些PHP的基本知识,到目前为止一切正常,我只是无法弄清楚如何让它工作。
我已经在线阅读了一个教程,到目前为止我已经在我的problem.php页面上了...
if (isset($_GET['vote'], $_GET['id'])){
add_problem_vote($_GET['id]'], $_GET['vote']);
}
<a href="?vote=up&id=<?php echo $problemID; ?>">Vote</a>
在我的functions.php页面上......
function add_problem_vote($problemID, $vote){
$problemID = (int)$problemID;
$vote = ($vote === 'up') ? '+' : '-';
$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";
mysql_query($sql);
}
我的所有表格字段都是正确命名的。我知道在会议结束后有很多事情要考虑重新投票,但只要我表明这个想法就不一定是完美的。在点击链接的那一刻,它会重定向到一个页面,但是在mysql表中投票不会改变。
答案 0 :(得分:1)
$sql = "UPDATE `problems` SET `votes` = `votes` ".$vote." 1 WHERE `id` = ".$problem_id;
mysql_query($sql) or die(mysql_error());
检查你得到了什么错误?
答案 1 :(得分:0)
这不起作用,因为你没有建立与数据库的MYSQL连接,我想。
对于我的PHP项目,我(重新)使用我曾经每次编写的类,包装所有这些函数,并进行适当的错误处理等。
也许你应该考虑这样的事情,或者你至少需要在执行查询之前添加mysql_connect
。
希望有所帮助。
答案 2 :(得分:0)
试试这个:
"UPDATE `problems` SET `votes` = `votes` ".mysql_real_escape_string($vote)." 1 WHERE `id` = ".mysql_real_escape_string($problem_id);
答案 3 :(得分:0)
对此完全不确定,但是:
$problemID = (int)$problemID;
应该是:
$problemID = intval($problemID);
每当某些东西停止工作时,我总是添加一个
echo $sql;
在调用mysql_query()之前;这样我就可以将结果复制并粘贴到SQL浏览器中,看看它是否正确。
编辑:看了一下,因为有些人之前已经逃脱了SQL语句,我认为值得一提的是尝试:$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";
要:
$sql = "UPDATE `problems` SET `votes` = `votes` {".$vote."} 1 WHERE `id` = {$problem_id}";
但如果所有SQL正在进行,那么为什么不尝试:
$sql = "UPDATE `problems` SET `votes` = `votes`+1 WHERE `id` = {$problem_id}";
因为它正是你正在做的事情,所以不需要传递$ vote参数。
其他简单的调试选项包括:
print_r($_POST); // to show all the POSTED variables from a form
print_r($_GET); // to show all the parameters from the URL
BBloke
答案 4 :(得分:0)
首先查询不正确
$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";
校正
$sql = "update `problems` set `votes` = '$vote' where `id` = '$problem_id'";
我会建议另一种方式。 用这些列表投票: - 用户(用户的ID) - 问题(需要投票的东西的ID) - 投票(或数字(例如:0到4)或选项(a,b,c ......))
主键=用户,问题
现在您可以轻松插入/更新投票
mysql_query("replace into votes values ( $userid, $question, $vote )");
DONE!并且您可以轻松获得平均值(如果您选择了投票作为数字)或投票数(如果您选择了选项)!
答案 5 :(得分:0)
我很抱歉我的英语不好。我希望你能理解:) 所以首先要更好地使用 mysqli 或pdo。 如果你创建新表进行投票,你将来会有更多的选择(加入用户排名,平均具体用户排名,验证用户之前是否已投票,......)
灵感: 用户端(发送使用jquery - ajax):
<a href="IDOFPROBLEM" title="VoteUp" class="voteUp">VoteUp</a>
<script>
$(document).ready(function() {
$(".voteUp").click(function(e) {
e.preventDefault();
var id = $(this).attr("href");
$.ajax({
type: "POST",
//This is destination of php script
url: "YOURVOTEUPFILE.php?vote=up",
data: {id: id}
})
.done(function(msg) {
//msg contains data from php script so you can show message to user good or bad :)
alert(msg);
});
});
});
</script>
服务器端:
final class manageVote {
/**
* Id of problem
* @var int|string
*/
private $voteFor;
/**
* Id of user
* @var int|string
*/
private $whoVote;
/**
* Mysqli
* @var \mysqli
*/
private $database;
/**
* Construct - initialize variable
* @param int|string $voteFor
* @param int|string $whoVote
* @param \mysqli $db
*/
public function __construct($voteFor, $whoVote, &$db) {
$this->voteFor = $voteFor;
$this->whoVote = $whoVote;
$this->database = $db;
}
/**
* Try to make vote
* @param string $upOrDown "up" or "down"
* @return boolean
*/
public function vote($upOrDown) {
if (!$this->verifyIfUserCannote() || ($upOrDown != "up" && $upOrDown != "down"))
return false;
//Change database name to your name
//Better solution is sql table for all ranks
//And you need "whoVote" because I think one problem - one vote for one user
/*
* Table could be:
* idvote PK NN AI
* vote INT NN
* idproblems FK NN
* whoVote FK NN
*/
$sql = "INSERT INTO `DATABASENAME`.`problems` (`idproblems`, `vote`, `whoVote`) VALUES('" . $this->voteFor . "', '" .
($upOrDown == "up" ? 1 : -1) . "', '" . $this->whoVote . "')";
$query = $this->database->query($sql);
if (!$query)
return false;
return true;
}
private function verifyIfUserCannote() {
$sql = "SELECT COUNT(*) AS 'cnt' FROM `DATABASENAME`.`problems` WHERE `idproblems` = '" . $this->voteFor . "' AND `whoVote` = '" . $this->whoVote . "'";
$query = $this->database->query($sql);
if (!$query)
return false;
$result = mysqli_fetch_array($query);
return ($result["cnt"] == 0 ? true : false);
}
}
if (isset($_GET["vote"])) {
$voteClass = new manageVote($_POST["id"], $someYourIdentificatorWhoVote, $mysqliDatabaseReference);
echo ($voteClass->vote($_GET["vote"]) == true ? "TRUE" : "FALSE");
}
else
echo "FALSE";
对于最终投票级别,使用SQL命令SELECT SUM(投票)FROM ....... GROUP BY idProblems
答案 6 :(得分:0)
如果您想继续使用第一个解决方案,则查询应为:
$sql = "update `problems` set `votes` = `votes` + 1 where `id` = '$problem_id'";
答案 7 :(得分:0)
请检查以下错误
答案 8 :(得分:0)
使用&#39;和&#39;在is-set函数中的两个数据之间或者只是其中一个数据可以用于is-set函数。
if (isset($_GET['vote'] && $_GET['id'])){
add_problem_vote($_GET['id]'], $_GET['vote']);
}
<a href="?vote=up&id=<?php echo $problemID; ?>">Vote</a>
function add_problem_vote($problem_id,$vote)
{
$query_select="select votes from problems where id='".$problem_id."'";
$query_run=mysql_query($query_select);
if(mysql_num_rows($query_run)>0)
{
$vote_num=mysql_result($query_run,0,votes)
if($vote==up)
$vote_num=+$vote_num;
else
$vote_num=-$vote_num
}
$sql = "UPDATE `problems` SET `votes` = '$vote_num' WHERE `id` = '".$problem_id.'"";
mysql_query($sql);
}