У меня есть простое приложение, которое позволяет пользователям отправлять «проблемы», а затем комментировать их. Я пытаюсь создать простую систему голосования, чтобы пользователи могли «проголосовать» за проблемы, которые, в свою очередь, подтолкнут их выше списка. У меня есть некоторые базовые знания 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.
$sql = "UPDATE `problems` SET `votes` = `votes` ".$vote." 1 WHERE `id` = ".$problem_id; mysql_query($sql) or die(mysql_error());
Проверьте, какую ошибку вы получаете?
попробуй это :
"UPDATE `problems` SET `votes` = `votes` ".mysql_real_escape_string($vote)." 1 WHERE `id` = ".mysql_real_escape_string($problem_id);
Это не работает, потому что вы не установили соединение MYSQL с вашей базой данных, я думаю.
Для моих проектов PHP я (повторно) использую класс, который я когда-то писал каждый раз, обертывая все эти функции, с надлежащей обработкой ошибок и т. Д.
Возможно, вам стоит подумать о чем-то подобном, или вам, по крайней мере, нужно добавить mysql_connect
перед выполнением запросов.
Надеюсь, это поможет.
Не совсем уверен в этом, но:
$problemID = (int)$problemID;
это должно быть:
$problemID = intval($problemID);
Всякий раз, когда что-то перестает работать, я всегда добавляю
echo $sql;
До вызова mysql_query (); таким образом я могу скопировать и вставить результат в SQL-браузер и посмотреть, правильно ли это.
EDIT: Был другой взгляд, и, как раньше кто-то избежал выражения 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
Сначала запрос неправильный
$sql = "UPDATE `problems` SET `votes` = `votes` {$vote} 1 WHERE `id` = {$problem_id}";
коррекция
$sql = "update `problems` set `votes` = '$vote' where `id` = '$problem_id'";
Я предлагаю другой путь. Создайте таблицу голосов с этими колонками: – пользователь (идентификатор пользователя) – вопрос (идентификатор вещи, которая должна быть проголосована) – голосуйте (или число (пример: от 0 до 4) или вариант (a, b, c …))
первичный ключ = пользователь, вопрос
теперь вы можете легко вставить / обновить голосование
mysql_query("replace into votes values ( $userid, $question, $vote )");
СДЕЛАННЫЙ! и вы можете легко получить avg (если вы выбрали число голосов) или количество голосов (если вы выбрали опции)!
Прошу прощения за мой плохой английский. Надеюсь, вы поймете это 🙂 Итак, для начала лучше использовать 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
Если вы хотите продолжить свое первое решение, запрос должен быть:
$sql = "update `problems` set `votes` = `votes` + 1 where `id` = '$problem_id'";
Пожалуйста, проверьте следующие ошибки
Используйте «И» между обоими данными в функции set-set или просто один из данных может использоваться для функции set-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); }