Maison  >  Article  >  développement back-end  >  Comment implémenter un système de vote en ligne en PHP ?

Comment implémenter un système de vote en ligne en PHP ?

PHPz
PHPzoriginal
2023-05-12 08:36:361318parcourir

Dans la société moderne, le vote est devenu un comportement très important. Il est étroitement lié à des valeurs telles que la démocratie, la justice et l'équité. Son importance n'a pas besoin d'être présentée. Pour de nombreux sites Internet et entreprises, afin de recueillir les avis et les décisions des groupes d’utilisateurs, il est devenu de plus en plus nécessaire de mettre en place des systèmes de vote en ligne. Dans cet article, nous examinerons en profondeur comment mettre en œuvre un système de vote en ligne efficace, évolutif et sécurisé en PHP.

  1. Conception de base de données

Lors de la mise en œuvre d'un système de vote en ligne, le stockage des données est une étape cruciale. Afin de garantir la sécurité et l'évolutivité des données, nous pouvons utiliser MySQL ou d'autres bases de données relationnelles. Dans la conception de la base de données, nous devons créer au moins deux tables : la table des utilisateurs et la table de vote.

Le tableau des utilisateurs comprend l'ID utilisateur, le nom d'utilisateur, le mot de passe, l'adresse e-mail et d'autres informations. Nous pouvons également ajouter d'autres champs, tels que le type d'utilisateur, les autorisations de l'utilisateur, etc. La table de vote comprend l'identifiant de vote, le sujet de vote, les options de vote, les résultats du vote et d'autres informations. Afin de mettre en œuvre le vote en ligne, nous devons créer un identifiant de vote unique pour chaque transaction de vote.

Voici un exemple simple de code MySQL :

CREATE TABLE users (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(30) NOT NULL,
  password VARCHAR(30) NOT NULL,
  email VARCHAR(50),
  type ENUM('user', 'admin') NOT NULL
);

CREATE TABLE polls (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  user_id INT(6) UNSIGNED,
  question VARCHAR(200) NOT NULL,
  UNIQUE (id)
);

CREATE TABLE options (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  poll_id INT(6) UNSIGNED,
  name VARCHAR(50) NOT NULL,
  votes INT(6) UNSIGNED DEFAULT 0,
  UNIQUE (id)
);
  1. Authentification de l'utilisateur

L'authentification de l'utilisateur est une étape cruciale lors de la mise en œuvre d'un système de vote en ligne. Nous devons nous assurer que seuls les utilisateurs enregistrés peuvent créer de nouveaux sujets de sondage et voter. Dans les applications PHP de base, nous utilisons généralement des sessions SESSION pour contrôler le statut de connexion de l'utilisateur afin qu'il puisse se souvenir de son identité lorsqu'il navigue sur le site Web. Voici une page de connexion utilisateur simple et un exemple de code PHPSESSION de base :

<?php
session_start();

if($_SERVER["REQUEST_METHOD"] == "POST") {
  // 用户提交表单数据,进行身份验证
  $username = $_POST['username'];
  $password = $_POST['password'];

  // 在数据库中查找用户名和密码
  $sql = "SELECT id, type FROM users WHERE username = '$username' and password = '$password'";
  $result = mysqli_query($db,$sql);
  $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
  
  // 如果用户存在,创建SESSION变量并跳转到投票主题页面
  if(mysqli_num_rows($result) == 1) {
    $_SESSION['login_user'] = $username;
    $_SESSION['login_id'] = $row['id'];
    $_SESSION['login_type'] = $row['type'];
    header("location: polls.php");
  }
  // 如果用户不存在或者密码错误,则显示错误消息
  else {
    $error = "用户名或密码错误!";
  }
}

?>

<!DOCTYPE html>
<html>
<head>
  <title>用户登录</title>
</head>
<body>
  <form method="post">
    <label>用户名:</label><input type="text" name="username"><br>
    <label>密码:</label><input type="password" name="password"><br>
    <input type="submit" value="登录">
  </form>
  <?php
  if(isset($error)) {
    echo "<div>$error</div>";
  }
  ?>
</body>
</html>
  1. Page de sujet de vote

La page de sujet de vote est le composant principal du système de vote en ligne. Dans cette page, nous pouvons afficher tous les sujets de sondage actuellement existants et permettre aux utilisateurs de créer de nouveaux sujets de sondage. Lorsque les utilisateurs cliquent sur le sujet de vote, nous les redirigeons vers la page de vote pour leur permettre de voter plus facilement. Voici un exemple de code PHP pour une page de thème de vote simple :

<?php
session_start();

// 检查用户是否已经登录
if(!isset($_SESSION['login_user'])) {
  header("location: login.php");
}

