如何将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"; } ?>
核心错误点与修复方案
Session未初始化
vote.php中没有调用session_start(),无法获取到用户专区中设置的id_utente会话变量,导致找不到要更新的用户。数据库连接判断逻辑完全颠倒
if($connessione->connect_error)是当数据库连接失败时执行更新操作,这完全错误——只有连接成功时才应该执行数据库操作,否则提示错误。SQL预处理语句使用错误
- 直接将
$var_voto和$user拼入SQL语句,存在SQL注入风险,且$user在vote.php中未定义(它是private-area.php中的查询结果数组)。 bind_param的参数格式错误:第一个参数是变量类型(如s代表字符串,i代表整数),后续是要绑定的变量,你的写法完全不符合规则。
用户ID传递错误
vote.php中未获取当前用户的id_utente,应从session中读取,而非依赖其他页面的变量;SQL中WHERE id = $user错误,应该用WHERE id_utente = [会话中的ID值]。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
相关产品推荐
相关产品推荐

