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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:00:53