You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LocalStorage中的测验分数数据后台传输至MySQL数据库?

实现方案:前端传递LocalStorage数据到PHP并存储到MySQL

没问题,我来给你梳理一套完整的实现方案,从前端数据传递到后端存库的每个环节都给你说清楚:

一、前端:收集数据并发送到marks.php

首先你需要在测验完成的逻辑里,从LocalStorage取出存储的得分和题目数,计算出百分比后,通过AJAX把数据传给后端的marks.php。这里推荐用fetch API,语法简洁且现代。

示例代码:

// 从LocalStorage获取数据并解析为数字
const userMark = parseFloat(localStorage.getItem('userMark'));
const questionCounter = parseFloat(localStorage.getItem('questionCounter'));

// 先做基础校验,避免除数为0或数据为空的异常
if (!userMark || !questionCounter || questionCounter === 0) {
  alert('数据异常,无法提交得分');
  return;
}

// 计算百分比并保留两位小数
const percentage = (userMark / questionCounter * 100).toFixed(2);

// 发送数据到后端
fetch('marks.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: `userMark=${encodeURIComponent(userMark)}&questionCounter=${encodeURIComponent(questionCounter)}&percentage=${encodeURIComponent(percentage)}`
})
.then(response => response.text())
.then(data => {
  console.log('提交结果:', data);
  // 这里可以添加提交成功后的交互,比如显示"得分已保存"提示
})
.catch(error => {
  console.error('提交失败:', error);
  alert('提交失败,请稍后重试');
});

二、后端:marks.php处理请求并写入MySQL

后端需要接收前端传的参数,验证合法性,然后连接MySQL数据库插入数据。强烈推荐使用PDO而非mysqli,PDO对SQL注入的防护更友好,也支持多种数据库。

1. 先准备数据库表(示例)

先在MySQL里创建一个存储得分的表,比如quiz_scores:

CREATE TABLE quiz_scores (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_mark DECIMAL(5,2) NOT NULL, -- 存储用户得分,支持小数
  question_count INT NOT NULL, -- 存储题目数量
  percentage DECIMAL(5,2) NOT NULL, -- 存储百分比得分
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 自动记录提交时间
);

2. marks.php核心代码

<?php
// 生产环境禁用错误输出(开发环境可开启调试)
error_reporting(0);
ini_set('display_errors', 0);

// 接收前端POST参数,做默认值处理
$userMark = $_POST['userMark'] ?? '';
$questionCounter = $_POST['questionCounter'] ?? '';
$percentage = $_POST['percentage'] ?? '';

// 参数合法性校验:不能为空且必须是数字
if (empty($userMark) || empty($questionCounter) || empty($percentage) || !is_numeric($userMark) || !is_numeric($questionCounter) || !is_numeric($percentage)) {
  echo '参数非法,请检查数据';
  exit;
}

// 转换为对应的数据库存储类型
$userMark = (float)$userMark;
$questionCounter = (int)$questionCounter;
$percentage = (float)$percentage;

// 替换成你的实际数据库连接信息
$host = 'localhost';
$dbname = 'your_database_name';
$username = 'your_db_username';
$password = 'your_db_password';

try {
  // 初始化PDO连接,设置字符集和错误模式
  $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // 使用预处理语句(占位符)防止SQL注入
  $stmt = $pdo->prepare("INSERT INTO quiz_scores (user_mark, question_count, percentage) VALUES (:user_mark, :question_count, :percentage)");
  
  // 绑定参数
  $stmt->bindParam(':user_mark', $userMark);
  $stmt->bindParam(':question_count', $questionCounter);
  $stmt->bindParam(':percentage', $percentage);
  
  // 执行插入操作
  $stmt->execute();

  echo '得分已成功保存到数据库';
} catch(PDOException $e) {
  // 生产环境可以返回通用错误,不要泄露具体异常信息
  echo '数据保存失败,请稍后重试';
  // 开发环境可以打印错误日志:error_log($e->getMessage());
}

// PDO会自动关闭连接,这里可选手动销毁
$pdo = null;
?>

三、关键注意事项

  • 安全防护:
    • 永远不要信任前端传过来的数据,一定要做参数校验(是否为数字、是否为空)。
    • 必须使用PDO预处理语句(占位符),绝对不要直接把变量拼到SQL语句里,防止SQL注入。
    • 生产环境不要把数据库错误信息直接返回给前端,避免泄露敏感信息。
  • 数据类型:前端传递的是字符串,后端要转换为对应的数字类型(float/int)再存入数据库,保证数据一致性。
  • 异常处理:前端要处理网络请求失败的情况,后端要处理数据库连接失败、插入失败的异常。

内容的提问来源于stack exchange,提问作者Adnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:13:27