Как обновить строку таблицы +1 при нажатии на элемент?

Я строю систему голосования по вопросам. Посетители сайта могут голосовать один раз в день или около того по вопросу, который им нравится больше всего. Как я могу +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, а затем извлечь его при нажатии кнопки, но я не знаю, как? И как мне избежать, чтобы люди дважды голосовали по одному и тому же вопросу?

2

Решение

Что ж, вам нужно будет изменить свою таблицу БД или создать дополнительные таблицы, которые связаны между собой и имеют отношение 1 ко многим, таблица вопросов — это 1 и таблица, в которой хранятся все user's vote это много сторон.

  1. Каждый вопрос должен иметь уникальный идентификатор

  2. Цикл вопросов от Questions стол как у вас выше. В каждой строке должна быть кнопка, которая при нажатии передает идентификатор вопроса + идентификатор пользователя / (IP-адрес — если система открыта для незарегистрированных пользователей) user's vote Таблица.

    2а. Чтобы увеличить счетчик каждый раз, когда уникальный пользователь нажимает vote кнопку, вам придется Fetch чтобы получить Count от user's vote таблица, чтобы увидеть, сколько раз Question ID существует.

  3. Но, прежде чем хранить данные в БД, проверьте 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>;
    }
    
1

Другие решения

Самое большое препятствие, которое у вас будет, — это идентификация уникальных пользователей. Лучший способ — принудительно зарегистрироваться и войти в систему. Это обсуждение другой темы.

Независимо от этого ваша таблица должна иметь 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
?>
1

По вопросам рекламы [email protected]