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

如何将ListView中TextView内容传至PHP?求代码排查与Activity跳转指导

问题解答:从Android列表项传递数据到PHP并打开详情页

1. 你的Detail.php存在的问题与修正方案

咱们先聊聊这个PHP文件,整体思路是对的,但有几个明显的坑得填上:

核心风险:SQL注入漏洞

你直接把$_POST['NAME']拼进SQL语句里,这是高危的SQL注入风险,恶意用户能通过构造特殊字符篡改SQL逻辑,甚至破坏你的数据库。必须用预处理语句来替代直接拼接。

逻辑小问题

  • 循环里反复执行json_encode完全没必要,应该等所有数据都读取到数组后,再统一编码成JSON
  • 如果查询不到数据,$json变量会未定义,直接echo会抛出错误,得提前初始化变量

下面是修正后的Detail.php代码:

<?php
include 'dbConnect.php';
mysqli_set_charset($conn, 'utf8');

// 先检查参数是否存在
if(!isset($_POST['NAME'])){
    echo json_encode(["error" => "缺少NAME参数"]);
    exit;
}

$NAME = $_POST['NAME'];
// 使用预处理语句防止SQL注入
$sql = "SELECT * FROM items WHERE item_name = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $NAME); // s表示字符串类型参数
$stmt->execute();
$result = $stmt->get_result();

$response = [];
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $response[] = $row;
    }
} else {
    $response["message"] = "No Results Found.";
}

echo json_encode($response);
$stmt->close();
$conn->close();
?>

2. 正确打开Activity2的方式(含Activity1的错误修正)

你的Activity1里有个关键错误:获取列表项名称时,用了findViewById(R.id.itemname),这是在Activity的全局布局里找控件,而不是点击的那个列表项的控件!正确做法是从点击的view对象里获取对应的TextView。

修正后的Activity1代码

public class Activity1 extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_1); // 别忘了加这句!原代码缺失会导致空指针
        ListView lv= (ListView) findViewById(R.id.listview);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
                // 从点击的item视图里获取名称
                String name = ((TextView) view.findViewById(R.id.itemname)).getText().toString();
                Intent intent = new Intent(Activity1.this, Activity2.class);
                intent.putExtra("NAME", name);
                startActivity(intent);
            }
        });
    }
}

Activity2的完整处理步骤

Activity2需要完成三件事:接收参数、请求PHP接口、解析数据并展示(含Picasso加载图片)。这里用OkHttp做网络请求示例(记得先在build.gradle里添加OkHttp和Picasso的依赖):

public class Activity2 extends AppCompatActivity {
    private TextView tvDetail;
    private ImageView ivItemImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        tvDetail = findViewById(R.id.tv_detail);
        ivItemImage = findViewById(R.id.iv_item_image);

        // 获取从Activity1传递的NAME参数
        String itemName = getIntent().getStringExtra("NAME");
        if(itemName != null){
            fetchItemDetail(itemName);
        }
    }

    private void fetchItemDetail(String name){
        OkHttpClient client = new OkHttpClient();
        FormBody body = new FormBody.Builder()
                .add("NAME", name)
                .build();
        Request request = new Request.Builder()
                .url("你的服务器地址/Detail.php") // 替换成你的实际PHP文件地址
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                // 网络请求失败,回到主线程提示用户
                runOnUiThread(() -> tvDetail.setText("请求失败:" + e.getMessage()));
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                if(response.isSuccessful()){
                    String jsonStr = response.body().string();
                    // 解析JSON数据
                    try {
                        JSONArray jsonArray = new JSONArray(jsonStr);
                        if(jsonArray.length() > 0){
                            JSONObject item = jsonArray.getJSONObject(0);
                            // 假设你的表有item_description和item_image_url字段
                            String description = item.getString("item_description");
                            String imageUrl = item.getString("item_image_url");

                            // 在主线程更新UI
                            runOnUiThread(() -> {
                                tvDetail.setText(description);
                                // 用Picasso加载图片
                                Picasso.get()
                                        .load(imageUrl)
                                        .placeholder(R.drawable.placeholder) // 加载中占位图
                                        .error(R.drawable.error) // 加载失败图
                                        .into(ivItemImage);
                            });
                        }else{
                            runOnUiThread(() -> tvDetail.setText("没有找到该条目信息"));
                        }
                    } catch (JSONException e) {
                        runOnUiThread(() -> tvDetail.setText("数据解析错误:" + e.getMessage()));
                    }
                }else{
                    runOnUiThread(() -> tvDetail.setText("服务器返回错误:" + response.code()));
                }
            }
        });
    }
}

最后别忘了在AndroidManifest.xml里添加网络权限:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:52:21