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

无法向MariaDB推送数据:执行CreateBet函数后表无数据存储

解决CreateBet函数无法向MariaDB写入数据的问题

我之前也踩过类似的坑——调用CreateBet()函数后,MariaDB表里完全没存进数据,而且明明确认了数据库连接正常,没有通信错误,当时可真是挠破头。先看看你贴的代码片段:

//创建下注的函数
function CreateBet() {
    //将变量设为全局而非局部
    global $con;
    global $CharTick;
    global $hash;
    global $created_by;
    //无限循环,无<=或>=
    for($cycle=0; ; $cycle++) {
        //定义结果 - 查询coinflip表的gameid列以及...的内容
        // 你这里代码没写完,但先抓最显眼的问题
    }
}

首先揪出最致命的问题:死循环

你写的for($cycle=0; ; $cycle++)是个无限循环——循环条件为空,没有任何终止判断,代码会一直卡在这个循环里转,根本轮不到执行后面的数据库插入逻辑(就算你写了插入代码也白搭)。这绝对是数据没写入的核心原因。

还有几个需要排查的细节:

  • 有没有实际的插入SQL语句?:你贴的代码里只看到查询coinflip表的逻辑,完全没看到INSERT相关的代码。如果压根没写插入操作,数据库当然不会有数据。
  • 全局变量的可靠性:用global引入变量虽然能拿到全局值,但万一这些变量在函数调用前没被正确初始化(比如$con连接对象、$hash等值为空),后续逻辑直接就废了。更推荐用函数参数传递的方式,代码更清晰也更可控。
  • 缺失错误处理:就算你写了插入语句,有没有检查执行结果?比如执行mysqli_query()后,要判断是否成功:
    $insertResult = mysqli_query($con, $insertSql);
    if (!$insertResult) {
        echo "插入失败:" . mysqli_error($con);
        // 这里可以加日志或者终止逻辑
        return;
    }
    
    没有错误处理的话,就算SQL语法错了,你也不知道问题出在哪。

给你几个具体的修复建议:

  1. 给循环加上终止条件:比如你是要找一个未被使用的gameid,可以改成这样(加循环次数限制防止死循环):
    // 最多循环100次,避免无限卡死
    for($cycle=0; $cycle < 100; $cycle++) {
        $query = "SELECT gameid FROM coinflip WHERE gameid = ?";
        // 用预处理语句防注入,同时查询目标gameid
        $stmt = mysqli_prepare($con, $query);
        mysqli_stmt_bind_param($stmt, "s", $targetGameId);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        
        if (mysqli_stmt_num_rows($stmt) == 0) {
            // 找到可用的gameid,跳出循环
            break;
        }
    }
    
  2. 补全插入逻辑并做防注入:绝对不要直接把变量拼进SQL里,用预处理语句才安全:
    // 假设你要插入到下注表bets中
    $insertStmt = mysqli_prepare($con, "INSERT INTO bets (gameid, char_tick, hash, created_by) VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($insertStmt, "ssss", $targetGameId, $CharTick, $hash, $created_by);
    $insertSuccess = mysqli_stmt_execute($insertStmt);
    
    if (!$insertSuccess) {
        echo "下注记录插入失败:" . mysqli_error($con);
        return false;
    }
    
  3. 替换全局变量为参数传递:把函数改成这样,逻辑更清晰:
    function CreateBet($dbCon, $charTick, $hash, $createdBy) {
        // 这里直接用传入的参数,不用再global了
        // 循环和插入逻辑写在这里
    }
    
    调用的时候直接传值:CreateBet($con, $CharTick, $hash, $created_by);

内容的提问来源于stack exchange,提问作者Laurynas Čekanavičius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:57:05