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

PHP投资游戏开发:预算扣除异常(余额充足仍提示不足)

问题分析与解决方案

核心问题原因

  1. 会话预算未检查存在性:buyProduct.php中直接使用$_SESSION['budget']进行比较,但未先验证该会话变量是否存在。当会话异常(如session过期、浏览器禁用Cookie、服务器会话配置问题)时,$_SESSION['budget']为未定义状态,此时未定义值 >= 商品价格的判定结果为false,会错误返回“余额不足”。
  2. 潜在类型不匹配风险:虽然初始预算是整数,但如果会话中的预算值被意外转为字符串类型,PHP的松散比较可能导致逻辑错误。

修复后的代码

buyProduct.php

<?php
session_start();

$inputData = json_decode(file_get_contents('php://input'), true);

// 验证输入数据有效性
if (!isset($inputData['price']) || !is_numeric($inputData['price'])) {
    echo json_encode(["success" => false, "message" => "无效的商品价格"]);
    exit;
}

$productName = $inputData['productName'] ?? '';
$price = (float)$inputData['price'];

// 检查会话预算是否存在,不存在则重新初始化
if (!isset($_SESSION['budget'])) {
    $investors = [
        "Fred" => 24000,
        "Barney" => 32000
    ];
    $randomInvestor = array_rand($investors);
    $_SESSION['budget'] = (float)$investors[$randomInvestor];
}

$currentBudget = (float)$_SESSION['budget'];

// 执行购买逻辑
if ($currentBudget >= $price) {
    $currentBudget -= $price;
    $_SESSION['budget'] = $currentBudget;
    echo json_encode(["success" => true, "newBudget" => $currentBudget]);
} else {
    echo json_encode(["success" => false, "message" => "余额不足"]);
}
?>

额外调试建议

如果问题仍存在,可以在buyProduct.php中添加调试日志,查看会话预算和商品价格的实际值:

// 调试日志,上线后可移除
error_log("当前会话预算: " . var_export($_SESSION['budget'], true));
error_log("商品价格: " . var_export($price, true));

通过服务器的错误日志(如Apache/NGINX的error.log)可以快速定位数值异常问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:35:01