Android应用向PHP传数据并在HTML展示的问题排查
Android向PHP传递数据并在HTML展示的问题修复
问题核心
现有实现功能失效的原因主要有三点:
- 请求方式不匹配:Android端发送POST请求,但PHP端用
$_GET接收数据,导致无法获取到参数 - 旧API废弃:
HttpClient、HttpPost等类已被Android官方废弃,存在兼容性问题 - 跳转逻辑错误:发送POST后直接跳转至PHP页面,跳转的是GET请求,不会携带之前POST的参数,页面自然无法读取到输入内容
修复方案
方案一:GET方式直接传递参数并跳转
此方案最简单,直接将输入数据拼接到URL参数中,跳转浏览器打开带参数的URL,PHP通过$_GET读取参数。
Android端代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); savebtn = findViewById(R.id.savebtn); editTextFName = findViewById(R.id.editTextFName); editTextLName = findViewById(R.id.editTextLName); editTextAddress = findViewById(R.id.editTextAddress); savebtn.setOnClickListener(view -> { String val_Fname = editTextFName.getText().toString(); String val_Lname = editTextLName.getText().toString(); String val_Addr = editTextAddress.getText().toString(); // 对参数进行URL编码,避免特殊字符导致的参数丢失 try { val_Fname = URLEncoder.encode(val_Fname, "UTF-8"); val_Lname = URLEncoder.encode(val_Lname, "UTF-8"); val_Addr = URLEncoder.encode(val_Addr, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 拼接带参数的目标URL String url = String.format("http://xxx.xxx.xxx.xxx/webdisplay/index.php?android_Fname=%s&android_Lname=%s&android_Addr=%s", val_Fname, val_Lname, val_Addr); // 跳转至系统浏览器打开URL Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); }); }
PHP端代码
<?php // 先判断参数是否存在,避免报错 $dataFname = isset($_GET['android_Fname']) ? $_GET['android_Fname'] : ''; $dataLname = isset($_GET['android_Lname']) ? $_GET['android_Lname'] : ''; $dataAddr = isset($_GET['android_Addr']) ? $_GET['android_Addr'] : ''; ?> <html> <body> <div> 名字:<?php echo htmlspecialchars($dataFname); ?><br> 姓氏:<?php echo htmlspecialchars($dataLname); ?><br> 地址:<?php echo htmlspecialchars($dataAddr); ?> </div> </body> </html>
方案二:POST提交+Session存储
如果需要用POST方式传递数据,可先将数据提交到PHP存储到Session中,再跳转至展示页面读取Session内容。
Android端代码(使用OkHttp)
首先在build.gradle(Module)中添加OkHttp依赖:
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
然后修改Activity代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); savebtn = findViewById(R.id.savebtn); editTextFName = findViewById(R.id.editTextFName); editTextLName = findViewById(R.id.editTextLName); editTextAddress = findViewById(R.id.editTextAddress); savebtn.setOnClickListener(view -> { String val_Fname = editTextFName.getText().toString(); String val_Lname = editTextLName.getText().toString(); String val_Addr = editTextAddress.getText().toString(); // 构建POST表单参数 FormBody formBody = new FormBody.Builder() .add("android_Fname", val_Fname) .add("android_Lname", val_Lname) .add("android_Addr", val_Addr) .build(); // 构建POST请求 Request request = new Request.Builder() .url("http://xxx.xxx.xxx.xxx/webdisplay/save_data.php") .post(formBody) .build(); // 异步发送请求,避免阻塞主线程 OkHttpClient client = new OkHttpClient(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); // 主线程提示失败 runOnUiThread(() -> Toast.makeText(MainActivity.this, "数据提交失败", Toast.LENGTH_SHORT).show()); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { // 提交成功后跳转至展示页面 runOnUiThread(() -> { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://xxx.xxx.xxx.xxx/webdisplay/index.php")); startActivity(intent); }); } else { runOnUiThread(() -> Toast.makeText(MainActivity.this, "数据提交失败", Toast.LENGTH_SHORT).show()); } } }); }); }
PHP端代码
创建save_data.php用于接收POST数据并存入Session:
<?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $_SESSION['fname'] = isset($_POST['android_Fname']) ? $_POST['android_Fname'] : ''; $_SESSION['lname'] = isset($_POST['android_Lname']) ? $_POST['android_Lname'] : ''; $_SESSION['addr'] = isset($_POST['android_Addr']) ? $_POST['android_Addr'] : ''; echo "success"; } ?>
修改index.php读取Session内容:
<?php session_start(); $dataFname = isset($_SESSION['fname']) ? $_SESSION['fname'] : ''; $dataLname = isset($_SESSION['lname']) ? $_SESSION['lname'] : ''; $dataAddr = isset($_SESSION['addr']) ? $_SESSION['addr'] : ''; // 可选:读取后清除Session,避免下次打开页面仍显示旧数据 // unset($_SESSION['fname'], $_SESSION['lname'], $_SESSION['addr']); ?> <html> <body> <div> 名字:<?php echo htmlspecialchars($dataFname); ?><br> 姓氏:<?php echo htmlspecialchars($dataLname); ?><br> 地址:<?php echo htmlspecialchars($dataAddr); ?> </div> </body> </html>
注意事项
- 确保Android设备与PHP服务器处于同一局域网,服务器IP地址填写正确,且PHP服务正常运行
- Android 9及以上默认禁止明文HTTP请求,需在
AndroidManifest.xml的application标签添加android:usesCleartextTraffic="true",或者配置HTTPS证书 - 网络请求必须在子线程执行,方案二使用OkHttp异步请求符合要求,方案一的跳转是Intent动作,无需额外处理线程
- 使用
htmlspecialchars()转义输出内容,防止XSS注入攻击
内容的提问来源于stack exchange,提问作者JBA
相关产品推荐
相关产品推荐

