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

Android端获取文本框用户名传至PHP查询数据库对应用户数据实现方法

完整实现方案

以下方案覆盖Android端、PHP后端全流程实现,同时会修正原有代码的致命安全隐患。

重要提示:你问题中写的直接拼接$username到SQL语句的写法存在严重SQL注入风险,攻击者可通过构造特殊输入拖取全量数据、篡改甚至删除数据库内容,生产环境绝对禁止使用,必须采用预处理语句传参。


Android端实现

  • 第一步:声明网络权限
    在AndroidManifest.xml的manifest节点下添加网络权限,否则应用无法发起网络请求:

    <uses-permission android:name="android.permission.INTERNET" />
    

    注意Android 9.0及以上版本默认禁止明文HTTP请求,正式环境建议部署HTTPS,测试阶段可通过配置network_security_config放行测试域名。

  • 第二步:获取输入框内容并做基础校验
    从EditText(即你提到的textfield组件)中获取用户输入,先做非空判断,避免无效请求:

    // 初始化输入组件,替换为你自己布局里的组件ID
    EditText usernameInput = findViewById(R.id.et_username);
    String username = usernameInput.getText().toString().trim();
    if (username.isEmpty()) {
        usernameInput.setError("用户名不能为空");
        return;
    }
    
  • 第三步:子线程发起POST请求传递参数
    网络请求不能在主线程执行,否则会触发ANR崩溃,以下以OkHttp为例实现参数传递,请求成功后切回主线程处理返回数据:

    // 以下代码必须在子线程执行
    new Thread(() -> {
        OkHttpClient client = new OkHttpClient();
        RequestBody requestBody = new FormBody.Builder()
                .add("username", username)
                .build();
        Request request = new Request.Builder()
                .url("替换为你自己的PHP接口地址")
                .post(requestBody)
                .build();
        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                String result = response.body().string();
                // 解析JSON格式的返回结果
                JSONObject resJson = new JSONObject(result);
                int code = resJson.getInt("code");
                // 切回主线程更新UI
                runOnUiThread(() -> {
                    if (code == 200) {
                        try {
                            JSONObject userData = resJson.getJSONObject("data");
                            // 在这里处理拿到的用户数据,比如填充页面、本地存储
                        } catch (JSONException e) {
                            Toast.makeText(MainActivity.this, "数据解析失败", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        Toast.makeText(MainActivity.this, resJson.getString("msg"), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
    }).start();
    

PHP后端实现

  • 第一步:建立数据库连接
    单独初始化数据库连接,统一设置字符集避免乱码:

    <?php
    // 数据库配置,替换为你自己的数据库信息
    $db_host = "localhost";
    $db_user = "你的数据库账号";
    $db_pass = "你的数据库密码";
    $db_name = "你的数据库名";
    
    $con = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
    if (!$con) {
        exit(json_encode([
            'code' => 500,
            'msg' => '数据库连接失败'
        ]));
    }
    mysqli_set_charset($con, "utf8mb4");
    
  • 第二步:接收并校验前端参数
    接收Android端POST传递的用户名参数,做基础合法性校验:

    header('Content-Type: application/json');
    if (!isset($_POST['username']) || empty(trim($_POST['username']))) {
        exit(json_encode([
            'code' => 400,
            'msg' => '用户名参数不能为空'
        ]));
    }
    $username = trim($_POST['username']);
    
  • 第三步:预处理语句执行安全查询
    用参数绑定的方式执行查询,彻底阻断SQL注入风险:

    // 用?作为参数占位符,不要直接拼接变量到SQL字符串
    $stmt = mysqli_prepare($con, "SELECT * FROM accountmanagers WHERE username = ?");
    // 绑定参数,s表示传入的是字符串类型
    mysqli_stmt_bind_param($stmt, "s", $username);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    $userInfo = null;
    if ($row = mysqli_fetch_assoc($result)) {
        // 必须移除密码等敏感字段,禁止明文返回给前端
        unset($row['password'], $row['salt']);
        $userInfo = $row;
    }
    // 释放资源关闭连接
    mysqli_stmt_close($stmt);
    mysqli_close($con);
    
  • 第四步:返回标准化JSON响应
    统一返回JSON格式结果,方便Android端解析:

    if ($userInfo) {
        echo json_encode([
            'code' => 200,
            'msg' => '查询成功',
            'data' => $userInfo
        ]);
    } else {
        echo json_encode([
            'code' => 404,
            'msg' => '对应用户不存在'
        ]);
    }
    ?>
    

关键注意事项

  • 不要在接口中返回用户密码、支付密钥等敏感信息,避免数据泄露
  • 生产环境建议给接口增加Token鉴权、请求频率限制,避免被恶意爬取
  • Android端不要把后端接口地址、数据库密钥等敏感信息硬编码在代码里,建议存在BuildConfig或者本地加密配置中
  • 所有用户传入的参数都要做合法性校验,不要信任任何前端传递的参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:01:22