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

如何在PHP中检查余额不足并终止下注代码执行

余额检查逻辑修改方案

首先需要注意:$accabal和$stake经过mysqli_real_escape_string处理后是字符串类型,直接做减法运算可能出问题,所以先转成数值类型(比如浮点型,适合金额计算)。然后在所有数据库操作前添加余额校验逻辑,一旦余额不足就终止流程。

修改后的完整代码

<?php
// 提前启动session,避免$_SESSION无法正常使用
session_start();

$stake = (float)mysqli_real_escape_string($link, $_POST['stake'][0]);
$payout = mysqli_real_escape_string($link, $_POST['payout'][0]);
$todds = mysqli_real_escape_string($link, $_POST['todds'][0]);
$accabal = (float)mysqli_real_escape_string($link, $_POST['balance'][0]);
$invoiceid = $_POST['invoiceid'];

// --- 新增余额检查逻辑 ---
if ($accabal - $stake < 0) {
    $_SESSION['error'] = "余额不足,无法完成下注";
    header("Location: welcome.php");
    exit; // 直接终止后续代码执行,阻止下注操作
}

// 执行余额扣除
$charge = mysqli_query($dba, "UPDATE users SET balance = $accabal - $stake WHERE username='".$_SESSION['username']."'");

$_SESSION["balance"] = $accabal - $stake;

// 插入下注记录
$insert = mysqli_query($link,"INSERT INTO `receipts`(`Match`, `Selection`, `Odd`,`Account`,`Stake Amount`,`Payout`,`Total Odds`,`invoiceid`,`Kickoff`) VALUES ('$match','$selection','$odd','$account','$stake','$payout','$todds','$invoiceid','$kickoff')");

if(!$insert) {
    $error = true;
    $error_msg .= mysqli_error($link);            
}

// 跳转处理
if(!isset($error)) {
    $_SESSION['rec'] = $_POST['invoiceid'];
    $_SESSION['success'] = 1;
}
header("Location: welcome.php");
?>

关键修改点说明

  • 数值类型转换:将$accabal和$stake转为浮点型,避免字符串减法导致的计算错误,确保金额运算准确。
  • 前置余额校验:在所有数据库操作前判断余额是否足够,若不足则设置错误提示,跳转页面并通过exit终止代码,直接阻止后续的余额扣除和记录插入操作。
  • 调整session启动位置:原代码中@session_start()放在逻辑后面,可能导致$_SESSION无法正常使用,提前到代码开头并去掉错误抑制符,方便排查问题。
  • 优化跳转逻辑:只有在没有错误的情况下才设置成功状态,避免无论是否出错都跳转成功的问题。

内容的提问来源于stack exchange,提问作者Woza Station Namibia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:36:19