PHP打造在线问卷调查发布平台

admin 2025-01-13 604 0

在互联网时代,问卷调查已成为收集用户反馈、市场调研的重要工具。本文将带你一步步用PHP构建一个功能齐全的在线问卷调查发布平台,助你轻松掌握数据收集的艺术。

PHP打造在线问卷调查发布平台

项目准备

首先,确保你的开发环境已安装以下工具:

  • PHP 7.4及以上版本
  • MySQL数据库
  • Apache或Nginx服务器
  • 文本编辑器(如VSCode)

1. 数据库设计

在MySQL中创建一个名为survey_platform的数据库,并设计以下表结构:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL
);

CREATE TABLE surveys (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE questions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    survey_id INT,
    question_text TEXT NOT NULL,
    question_type ENUM('text', 'multiple_choice', 'checkbox') NOT NULL,
    FOREIGN KEY (survey_id) REFERENCES surveys(id)
);

CREATE TABLE answers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    question_id INT,
    answer_text TEXT NOT NULL,
    FOREIGN KEY (question_id) REFERENCES questions(id)
);

CREATE TABLE responses (
    id INT AUTO_INCREMENT PRIMARY KEY,
    survey_id INT,
    respondent_ip VARCHAR(45),
    submitted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (survey_id) REFERENCES surveys(id)
);

CREATE TABLE response_details (
    id INT AUTO_INCREMENT PRIMARY KEY,
    response_id INT,
    question_id INT,
    answer_text TEXT,
    FOREIGN KEY (response_id) REFERENCES responses(id),
    FOREIGN KEY (question_id) REFERENCES questions(id)
);

2. 项目结构

在项目根目录下创建以下文件夹和文件:

/survey_platform
    /includes
        config.php
        db.php
    /public
        index.php
    /src
        User.php
        Survey.php
        Question.php
        Response.php

核心功能实现

1. 数据库连接

includes/db.php中配置数据库连接:

<?php
$host = 'localhost';
$db   = 'survey_platform';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>

2. 用户管理

src/User.php中实现用户注册和登录功能:

<?php
class User {
    private $pdo;

    public function __construct($pdo) {
        $this->pdo = $pdo;
    }

    public function register($username, $password, $email) {
        $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
        $stmt = $this->pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)");
        $stmt->execute([$username, $hashedPassword, $email]);
    }

    public function login($username, $password) {
        $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = ?");
        $stmt->execute([$username]);
        $user = $stmt->fetch();
        if ($user && password_verify($password, $user['password'])) {
            return $user;
        }
        return false;
    }
}
?>

3. 问卷管理

src/Survey.php中实现问卷的创建和展示:

<?php
class Survey {
    private $pdo;

    public function __construct($pdo) {
        $this->pdo = $pdo;
    }

    public function create($userId, $title, $description) {
        $stmt = $this->pdo->prepare("INSERT INTO surveys (user_id, title, description) VALUES (?, ?, ?)");
        $stmt->execute([$userId, $title, $description]);
        return $this->pdo->lastInsertId();
    }

    public function getAllSurveys() {
        $stmt = $this->pdo->query("SELECT * FROM surveys");
        return $stmt->fetchAll();
    }
}
?>

4. 问题管理

src/Question.php中实现问题的添加

评论(0)