MySQLi UPDATE语句报错:mysqli_query(): Empty query 求助排查
问题分析与修正
你的代码存在几个关键错误,直接导致了mysqli_query(): Empty query的报错,咱们一步步拆解并修复:
1. 重复执行mysqli_query且参数逻辑错误
你第一行已经调用mysqli_query执行了UPDATE语句,此时$query存储的是查询执行结果(成功返回true,失败返回false),而非SQL语句字符串。但你紧接着又把这个结果传给了第二个mysqli_query,相当于让PHP执行一个空/无效的查询,自然触发报错。
2. SQL语句本身的语法问题
你的UPDATE语句还有两个语法硬伤:
- 字符串字段未加单引号:
titulo、msg、data这类字符串类型的字段,赋值时必须用单引号包裹值,否则MySQL会把它们当成列名/标识符,直接引发SQL语法错误。 - 括号不匹配:你在SQL字符串末尾多写了一个右括号
),破坏了语句结构,导致SQL执行失败,$query变成false,进一步加剧了后续的空查询问题。
修正后的基础版本代码
先修复上述基础问题,调整后的代码如下:
// 先拼接出语法正确的SQL语句 $sql = "UPDATE forum_topics SET player_userid = ".$player_userid.", titulo = '".$titulo."', msg = '".$msg."', data = '".$data."' WHERE UserID = ".$inTopic; // 仅执行一次查询即可 $result = mysqli_query($MYSQL_CONNECT, $sql); // 可选:添加错误排查逻辑 if (!$result) { echo "SQL执行错误: " . mysqli_error($MYSQL_CONNECT); }
更安全的最佳实践:使用预处理语句
直接拼接变量到SQL语句中存在严重的SQL注入风险,强烈建议使用mysqli预处理语句,它能自动处理字符串引号问题,同时彻底规避注入风险:
// 准备预处理语句模板 $stmt = mysqli_prepare($MYSQL_CONNECT, "UPDATE forum_topics SET player_userid = ?, titulo = ?, msg = ?, data = ? WHERE UserID = ?"); // 绑定参数(i=整数,s=字符串,需根据你的字段实际类型调整) mysqli_stmt_bind_param($stmt, "isssi", $player_userid, $titulo, $msg, $data, $inTopic); // 执行预处理语句 mysqli_stmt_execute($stmt); // 检查执行效果 if (mysqli_stmt_affected_rows($stmt) > 0) { echo "数据更新成功"; } else { echo "更新失败或无匹配数据被修改"; } // 关闭语句释放资源 mysqli_stmt_close($stmt);
内容的提问来源于stack exchange,提问作者VilmaH
相关产品推荐
相关产品推荐

