Android与PHP新手求助:单条数据返回及Retrofit获取方法
嘿,作为Android和PHP新手遇到这个问题很正常,我来一步步帮你搞定!你需要先调整PHP代码让它直接返回单条数据的JSON对象,再修改Android端的Retrofit配置来匹配这个返回格式。
一、修改PHP代码(返回单条数据)
你的search.php目前应该是把查询结果放到数组里返回,现在我们要改成直接返回单条数据的JSON对象。注意要补全SQL语句的WHERE拼写(你代码里写的whe应该是WHERE),同时建议用预处理语句避免SQL注入,更安全。
修改后的完整PHP代码示例:
<?php require_once('config.php'); if($_SERVER['REQUEST_METHOD']=='POST'){ $email = $_POST['email']; // 预处理SQL语句,防止SQL注入 $sql = "SELECT * FROM pelanggan WHERE email = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $email); // "s"表示字符串类型参数 $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0){ // 获取单条数据的关联数组 $user_data = $result->fetch_assoc(); // 直接返回单条数据的JSON对象,而非数组包裹 echo json_encode($user_data); } else { // 如果没有找到数据,返回空对象或提示信息 echo json_encode(["message" => "未找到该用户"]); } $stmt->close(); $conn->close(); } ?>
关键说明:
- 用
fetch_assoc()替代fetch_all(),直接获取单条查询结果的关联数组 - 直接
json_encode($user_data),返回的是{"id":1,"email":"xxx@xx.com",...}这种JSON对象,而非[{"id":1,...}]数组格式 - 加入预处理语句,比直接拼接SQL更安全,适合新手养成好习惯
二、调整Android端Retrofit配置与代码
1. 修改实体类(Model)
原来的实体类可能是对应数组的,现在要改成对应单条用户数据的类。比如创建Pelanggan.java:
public class Pelanggan { private int id; private String email; // 这里添加你数据库表中的其他字段,比如name, phone等 private String name; // 生成getter和setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2. 修改Retrofit接口
原来的接口可能返回Call<List<Pelanggan>>,现在要改成返回Call<Pelanggan>:
public interface ApiService { @FormUrlEncoded @POST("search.php") Call<Pelanggan> getUserByEmail(@Field("email") String email); }
3. 发起网络请求并处理结果
在Activity或ViewModel中调用Retrofit获取数据:
// 初始化Retrofit(建议放在Application类或单例中) Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的PHP服务器基础URL,比如http://192.168.1.100/你的项目目录/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); Call<Pelanggan> call = apiService.getUserByEmail("用户输入的邮箱"); call.enqueue(new Callback<Pelanggan>() { @Override public void onResponse(Call<Pelanggan> call, Response<Pelanggan> response) { if(response.isSuccessful()){ Pelanggan user = response.body(); if(user != null){ // 成功获取到单条数据,在这里处理UI逻辑,比如显示用户信息 Log.d("UserInfo", "用户名:" + user.getName() + ",邮箱:" + user.getEmail()); } else { // 服务器返回空对象,可能是未找到用户 Toast.makeText(MainActivity.this, "未找到该用户", Toast.LENGTH_SHORT).show(); } } else { // 请求成功但服务器返回错误码 Toast.makeText(MainActivity.this, "请求失败:" + response.code(), Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<Pelanggan> call, Throwable t) { // 网络请求失败,比如无网络、服务器不可达 Toast.makeText(MainActivity.this, "网络错误:" + t.getMessage(), Toast.LENGTH_SHORT).show(); } });
关键说明:
- 把Retrofit接口的返回类型从
List<Pelanggan>改成Pelanggan,Gson会自动把服务器返回的JSON对象解析成单个Pelanggan实例 - 在
onResponse中直接获取response.body()就是单条用户数据,不需要遍历数组了
内容的提问来源于stack exchange,提问作者Kharisma
相关产品推荐
相关产品推荐

