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

AJAX+PHP同输入重复请求返回一致结果实现方案咨询

解决方案

要实现同一数字在会话期间(或页面未刷新时)验证结果固定,核心思路是存储每个数字的验证结果,后续请求直接返回已存储的结果而非重新生成随机值。以下是具体修改方案:

服务器端(PHP)修改

利用PHP会话(Session)存储每个数字的验证结果,步骤如下:

  1. 启动会话:在PHP文件开头添加session_start()以启用会话存储。
  2. 初始化存储数组:如果会话中没有存储验证结果的数组,创建一个。
  3. 检查已存储结果:处理数字后,先查看该数字的结果是否已存在于会话中,若存在则直接返回。
  4. 存储新结果:首次验证时,将生成的结果存入会话,再返回给前端。

修改后的PHP代码:

<?php
session_start();

// 初始化会话存储数组
if (!isset($_SESSION['number_validation'])) {
    $_SESSION['number_validation'] = [];
}

$numPrincipal = $_POST["lista"] . "|";
$numPrincipal = str_replace("Numero", "", $numPrincipal);
$numPrincipal = str_replace("NUMERO", "", $numPrincipal);
if ($numPrincipal == 0) {
    header("location: /");
    exit;
}
$numPrincipal = str_replace(" ", "", $numPrincipal);
$quitarSimb = str_replace("|", "", $numPrincipal);
$largo = strlen($quitarSimb);
$empiezaCon = substr($quitarSimb, 0, 1);

// 检查当前数字是否已有存储的验证结果
if (isset($_SESSION['number_validation'][$quitarSimb])) {
    echo json_encode($_SESSION['number_validation'][$quitarSimb]);
    exit;
}

// 处理长度不符合要求的情况
if ($empiezaCon == 1) {
    if ($largo === 10) {
        $num = substr($quitarSimb, 0, 10);
    }
    if ($largo < 10 || $largo > 15) {
        $result = [
            'enviar' => 0,
            'largo' => '<span class="text-danger">Está muy largo</span>' . $numPrincipal
        ];
        $_SESSION['number_validation'][$quitarSimb] = $result;
        echo json_encode($result);
        exit;
    }
}

// 生成随机验证结果(仅首次请求时执行)
$randomNmr = rand(0, 7);
$result = [];
if ($randomNmr == 1) {
    $result = [
        'enviar' => 1,
        'num2' => '<span class="text-danger">erroneo</span>' . $numPrincipal
    ];
} elseif ($randomNmr == 2) {
    $result = [
        'enviar' => 2,
        'num3' => '<span class="text-primary">correcto</span>' . $numPrincipal
    ];
} else {
    // 处理随机值非1/2的情况,默认返回错误结果
    $result = [
        'enviar' => 1,
        'num2' => '<span class="text-danger">erroneo</span>' . $numPrincipal
    ];
}

// 将结果存入会话
$_SESSION['number_validation'][$quitarSimb] = $result;

// 返回JSON结果
echo json_encode($result);
?>

关键改进点:

  • 使用json_encode()生成JSON,避免手动拼接导致的语法错误。
  • 修复了原代码中随机值非1/2时无输出的问题。
  • 为HTML元素的class属性添加了引号,符合标准语法。

客户端(jQuery)修改

无需修改现有AJAX逻辑,因为会话存储的结果会自动返回给前端,前端仍按原逻辑处理即可。

可选:客户端存储方案(若希望页面刷新后重置结果)

如果希望验证结果仅在当前页面会话(刷新后重置)有效,可使用浏览器的sessionStorage存储结果,无需修改PHP代码,仅修改jQuery:

// 新增数字清洗函数,与PHP逻辑保持一致
function cleanNumber(num) {
    num = num + "|";
    num = num.replace(/Numero/g, "").replace(/NUMERO/g, "");
    num = num.replace(/ /g, "");
    num = num.replace(/\|/g, "");
    return num;
}

// 原AJAX调用前添加检查逻辑
var currentNum = prueba[revisar];
var cleanedNum = cleanNumber(currentNum);
var storedResult = sessionStorage.getItem('number_validation_' + cleanedNum);

if (storedResult) {
    // 使用存储的结果,无需发送AJAX
    storedResult = JSON.parse(storedResult);
    handleResult(storedResult);
} else {
    // 发送AJAX请求
    ajaxCall = $.ajax({
        url: "miarchivo.php",
        dataType: "json",
        cache: false,
        type: "POST",
        beforeSend: function () {
            $("#checar").html("<img src='loading.gif'/>");
        },
        data: "ajax=1&do=check&lista=" + encodeURIComponent(currentNum),
        success: function (datos) {
            // 存储结果到sessionStorage
            sessionStorage.setItem('number_validation_' + cleanedNum, JSON.stringify(datos));
            handleResult(datos);
        }
    });
}

// 提取结果处理逻辑为单独函数
function handleResult(datos) {
    switch (datos.enviar) {
        case 0:
            revisar++;
            $("#div1").append(datos.largo + "<br />");
            updateProgress(revisar, prueba.length);
            erroneos();
            break;
        case 1:
            revisar++;
            $("#div2").append(datos.num2 + "<br />");
            updateProgress(revisar, prueba.length);
            erroneos();
            break;
        case 2:
            revisar++;
            $("#div3").append(datos.num3 + "<br />");
            nieva++;
            updateProgress(revisar, prueba.length);
            corectos();
            break;
    }
}

说明:

  • sessionStorage仅在当前标签页有效,关闭或刷新页面后会清空。
  • 需确保客户端的数字清洗逻辑与PHP完全一致,避免因格式差异导致存储不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:35:24