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

Java通过PHP脚本连接MySQL时出现“No Query”错误的排查求助

问题分析与解决方案:Java发送POST请求后PHP返回"No Query!"

你遇到的情况是Java通过HttpURLConnection发送POST请求到PHP脚本,但PHP返回No Query!,这说明PHP的$_POST["query"]没有成功获取到请求参数。下面我来帮你一步步排查原因并解决:

核心原因分析

你的Java代码在构造POST请求时存在两个关键问题,导致服务器无法正确解析请求参数:

1. 请求参数未进行URL编码

你直接拼接了查询字符串query=create table test(name varchar(255), id int);,但其中的空格等特殊字符需要进行URL编码(比如空格要转成%20)。如果不编码,服务器可能无法正确识别query参数,导致$_POST["query"]为空。

2. Content-Length计算错误

你用query.length()获取字符串的字符数作为Content-Length,但实际发送的是字节数。当字符串包含需要编码的字符时,字符数和字节数会不一致,服务器收到的内容长度和声明的不符,可能会截断请求体,导致参数丢失。

解决方案:修正Java请求代码

下面是修正后的Java代码,解决了上述两个问题:

HttpURLConnection conn = null;
try {
    URL url = new URL("http://www.example.net/database.php");
    String agent = "Applet";
    // 对查询内容进行URL编码,确保特殊字符被正确处理
    String queryContent = "create table test(name varchar(255), id int);";
    String encodedQuery = java.net.URLEncoder.encode(queryContent, "UTF-8");
    String postData = "query=" + encodedQuery;
    
    String type = "application/x-www-form-urlencoded";
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("User-Agent", agent);
    conn.setRequestProperty("Content-Type", type);
    // 计算编码后的字节数组长度作为Content-Length,确保长度准确
    byte[] postDataBytes = postData.getBytes("UTF-8");
    conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
    
    OutputStream out = conn.getOutputStream();
    out.write(postDataBytes);
    out.flush(); // 刷新输出流,确保所有内容都发送到服务器
    
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        System.out.println(inputLine);
    }
    in.close();
    
    int rc = conn.getResponseCode();
    System.out.println("Response Code = " + rc);
    String rm = conn.getResponseMessage();
    System.out.println("Response Message = " + rm);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (conn != null) {
        conn.disconnect();
    }
}

额外建议:更新PHP脚本的数据库操作方式

你的PHP脚本使用了已废弃的mysql_*函数(PHP 5.5+标记为废弃,PHP 7+完全移除),建议替换为mysqli或PDO,避免后续兼容性问题。这里给你一个mysqli版本的优化示例:

<?php
$query = $_POST["query"];
echo "Query = " . $query . "\n";
if ($query) {
    // 使用mysqli连接数据库(直接指定数据库名,省去select_db步骤)
    $link = mysqli_connect("localhost:3306", "user", "password", "learnEng");
    if ($link) {
        $result = mysqli_query($link, $query);
        if ($result) {
            while ($row = mysqli_fetch_row($result)) {
                foreach ($row as $value) {
                    echo "\t" . $value;
                }
                echo "\n";
            }
            mysqli_free_result($result);
        } else {
            echo "Query failed: " . mysqli_error($link) . "\n";
        }
        mysqli_close($link);
    } else {
        echo "MySQL connect failed! " . mysqli_connect_error() . "\n";
    }
} else {
    echo "No Query! \n";
}
exit();
?>

验证步骤

  1. 先用Postman或curl工具测试PHP脚本:
    • 请求URL:http://www.example.net/database.php
    • 请求方法:POST
    • Content-Type:application/x-www-form-urlencoded
    • 表单参数:query=create table test(name varchar(255), id int);
      如果PHP能正确返回Query = create table test(...),说明脚本本身没问题。
  2. 再运行修正后的Java代码,应该就能正确传递参数并执行数据库操作了。

内容的提问来源于stack exchange,提问作者AMC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:30