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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:35