如何在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
相关产品推荐
相关产品推荐

