使用mysqli无法提交数据至MySQL数据库的问题求助
问题分析与解决方案
首先,最核心的问题是你的PHP脚本没有执行SQL插入语句!你提供的第一个PHP代码片段只构造了$sql变量,但没有调用mysqli_query()去执行它,也没有任何错误处理逻辑——而你能成功的硬编码版本里是有这段执行代码的,这就是为什么硬编码能插入、但接收POST数据时不行的关键原因。
接下来,我们一步步修复问题,同时解决潜在的风险:
1. 补全SQL执行与错误处理
先把执行逻辑加上,同时添加错误输出,方便排查问题:
<?php require "init2.php"; // 先检查POST参数是否存在,避免未定义索引警告 if (!isset($_POST["model"], $_POST["total"], $_POST["dangerous"], $_POST["unrecognised"])) { die("缺少必要参数"); } // 转换数字类型参数为整数,确保插入数字字段时类型正确 $model = $_POST["model"]; $total = (int)$_POST["total"]; $dangerous = (int)$_POST["dangerous"]; $unrecognised = (int)$_POST["unrecognised"]; $sql = "INSERT INTO AndroidDatabase.ReportTable (MODEL, Total_Packages, Dangerous_Packages, Unrecognised) VALUES ('$model', $total, $dangerous, $unrecognised);"; // 执行SQL并检查结果 if (mysqli_query($con, $sql)) { echo "插入成功"; } else { // 输出错误信息,方便调试 echo "插入失败: " . mysqli_error($con); } // 记得关闭数据库连接(如果init2.php里没处理的话) mysqli_close($con); ?>
2. 修复Android端的参数类型问题
你在Android端把数字类型的total、dangerous等也用URLEncoder.encode()转成了字符串,虽然MySQL会自动转换字符串为数字,但最好直接传递数字(不需要encode数字本身,只需要encode参数名和字符串值),或者保持当前逻辑,但PHP端一定要做类型转换(上面的代码已经处理了)。
另外,你可以简化Android端的参数拼接逻辑,避免手动拼接出错:
URL url = new URL(REPORT_URL); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setDoOutput(true); httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); OutputStream OS = httpURLConnection.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8")); // 用更清晰的方式拼接参数 StringBuilder dataBuilder = new StringBuilder(); dataBuilder.append(URLEncoder.encode("model", "UTF-8")).append("=") .append(URLEncoder.encode(model, "UTF-8")).append("&"); dataBuilder.append(URLEncoder.encode("total", "UTF-8")).append("=") .append(total).append("&"); // 数字直接拼接,不需要encode dataBuilder.append(URLEncoder.encode("dangerous", "UTF-8")).append("=") .append(dangerous).append("&"); dataBuilder.append(URLEncoder.encode("unrecognised", "UTF-8")).append("=") .append(unrecognised); bufferedWriter.write(dataBuilder.toString()); bufferedWriter.flush(); bufferedWriter.close(); OS.close(); // 读取响应内容,看看PHP返回的结果(之前你只关闭了流,没读取,无法知道是否成功) InputStream IS = httpURLConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(IS)); String response = reader.readLine(); Log.d("InsertResponse", response); // 打印响应,方便调试 reader.close(); IS.close(); httpURLConnection.disconnect();
3. 至关重要:避免SQL注入风险
直接把用户输入拼接到SQL语句里是非常危险的,很容易遭受SQL注入攻击。强烈建议你使用MySQLi的预处理语句(Prepared Statements),这不仅安全,还能避免字符串转义的问题:
<?php require "init2.php"; if (!isset($_POST["model"], $_POST["total"], $_POST["dangerous"], $_POST["unrecognised"])) { die("缺少必要参数"); } $model = $_POST["model"]; $total = (int)$_POST["total"]; $dangerous = (int)$_POST["dangerous"]; $unrecognised = (int)$_POST["unrecognised"]; // 使用预处理语句 $stmt = mysqli_prepare($con, "INSERT INTO AndroidDatabase.ReportTable (MODEL, Total_Packages, Dangerous_Packages, Unrecognised) VALUES (?, ?, ?, ?)"); mysqli_stmt_bind_param($stmt, "siii", $model, $total, $dangerous, $unrecognised); if (mysqli_stmt_execute($stmt)) { echo "插入成功"; } else { echo "插入失败: " . mysqli_stmt_error($stmt); } mysqli_stmt_close($stmt); mysqli_close($con); ?>
调试建议
- 在Android端打印拼接后的
data字符串,确认参数是否正确; - 在PHP端可以先
var_dump($_POST);打印所有POST参数,确认是否接收到了正确的值; - 执行SQL前可以
echo $sql;打印最终的SQL语句,复制到MySQL客户端里执行,看看是否有语法错误。
内容的提问来源于stack exchange,提问作者federicosancho
相关产品推荐
相关产品推荐

