Я строю систему голосования по вопросам. Посетители сайта могут голосовать один раз в день или около того по вопросу, который им нравится больше всего. Как я могу +1 к QuestionVotes
строка, когда нажимается кнопка для конкретного вопроса?
Мой код:
<?php
$connection = mysqli_connect('localhost', 'root', '', 'test');
mysqli_set_charset($connection, 'utf8');
if (!$connection) {
die("Database connection failed: " . mysqli_error());
}
$sql = "SELECT QuestionHeader, QuestionText, QuestionVotes FROM question ORDER BY QuestionVotes DESC LIMIT 3";
$result = $connection->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "<div class=\"col-md-4\"><h2>". $row["QuestionHeader"]. "</h2><p>". $row["QuestionText"]. "</p><p><a class=\"btn btn-success\"> " . $row["QuestionVotes"] . "</a></p></div>";
}
} else {
echo "0 results";
}
$connection->close();
?>
Я предполагаю, что мне нужно как-то сохранить QuestionID, а затем извлечь его при нажатии кнопки, но я не знаю, как? И как мне избежать, чтобы люди дважды голосовали по одному и тому же вопросу?
Что ж, вам нужно будет изменить свою таблицу БД или создать дополнительные таблицы, которые связаны между собой и имеют отношение 1 ко многим, таблица вопросов — это 1 и таблица, в которой хранятся все user's vote
это много сторон.
Каждый вопрос должен иметь уникальный идентификатор
Цикл вопросов от Questions
стол как у вас выше. В каждой строке должна быть кнопка, которая при нажатии передает идентификатор вопроса + идентификатор пользователя / (IP-адрес — если система открыта для незарегистрированных пользователей) user's vote
Таблица.
2а. Чтобы увеличить счетчик каждый раз, когда уникальный пользователь нажимает vote
кнопку, вам придется Fetch
чтобы получить Count
от user's vote
таблица, чтобы увидеть, сколько раз Question ID
существует.
Но, прежде чем хранить данные в БД, проверьте user's vote
таблица, чтобы увидеть, совпадает ли этот идентификатор пользователя + идентификатор вопроса, если так; вернуть сообщение, сообщающее пользователю, что он уже проголосовал по этому вопросу (или вы можете получить фантазию и сделать проверку на странице, если есть совпадение — отключите кнопку голосования)
$dbname = "DB HERE";
$servername = "HOST HERE";
$username = "DB USER HERE";
$password = "DB PASSWORD HERE";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
if(isset($_GET['id']))
{
///Check to see if user already voted
$result = $conn->query("SELECT * FROM User_Votes where user id = $session_id and question_id = $id");
$row_cnt = $result->num_rows;
if($row_cnt < 1)
{
///SQL to insert vote into Users Votes table
}else
{
//Vote already exists
}
}
// Loop through questions for voting
$result = mysqli_query($conn,"select * from questions");
while($db_questions = mysqli_fetch_object($result))
{
echo $db_questions->question_title;
echo '- <a href="mypage.php?id=$db_questions->question_id">Click to Vote</a>;
}
Самое большое препятствие, которое у вас будет, — это идентификация уникальных пользователей. Лучший способ — принудительно зарегистрироваться и войти в систему. Это обсуждение другой темы.
Независимо от этого ваша таблица должна иметь 2 других столбца.
QuestionID
MediumINT (15), без знака, первичный индекс, автоинкремент. Это должен быть самый первый столбец.
QuestionVoters
Текст, NULL. Это поле будет содержать закодированный в json массив идентификаторов пользователей, которые проголосовали. array('123', '38', '27', '15')
В вашем While()
проверка цикла, если идентификатор пользователя находится в QuestionVoters
массив.
Если он существует, тогда не давайте им право голоса. В противном случае создайте форму, используя кнопку для отправки на страницу обработки.
<?php
// Need to assign the user's ID to a variable ($userID) to pass to the form.
$userID = '123'; // this needs to be handled on your end.
// updated sql to include Id and voters
$sql = "SELECT QuestionID, QuestionHeader, QuestionText, QuestionVotes, QuestionVoters FROM question ORDER BY QuestionVotes DESC LIMIT 3";
while($row = $result->fetch_assoc()) {
$voters = json_decode($row['QuestionVoters'], true); // array of userid's that have voted
IF (in_array($userID, $voters)) {
// user has voted
echo "\n
<div class=\"col-md-4\">
<h2>". $row["QuestionHeader"]. "</h2>
<p>". $row["QuestionText"]. "</p>
<p>" . $row["QuestionVotes"] . "</p>
</div>";
}ELSE{
// user has not voted
echo "\n
<div class=\"col-md-4\">
<form action=\"vote_processing.php\" name=\"voting\" method=\"post\">
<input type=\"hidden\" name=\"qid\" value=\"".$row['QuestionID']."\" />
<input type=\"hidden\" name=\"userid\" value=\"".$userID."\" />
<h2>". $row["QuestionHeader"]. "</h2>
<p>". $row["QuestionText"]. "</p>
<p><button type=\"submit\" value=\"Submit\">" . $row["QuestionVotes"] . "</button></p>
</form>
</div>";
}
}
?>
vote_processing.php (пример)
<?php
IF (isset($_POST['qid'])) {
$qid = htmlspecialchars(strip_tags(trim($_POST['qid']))); // basic sanitization
$userid = htmlspecialchars(strip_tags(trim($_POST['userid']))); // basic sanitization
IF ( (is_int($qid)) && (is_int($userid)) ) { // validate that both are integers
// db connection
$connection = mysqli_connect('localhost', 'root', '', 'test');
mysqli_set_charset($connection, 'utf8');
if (!$connection) {
die("Database connection failed: " . mysqli_error());
}
// Get voters array
$sql = "SELECT QuestionVoters FROM question WHERE QuestionID = '".$qid."'";
$result = $connection->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
IF (!empty($row['QuestionVoters'])) {
// decode users array
$voters = json_decode($row['QuestionVoters'], true);
}ELSE{
$voters = array(); // create array
}
}
mysqli_free_result($result);
// re-validate the userID "is not" in array
IF (!in_array($userid, $voters)) { // note the ! [meaning NOT].
$voters[] = $userid; // add userid to voters array
$qvoters = json_encode($voters); // encode voters array
// update vote
$sql_upd = "UPDATE question SET QuestionVotes = QuestionVotes + 1, QuestionVoters = $qvoters WHERE QuestionID = '".$qid."'";
$upd_result = $connection->query($sql_upd);
}
}
mysqli_close($connection);
}
}
// redirct back to previous page
?>