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