// 处理创建新投票请求
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['question'])) {
  // 添加一个新的投票主题
  $question = $_POST['question'];
  $user_id = $_SESSION['login_id'];
  $sql = "INSERT INTO polls (question, user_id) VALUES ('$question', $user_id)";
  mysqli_query($db,$sql);
}

// 从数据库中检索所有的投票主题
$sql = "SELECT * FROM polls ORDER BY id DESC";
$result = mysqli_query($db,$sql);

// 渲染HTML模板,显示所有的投票主题
?>
<!DOCTYPE html>
<html>
<head>
  <title>投票主题</title>
</head>
<body>
  <h2>投票主题列表</h2>
  <ul>
  <?php
  while($row = mysqli_fetch_assoc($result)) {
    echo "<li><a href='vote.php?id={$row['id']}'>{$row['question']}</a></li>";
  }
  ?>
  </ul>
  <?php
  // 如果用户是管理员,则显示一个表单以添加新的投票主题
  if($_SESSION['login_type'] == 'admin') {
    echo "<form method='post'>
      <label>新主题:</label><input type='text' name='question'>
      <input type='submit' value='添加'>
      </form>";
  }
  ?>
  <a href='logout.php'>注销</a>
</body>
</html>
  1. Page de vote

La page de vote est l'élément clé qui permet aux utilisateurs de voter. Sur cette page, nous devons afficher les options de vote et permettre aux utilisateurs de voter pour leur option préférée. Dans le même temps, nous devons afficher le numéro de vote actuel et le pourcentage pour référence de l'utilisateur.

Ce qui suit est un exemple simple de code PHP d'une page de vote :

<?php
session_start();

// 检查用户是否已经登录
if(!isset($_SESSION['login_user'])) {
  header("location: login.php");
}

// 处理投票请求
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['option'])) {
  $poll_id = intval($_GET['id']);
  $option_id = intval($_POST['option']);
  $user_id = $_SESSION['login_id'];

  // 检查用户是否已经投过票
  $sql = "SELECT id FROM votes WHERE user_id = $user_id AND poll_id = $poll_id";
  $result = mysqli_query($db,$sql);
  if(mysqli_num_rows($result) == 0) {
    // 在数据库中增加一个新的投票
    $sql = "INSERT INTO votes (user_id, poll_id, option_id) VALUES ($user_id, $poll_id, $option_id)";
    mysqli_query($db,$sql);

    // 更新选项投票数
    $sql = "UPDATE options SET votes = votes + 1 WHERE id = $option_id";
    mysqli_query($db,$sql);
  }
}

// 获取当前投票的所有信息
$poll_id = intval($_GET['id']);
$sql = "SELECT * FROM polls WHERE id = $poll_id";
$result = mysqli_query($db,$sql);
$row = mysqli_fetch_assoc($result);

// 获取投票选项和投票结果
$sql = "SELECT options.*, COUNT(votes.id) as count FROM options LEFT JOIN votes ON votes.option_id = options.id WHERE options.poll_id = $poll_id GROUP BY options.id";
$result = mysqli_query($db,$sql);

// 渲染HTML模板以显示投票主题和选项
?>
<!DOCTYPE html>
<html>
<head>
  <title>投票 - <?php echo $row['question']; ?></title>
</head>
<body>
  <h2><?php echo $row['question']; ?></h2>
  <form method="post">
  <ul>
  <?php
  while($row = mysqli_fetch_assoc($result)) {
    echo "<li>";
    echo "<label><input type='radio' name='option' value='{$row['id']}' required>{$row['name']}</label>";
    echo "<span>{$row['count']} votes (".round($row['count']*100/$total)."%)</span>";
    echo "</li>";
  }
  ?>
  </ul>
  <input type="submit" value="投票">
  </form>
  <a href='polls.php'>返回</a>
  <?php
  // 如果用户已经投了票,则显示一条 "您已经投票了!" 的消息
  $user_id = $_SESSION['login_id'];
  $sql = "SELECT id FROM votes WHERE user_id = $user_id AND poll_id = $poll_id";
  $result = mysqli_query($db,$sql);
  if(mysqli_num_rows($result) == 1) {
    echo "<p>您已经投票了!</p>";
  }
  ?>
</body>
</html>
  1. Résumé

Grâce aux étapes ci-dessus, nous avons mis en œuvre avec succès un système de vote en ligne de haute qualité, d'excellentes performances, sécurité et fiabilité, et des fonctions complètes. . Mais ce n'est qu'un exemple simple. Dans les applications réelles, il faudra peut-être ajouter davantage de fonctions et de fonctionnalités de sécurité, telles que la vérification des données, le contrôle d'accès aux rôles, etc. Dans tous les cas, la sécurité, l’évolutivité et la convivialité devraient être les principales considérations lors de la conception et de la mise en œuvre d’un système de vote en ligne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn