如何将JavaScript随机生成结果传递给PHP并存储至用户资料
解决方案
核心思路
你的JS数组索引和数据库表的ID一一对应,只需把生成的索引值与当前登录用户ID绑定,通过后端接口存入数据库即可。下面是具体实现方案:
方案一:用AJAX异步提交(推荐,无页面刷新)
前端JS代码
假设老虎机生成结果后得到选中索引resultIndex,当前登录用户ID通过隐藏域存储在页面:
// 替换为你实际生成的老虎机结果索引 const resultIndex = 1; // 从隐藏域获取当前登录用户ID(页面需提前渲染:<input type="hidden" id="userId" value="<?php echo $_SESSION['user_id']; ?>">) const userId = document.getElementById('userId').value; // 用fetch发送POST请求 fetch('save_tiger_result.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, // 传递用户ID和结果索引(索引对应数据库的result表ID) body: `user_id=${userId}&result_id=${resultIndex}` }) .then(res => res.json()) .then(data => { if (data.success) { // 保存成功后的处理,比如在模态框提示用户 console.log('结果已保存'); } else { console.error('保存失败:', data.msg); } }) .catch(err => console.error('请求出错:', err));
后端PHP接口(save_tiger_result.php)
先验证用户登录状态,再处理数据插入,同时做合法性校验:
<?php session_start(); // 拦截未登录请求 if (!isset($_SESSION['user_id'])) { echo json_encode(['success' => false, 'msg' => '请先登录']); exit; } // 数据库连接(替换为你的配置) $pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { // 获取前端参数 $userId = $_POST['user_id']; $resultId = $_POST['result_id']; // 可选:验证result_id是否存在于数据库,防止恶意提交 $checkStmt = $pdo->prepare("SELECT id FROM your_result_table WHERE id = ?"); $checkStmt->execute([$resultId]); if (!$checkStmt->rowCount()) { echo json_encode(['success' => false, 'msg' => '无效的结果ID']); exit; } // 插入用户结果表(假设表名为user_tiger_results,字段:user_id, result_id, created_at) $stmt = $pdo->prepare("INSERT INTO user_tiger_results (user_id, result_id, created_at) VALUES (?, ?, NOW())"); $stmt->execute([$userId, $resultId]); echo json_encode(['success' => true, 'msg' => '保存成功']); } catch (PDOException $e) { echo json_encode(['success' => false, 'msg' => '数据库错误:' . $e->getMessage()]); } ?>
方案二:修复隐藏表单提交问题
如果你仍想使用表单提交,解决之前的问题只需两步:
- 在表单中添加用户ID隐藏域:
<form action="save_result.php" method="POST"> <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id']; ?>"> <input type="hidden" name="result_id" id="resultId"> <button type="submit">保存结果</button> </form>
- 老虎机生成结果后,用JS给隐藏域赋值:
document.getElementById('resultId').value = resultIndex;
后端处理逻辑和上面的PHP接口一致,记得做登录验证和数据校验。
用户历史记录查询
要让用户查看自己的结果,只需根据用户ID关联查询两张表:
<?php // 示例:获取当前用户的所有老虎机结果 $stmt = $pdo->prepare(" SELECT r.content, ur.created_at FROM user_tiger_results ur JOIN your_result_table r ON ur.result_id = r.id WHERE ur.user_id = ? ORDER BY ur.created_at DESC "); $stmt->execute([$_SESSION['user_id']]); $userResults = $stmt->fetchAll(PDO::FETCH_ASSOC); ?>
把查询到的$userResults渲染到用户个人页面即可。
内容的提问来源于stack exchange,提问作者MLR.
相关产品推荐
相关产品推荐

