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
相关产品推荐
相关产品推荐

