背景
上个文章写了人力资源系统快测试的解决方案,现在从代码数据库完整的出个方案。
解决方案
下面我将为您提供一个完整的PHP+MySQL实现方案,包括数据库结构和PHP代码。
一、数据库设计
1. 创建数据库和表结构
CREATE DATABASE personality_test;
USE personality_test;
-- 用户测试记录表
CREATE TABLE test_results (
id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(100) NOT NULL,
answers VARCHAR(100) NOT NULL COMMENT '用户答案,格式如:A,B,A,B,...',
score_e TINYINT NOT NULL COMMENT '外向性得分',
score_a TINYINT NOT NULL COMMENT '宜人性得分',
score_c TINYINT NOT NULL COMMENT '尽责性得分',
score_n TINYINT NOT NULL COMMENT '情绪稳定性得分',
score_o TINYINT NOT NULL COMMENT '开放性得分',
personality_type VARCHAR(50) NOT NULL COMMENT '主要性格类型',
description TEXT NOT NULL COMMENT '性格描述',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 测试题目表
CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
question_text TEXT NOT NULL,
option_a TEXT NOT NULL,
option_b TEXT NOT NULL,
trait_a CHAR(1) NOT NULL COMMENT 'A选项对应的特质',
trait_b CHAR(1) NOT NULL COMMENT 'B选项对应的特质',
sort_order INT NOT NULL DEFAULT 0
);
-- 插入测试题目
INSERT INTO questions (question_text, option_a, option_b, trait_a, trait_b, sort_order) VALUES
('我喜欢尝试新鲜事物,充满好奇心。', 'A. 是的', 'B. 不是', 'O', '', 1),
('在聚会中,我通常是活跃和引人注目的。', 'A. 是的', 'B. 不是', 'E', '', 2),
('我倾向于直接相信他人是诚实和善良的。', 'A. 是的', 'B. 不是', 'A', '', 3),
('我的物品和工作文件总是整理得井井有条。', 'A. 是的', 'B. 不是', 'C', '', 4),
('我很容易感到焦虑或压力。', 'A. 是的', 'B. 不是', '', 'N', 5),
('我对艺术、音乐和文学有浓厚的兴趣。', 'A. 是的', 'B. 不是', 'O', '', 6),
('我喜欢成为大家关注的焦点。', 'A. 是的', 'B. 不是', 'E', '', 7),
('我乐于助人,并尽量满足他人的请求。', 'A. 是的', 'B. 不是', 'A', '', 8),
('我做事有明确的计划和 deadline,并严格执行。', 'A. 是的', 'B. 不是', 'C', '', 9),
('我经常沉浸在自我的情绪和想法中。', 'A. 是的', 'B. 不是', '', 'N', 10);
二、PHP代码实现
1. 数据库连接配置 (config.php)
如果您是用的框架或cms,就直接忽略吧。
<?php
// 数据库配置
define('DB_HOST', 'localhost');
define('DB_NAME', 'personality_test');
define('DB_USER', 'root');
define('DB_PASS', 'password'); // 请替换为您的数据库密码
// 创建数据库连接
function getDBConnection() {
try {
$conn = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET NAMES 'utf8'");
return $conn;
} catch(PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
}
?>
2. 测试页面 (index.php)
<?php
require_once 'config.php';
// 获取所有题目
$questions = [];
try {
$conn = getDBConnection();
$stmt = $conn->query("SELECT * FROM questions ORDER BY sort_order");
$questions = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
die("获取题目失败: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>性格测试</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.question { margin-bottom: 20px; padding: 15px; border: 1px solid #ddd; border-radius: 5px; }
.options { margin-top: 10px; }
.options label { display: block; margin: 8px 0; }
button { background-color: #4CAF50; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
button:hover { background-color: #45a049; }
</style>
</head>
<body>
<h1>性格测试</h1>
<form action="submit_test.php" method="post">
<?php foreach ($questions as $index => $question): ?>
<div class="question">
<p><strong>问题 <?php echo $index + 1; ?>:</strong> <?php echo $question['question_text']; ?></p>
<div class="options">
<label>
<input type="radio" name="q<?php echo $question['id']; ?>" value="A" required>
<?php echo $question['option_a']; ?>
</label>
<label>
<input type="radio" name="q<?php echo $question['id']; ?>" value="B" required>
<?php echo $question['option_b']; ?>
</label>
</div>
</div>
<?php endforeach; ?>
<div>
<label for="user_name">您的姓名:</label>
<input type="text" id="user_name" name="user_name" required>
</div>
<button type="submit">提交测试</button>
</form>
</body>
</html>
3. 测试结果处理 (submit_test.php)
<?php
require_once 'config.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php');
exit;
}
// 获取用户姓名和答案
$user_name = $_POST['user_name'];
$answers = [];
// 提取所有问题的答案
try {
$conn = getDBConnection();
$stmt = $conn->query("SELECT id FROM questions ORDER BY sort_order");
$question_ids = $stmt->fetchAll(PDO::FETCH_COLUMN);
foreach ($question_ids as $qid) {
$answer_key = 'q' . $qid;
if (isset($_POST[$answer_key])) {
$answers[] = $_POST[$answer_key];
} else {
// 如果有未回答的问题,返回测试页面
header('Location: index.php?error=请回答所有问题');
exit;
}
}
} catch(PDOException $e) {
die("处理答案时出错: " . $e->getMessage());
}
// 计算得分
$scores = [
'E' => 0, // 外向性
'A' => 0, // 宜人性
'C' => 0, // 尽责性
'N' => 0, // 情绪稳定性
'O' => 0 // 开放性
];
try {
$conn = getDBConnection();
$stmt = $conn->query("SELECT * FROM questions ORDER BY sort_order");
$questions = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($questions as $index => $question) {
$answer = $answers[$index];
if ($answer === 'A' && !empty($question['trait_a'])) {
$scores[$question['trait_a']]++;
} elseif ($answer === 'B' && !empty($question['trait_b'])) {
$scores[$question['trait_b']]++;
}
}
} catch(PDOException $e) {
die("计算得分时出错: " . $e->getMessage());
}
// 确定主要性格类型
$primary_trait = '';
$max_score = 0;
foreach ($scores as $trait => $score) {
if ($score > $max_score) {
$max_score = $score;
$primary_trait = $trait;
}
}
// 生成性格描述
$descriptions = [
'E' => '外向型:您性格外向,善于社交,喜欢与人互动,能从社交活动中获得能量。',
'A' => '宜人型:您待人友善,富有同情心,乐于合作,注重人际和谐。',
'C' => '尽责型:您做事有条理,负责任,有组织性,注重细节和计划。',
'N' => '稳定型:您情绪稳定,抗压能力强,能够冷静应对挑战和压力。',
'O' => '开放型:您思维开放,富有创造力,喜欢尝试新事物,对新鲜 ideas 持开放态度。'
];
$personality_type = '';
$description = '';
if (isset($descriptions[$primary_trait])) {
$personality_type = $primary_trait . '型人格';
$description = $descriptions[$primary_trait];
// 添加额外描述
if ($scores['O'] >= 1) {
$description .= " 您还具有开放的思维,愿意接受新观念。";
}
if ($scores['C'] >= 1) {
$description .= " 同时您做事认真负责,有条理性。";
}
if ($scores['N'] >= 1) {
$description .= " 您的情绪较为稳定,能够较好地应对压力。";
}
} else {
$personality_type = '均衡型人格';
$description = '您的性格特点较为均衡,没有特别突出的特质,这使您能够适应多种环境和工作要求。';
}
// 保存测试结果到数据库
try {
$conn = getDBConnection();
$sql = "INSERT INTO test_results (user_name, answers, score_e, score_a, score_c, score_n, score_o, personality_type, description)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->execute([
$user_name,
implode(',', $answers),
$scores['E'],
$scores['A'],
$scores['C'],
$scores['N'],
$scores['O'],
$personality_type,
$description
]);
} catch(PDOException $e) {
die("保存结果时出错: " . $e->getMessage());
}
// 显示测试结果
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试结果</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.result-card { background-color: #f9f9f9; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
.scores { display: flex; justify-content: space-between; margin: 20px 0; }
.score-item { text-align: center; }
.score-value { font-size: 24px; font-weight: bold; }
.score-label { font-size: 14px; color: #666; }
</style>
</head>
<body>
<h1>测试结果</h1>
<div class="result-card">
<h2><?php echo $user_name; ?>,您的性格类型是:<?php echo $personality_type; ?></h2>
<p><?php echo $description; ?></p>
<div class="scores">
<div class="score-item">
<div class="score-value"><?php echo $scores['E']; ?></div>
<div class="score-label">外向性</div>
</div>
<div class="score-item">
<div class="score-value"><?php echo $scores['A']; ?></div>
<div class="score-label">宜人性</div>
</div>
<div class="score-item">
<div class="score-value"><?php echo $scores['C']; ?></div>
<div class="score-label">尽责性</div>
</div>
<div class="score-item">
<div class="score-value"><?php echo $scores['N']; ?></div>
<div class="score-label">情绪稳定性</div>
</div>
<div class="score-item">
<div class="score-value"><?php echo $scores['O']; ?></div>
<div class="score-label">开放性</div>
</div>
</div>
</div>
<p><a href="index.php">返回测试页面</a></p>
</body>
</html>
三、使用说明
创建MySQL数据库并导入提供的SQL语句
修改
config.php
中的数据库连接信息将PHP文件部署到Web服务器
访问
index.php
开始测试
四、扩展建议
增加管理员后台:可以添加一个后台管理界面,查看所有测试结果和统计信息
增加图表可视化:使用Chart.js等库可视化得分结果
添加更多题目:根据实际需要扩展题目库
优化移动端体验:添加响应式设计,确保在手机上的良好显示
增加结果分享功能:允许用户分享测试结果到社交媒体
这个实现提供了完整的性格测试功能,包括题目展示、答案收集、分数计算、结果生成和存储。您可以根据实际需求进一步调整和扩展。