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

Android Studio通过PHP连接MySQL注册时遇Volley TimeoutError求助

解决Volley TimeoutError及注册功能异常问题

核心问题分析

你遇到的com.android.volley.TimeoutError主要由以下关键问题导致:

  • Android端用POST请求提交参数,但PHP端依赖$_GET获取数据,导致PHP无法接收参数、无法正常返回响应,最终引发超时
  • Android项目缺少必要的网络权限,无法发起网络请求
  • PHP代码存在参数不匹配、未处理的必填项缺失问题

分步解决方案

1. 修正PHP端的参数获取与逻辑问题

PHP端需适配POST请求,同时修正参数名不匹配(Android传name,原PHP用username)、移除不必要的id参数(假设表中id为自增主键):

修改后的PHP代码:

<?php
$con = new mysqli("localhost", "root", "Aisha55733441", "signupdb", 3307);

// 先检查数据库连接状态
if ($con->connect_error) {
    die("连接失败: " . $con->connect_error);
}

// 用$_POST获取Android端提交的参数,同时做空值判断
$email = $_POST["email"] ?? '';
$username = $_POST["name"] ?? '';
$password = $_POST["password"] ?? '';

if(empty($email) || empty($username) || empty($password)){
    echo "failure";
    exit;
}

// 检查邮箱是否已存在
$st_check = $con->prepare("SELECT * FROM users WHERE email = ?");
$st_check->bind_param("s", $email);
$st_check->execute();
$rs = $st_check->get_result();

if ($rs->num_rows == 0) {
    // 移除id参数,使用自增主键
    $st = $con->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
    if (!$st) {
        echo "failure";
        die('Invalid query: ' . $con->error);
    }
    $st->bind_param("sss", $username, $email, $password);

    if ($st->execute()) {
        echo "success"; // 和Android端判断的字符串保持一致
    } else {
        echo "failure";
        die('Invalid query: ' . $st->error);
    }
} else {
    echo "User with this email already exists";
}

// 关闭数据库资源
$st_check->close();
$st->close();
$con->close();
?>

2. 给Android项目添加网络权限

在AndroidManifest.xml的<manifest>标签内添加:

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

3. 优化Volley请求的超时设置

默认Volley超时时间较短,手动延长超时时间,并完善错误提示:

修改Android端的save方法:

public void save(View view) {
    name = etName.getText().toString().trim();
    email = etEmail.getText().toString().trim();
    password = etPassword.getText().toString().trim();
    reenterPassword = etReenterPassword.getText().toString().trim();
    
    if(!password.equals(reenterPassword)){
        Toast.makeText(this, "Password Mismatch", Toast.LENGTH_SHORT).show();
        return;
    }
    else if(name.isEmpty() || email.isEmpty() || password.isEmpty()){
        Toast.makeText(this, "Please fill all fields", Toast.LENGTH_SHORT).show();
        return;
    }

    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, 
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                String res = response.trim();
                if (res.equals("success")) {
                    tvStatus.setText("Successfully registered.");
                    btnRegister.setClickable(false);
                } else if (res.equals("failure")) {
                    tvStatus.setText("Something went wrong!");
                } else {
                    // 处理邮箱已存在的提示
                    tvStatus.setText(res);
                }
            }
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                String errMsg = error.getMessage() != null ? error.getMessage() : "Network error";
                Toast.makeText(getApplicationContext(), errMsg, Toast.LENGTH_LONG).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> data = new HashMap<>();
                data.put("name", name);
                data.put("email", email);
                data.put("password", password);
                return data;
            }
        };

    // 设置10秒超时时间,允许重试
    stringRequest.setRetryPolicy(new DefaultRetryPolicy(
            10000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    requestQueue.add(stringRequest);
}

注意:需要导入com.android.volley.DefaultRetryPolicy类。

4. 验证局域网可达性

  • 确保手机和运行PHP的电脑处于同一WiFi网络
  • 用手机浏览器访问http://192.168.0.128/senior2/signup.php,确认服务器可访问;也可以用Postman等工具模拟POST请求,验证接口是否正常返回结果
  • 检查电脑防火墙是否允许80端口(或PHP服务器使用的端口)的入站请求

其他建议

  • 不要明文传输密码,建议在客户端对密码进行哈希处理后再提交
  • 确保MySQL的users表中id字段设置为自增主键
  • 可在PHP代码中添加错误日志,方便后续排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:34:57