Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan sistem pengundian dalam talian dalam PHP?

Bagaimana untuk melaksanakan sistem pengundian dalam talian dalam PHP?

PHPz
PHPzasal
2023-05-12 08:36:361277semak imbas

Dalam masyarakat moden, mengundi telah menjadi tingkah laku yang sangat penting Ia berkait rapat dengan nilai-nilai seperti demokrasi, keadilan, dan kepentingannya tidak perlu diperkenalkan. Bagi kebanyakan laman web dan syarikat, untuk mengumpul pendapat dan keputusan kumpulan pengguna, semakin diperlukan untuk melaksanakan sistem pengundian dalam talian. Dalam artikel ini, kami akan melihat secara mendalam tentang cara melaksanakan sistem pengundian dalam talian yang cekap, berskala dan selamat dalam PHP.

  1. Reka Bentuk Pangkalan Data

Storan data ialah langkah penting apabila melaksanakan sistem pengundian dalam talian. Untuk memastikan keselamatan dan kebolehskalaan data, kami boleh menggunakan MySQL atau pangkalan data hubungan lain. Dalam reka bentuk pangkalan data, kita perlu mencipta sekurang-kurangnya dua jadual: jadual pengguna dan jadual undian.

Jadual pengguna termasuk ID pengguna, nama pengguna, kata laluan, alamat e-mel dan maklumat lain. Kami juga boleh menambah beberapa medan lain, seperti jenis pengguna, kebenaran pengguna, dsb. Jadual pengundian termasuk ID pengundian, topik pengundian, pilihan pengundian, keputusan pengundian dan maklumat lain. Untuk melaksanakan pengundian dalam talian, kami perlu mencipta ID undian unik untuk setiap transaksi pengundian.

Berikut ialah contoh kod MySQL yang mudah:

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. Pengesahan Pengguna

Pengesahan pengguna adalah penting apabila melaksanakan langkah sistem pengundian dalam talian. Kami perlu memastikan bahawa hanya pengguna berdaftar boleh membuat topik tinjauan pendapat baharu dan mengundi. Dalam aplikasi PHP asas, kami biasanya menggunakan sesi SESI untuk mengawal status log masuk pengguna supaya mereka dapat mengingati identiti mereka apabila mereka melayari laman web. Berikut ialah halaman log masuk pengguna mudah dan contoh kod PHPSESSION asas:

<?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. Halaman topik undian

Halaman topik undian ialah komponen teras sistem pengundian dalam talian. Dalam halaman ini kami boleh memaparkan semua topik pengundian sedia ada dan membenarkan pengguna mencipta topik pengundian baharu. Apabila pengguna mengklik topik undian, kami akan melompat mereka ke halaman mengundi untuk memudahkan mereka mengundi. Berikut ialah contoh kod PHP untuk halaman tema undian mudah:

<?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. Halaman undian

Halaman pengundian ialah bahagian penting yang membolehkan pengguna mengundi. Dalam halaman ini kami perlu memaparkan pilihan mengundi dan membenarkan pengguna mengundi untuk pilihan kegemaran mereka. Pada masa yang sama, kita perlu memaparkan nombor undian dan peratusan semasa untuk rujukan pengguna.

Berikut ialah contoh kod PHP untuk halaman undian mudah:

<?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. Ringkasan

Dengan langkah di atas, kami telah berjaya mencapai kualiti Sistem pengundian dalam talian dengan prestasi tinggi, keselamatan, kebolehpercayaan dan fungsi lengkap. Tetapi ini hanyalah contoh mudah Dalam aplikasi sebenar, lebih banyak fungsi dan ciri keselamatan mungkin perlu ditambah, seperti pengesahan data, kawalan akses peranan, dsb. Walau apa pun, keselamatan, kebolehskalaan dan kemesraan pengguna harus menjadi pertimbangan utama semasa reka bentuk dan pelaksanaan sistem pengundian dalam talian.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan sistem pengundian dalam talian dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn