无法向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()后,要判断是否成功:
没有错误处理的话,就算SQL语法错了,你也不知道问题出在哪。$insertResult = mysqli_query($con, $insertSql); if (!$insertResult) { echo "插入失败:" . mysqli_error($con); // 这里可以加日志或者终止逻辑 return; }
给你几个具体的修复建议:
- 给循环加上终止条件:比如你是要找一个未被使用的
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; } } - 补全插入逻辑并做防注入:绝对不要直接把变量拼进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; } - 替换全局变量为参数传递:把函数改成这样,逻辑更清晰:
调用的时候直接传值:function CreateBet($dbCon, $charTick, $hash, $createdBy) { // 这里直接用传入的参数,不用再global了 // 循环和插入逻辑写在这里 }CreateBet($con, $CharTick, $hash, $created_by);
内容的提问来源于stack exchange,提问作者Laurynas Čekanavičius
相关产品推荐
相关产品推荐

