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

如何将JS变量存入PHP数据库表并更新指定用户成绩?

问题与代码分析

我在JS文件中计算完成测验分数后,尝试将该变量传递至PHP文件以更新对应学生的成绩,脚本在已设置用户ID的用户专区执行。目前问题:指定用户成绩未被更新,推测变量未传递或PHP配置/代码存在问题。相关代码如下:

quiz.js

var vote = userScore * 10;

window.open('/php/vote.php?vote='+vote);

private-area.php

<?php
    require 'php/config.php';

    $_SESSION["id_utente"];

    $sessionId = $_SESSION["id_utente"];
    
    $user = mysqli_fetch_assoc(mysqli_query($connessione, "SELECT * FROM utenti WHERE id_utente = $sessionId"));
?>

vote.php (首次更新版本)

<?php

require_once('config.php');

$var_voto = $_GET['vote'];


if($connessione->connect_error){
    echo "Registrazione avvenuta con successo";

    $query = $connessione->prepare("UPDATE utenti SET voto = $var_voto  WHERE id = $user ");
    $query->bind_param('voto', $id);
    $result = $query->execute();

}else{
    echo "Error";
}


?>

核心错误点与修复方案

  1. Session未初始化
    vote.php中没有调用session_start(),无法获取到用户专区中设置的id_utente会话变量,导致找不到要更新的用户。

  2. 数据库连接判断逻辑完全颠倒
    if($connessione->connect_error)是当数据库连接失败时执行更新操作,这完全错误——只有连接成功时才应该执行数据库操作,否则提示错误。

  3. SQL预处理语句使用错误

  • 直接将$var_voto和$user拼入SQL语句,存在SQL注入风险,且$user在vote.php中未定义(它是private-area.php中的查询结果数组)。
  • bind_param的参数格式错误:第一个参数是变量类型(如s代表字符串,i代表整数),后续是要绑定的变量,你的写法完全不符合规则。
  1. 用户ID传递错误
    vote.php中未获取当前用户的id_utente,应从session中读取,而非依赖其他页面的变量;SQL中WHERE id = $user错误,应该用WHERE id_utente = [会话中的ID值]。

  2. JS数据传递方式不合理
    window.open可能被浏览器拦截,且GET请求传递数据有长度限制,建议改用AJAX方式(fetch/XMLHttpRequest)。


修正后的代码

修正vote.php

<?php
session_start(); // 必须先启动session
require_once('config.php');

// 检查session是否存在用户ID及分数参数
if(!isset($_SESSION["id_utente"]) || !isset($_GET['vote'])){
    echo "参数错误";
    exit;
}

$var_voto = $_GET['vote'];
$user_id = $_SESSION["id_utente"];

// 检查数据库连接是否成功
if(!$connessione->connect_error){
    // 使用预处理语句,避免SQL注入
    $query = $connessione->prepare("UPDATE utenti SET voto = ? WHERE id_utente = ?");
    // 绑定参数:第一个参数是类型(i=整数,这里分数是整数用i),后续是变量
    $query->bind_param('ii', $var_voto, $user_id);
    
    if($query->execute()){
        echo "成绩更新成功";
    }else{
        echo "更新失败:" . $query->error;
    }
    $query->close();
}else{
    echo "数据库连接失败:" . $connessione->connect_error;
}

$connessione->close();
?>

修正quiz.js(改用fetch)

var vote = userScore * 10;

// 使用fetch发送GET请求
fetch(`/php/vote.php?vote=${vote}`)
.then(response => response.text())
.then(data => {
    console.log(data); // 在控制台查看返回结果,便于调试
    // 可在此添加更新成功后的页面提示逻辑
})
.catch(error => {
    console.error('请求出错:', error);
});

private-area.php补充(确保session已启动)

<?php
session_start(); // 必须先启动session才能使用$_SESSION
require 'php/config.php';

if(!isset($_SESSION["id_utente"])){
    // 无用户ID时跳转到登录页
    header("Location: login.php");
    exit;
}

$sessionId = $_SESSION["id_utente"];
// 查询用户信息(仅页面需显示用户数据时需要)
$user = mysqli_fetch_assoc(mysqli_query($connessione, "SELECT * FROM utenti WHERE id_utente = $sessionId"));
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:20