Android中如何通过PHP+MySQL获取并展示Web系统注册数据?
嘿,刚接触Android和Java不用慌,我一步步帮你搞定从PHP/MySQL获取数据的事儿!
第一步:先优化你的PHP代码
你现在的PHP返回的是一个扁平数组,把所有Email和Senha混在一起,Android端解析时根本分不清哪个邮箱对应哪个密码。咱们改成返回结构化的JSON数组,每个元素是包含用户邮箱和密码的对象,这样解析起来清晰多了:
<?php $conexao = mysqli_connect('localhost','root','success','projeto'); // 先检查数据库连接是否成功,避免出错 if (!$conexao) { die(json_encode(array("error" => "数据库连接失败: " . mysqli_connect_error()))); } // 只查询需要的字段,不要用SELECT * $sql = mysqli_query($conexao,"SELECT Email, Senha FROM pe_mobile"); $mostrar = array(); while($jm = mysqli_fetch_assoc($sql)){ // 把每个用户的信息封装成独立对象存入数组 $mostrar[] = array( "email" => $jm["Email"], "senha" => $jm["Senha"] ); } // 设置响应头为JSON格式,让Android明确知道返回的是JSON数据 header('Content-Type: application/json; charset=utf-8'); echo json_encode($mostrar); // 记得关闭数据库连接 mysqli_close($conexao); ?>
第二步:Android端调用接口并解析数据
首先要注意:Android不允许在主线程发起网络请求,所以咱们用AsyncTask(对新手友好)来处理后台网络请求,然后解析返回的JSON数据。
1. 先修正你现有Conexao类的小错误
你代码里的Content-Lenght拼写错了,应该是Content-Length,虽然暂时可能不影响,但修正后更稳妥:
connection.setRequestProperty("Content-Length","" + Integer.toString(parametrosUsuarios.getBytes().length));
2. 创建AsyncTask处理网络请求和解析
import android.os.AsyncTask; import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; public class FetchDataTask extends AsyncTask<Void, Void, String> { // 定义回调接口,用来把解析好的数据传给UI线程 public interface OnDataFetchedListener { void onDataFetched(ArrayList<HashMap<String, String>> userList); void onFetchError(String errorMessage); } private OnDataFetchedListener listener; private String phpUrl; // 你的PHP文件的网络地址 public FetchDataTask(String phpUrl, OnDataFetchedListener listener) { this.phpUrl = phpUrl; this.listener = listener; } @Override protected String doInBackground(Void... voids) { // 调用你已有的Conexao类发起请求,这里不需要传参数,所以传空字符串 return Conexao.postDados(phpUrl, ""); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result == null) { listener.onFetchError("网络请求失败,请检查连接或PHP地址"); return; } ArrayList<HashMap<String, String>> userList = new ArrayList<>(); try { // 把返回的字符串解析成JSON数组 JSONArray jsonArray = new JSONArray(result); for (int i = 0; i < jsonArray.length(); i++) { JSONObject userObj = jsonArray.getJSONObject(i); HashMap<String, String> userMap = new HashMap<>(); userMap.put("email", userObj.getString("email")); userMap.put("senha", userObj.getString("senha")); userList.add(userMap); } // 把解析好的数据回调给UI线程 listener.onDataFetched(userList); } catch (JSONException e) { e.printStackTrace(); listener.onFetchError("数据解析失败: " + e.getMessage()); } } }
3. 在Activity里调用这个任务
// 比如在Activity的onCreate方法或者按钮点击事件中 String phpUrl = "http://192.168.1.100/你的PHP文件名.php"; // 注意!这里要用你电脑的本地IP(比如192.168.x.x),不要用localhost,因为模拟器的localhost指向自己 // 确保你的Android设备和电脑在同一个局域网里 new FetchDataTask(phpUrl, new FetchDataTask.OnDataFetchedListener() { @Override public void onDataFetched(ArrayList<HashMap<String, String>> userList) { // 这里拿到了所有用户的数据,可以用来显示到UI上 for (HashMap<String, String> user : userList) { String email = user.get("email"); String senha = user.get("senha"); Log.d("用户数据", "邮箱: " + email + ", 密码: " + senha); // 比如把数据显示到TextView或者ListView里 } } @Override public void onFetchError(String errorMessage) { // 处理错误情况,比如弹出提示 Log.e("获取数据失败", errorMessage); // Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_SHORT).show(); } }).execute();
最后要注意的几个点
- 添加网络权限:在
AndroidManifest.xml里加上这句,不然App连不上网:
<uses-permission android:name="android.permission.INTERNET" />
- 本地测试环境:确保你的PHP文件放在本地服务器(比如XAMPP),并且Android设备和电脑在同一个WiFi网络下。
- AsyncTask的替代方案:虽然AsyncTask现在被标记为废弃,但对新手来说是最容易理解的。等你熟悉后,可以学习用Coroutines或者Retrofit这些更现代的网络请求框架。
内容的提问来源于stack exchange,提问作者user4875289
相关产品推荐
相关产品推荐

