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

Android物理设备无法连接本地MySQL数据库问题求助

解决物理设备无法连接后端数据库的问题

嘿,我来帮你一步步排查这个问题!模拟器能正常工作但物理设备不行,而且你已经能通过物理设备访问Apache,说明HTTP通路是通的,问题大概率出在MariaDB的远程连接配置或者PHP代码的错误反馈不明确上,咱们一个个来解决:

1. 先搞清楚具体错误是什么

你现在的ErrorListener只显示模糊的错误提示,根本没法定位问题。先修改Android代码里的onErrorResponse,打印详细的错误信息:

@Override
public void onErrorResponse(VolleyError error) {
    String errorDetails;
    if (error.networkResponse != null) {
        // 获取HTTP状态码和服务器返回的错误内容
        int statusCode = error.networkResponse.statusCode;
        String responseBody = new String(error.networkResponse.data);
        errorDetails = "错误码: " + statusCode + " | 服务器返回: " + responseBody;
    } else {
        // 处理无网络连接或其他本地错误
        errorDetails = error.getMessage() != null ? error.getMessage() : "未知错误";
    }
    Toast.makeText(context, errorDetails, Toast.LENGTH_LONG).show();
}

运行后在物理设备上测试,就能看到服务器返回的具体内容(比如db.php里的failed to connect),这是定位问题的关键。

2. 检查MariaDB的远程连接权限

你说用户rafa有任意地址的权限,但可能配置没生效:

  • 打开XAMPP的MariaDB控制台,执行:
    SELECT User, Host FROM mysql.user WHERE User='rafa';
    
    如果Host列显示的是localhost或127.0.0.1,说明这个用户只能从本地连接,物理设备的请求是通过公网过来的,自然连不上。
  • 修正权限:
    GRANT ALL PRIVILEGES ON eduk.* TO 'rafa'@'%' IDENTIFIED BY '1234';
    FLUSH PRIVILEGES;
    
    这里的%表示允许从任意IP连接,执行后再查一次权限,确认Host变成%。

3. 修改MariaDB的绑定地址

默认情况下,MariaDB可能只绑定127.0.0.1(仅允许本地连接):

  • 打开XAMPP的MariaDB配置文件(my.ini或my.cnf,在XAMPP控制面板里点击MariaDB的Config按钮就能找到)。
  • 找到bind-address = 127.0.0.1这一行,改成bind-address = 0.0.0.0(允许所有IP连接),或者直接注释掉这一行。
  • 重启XAMPP的MariaDB服务,让配置生效。

4. 确认防火墙和端口转发

  • 本地防火墙:确保Windows防火墙(或你用的其他防火墙)允许MariaDB的3306端口接收外部连接。可以临时关闭防火墙测试,如果能正常工作,再添加入站规则允许3306端口。
  • 路由器端口转发:如果你是用公网IP访问,必须在路由器上把3306端口转发到本地运行XAMPP的机器的内网IP(比如192.168.1.100)。注意:如果你的物理设备和XAMPP机器在同一个局域网,直接用内网IP(比如http://192.168.1.100/android/register.php)访问会更稳定,不需要走公网,也不用配置路由器端口转发。

5. 关于你的疑问

为什么模拟器正常,物理设备不行?

模拟器默认和本地机器处于同一网络环境(甚至可以通过10.0.2.2直接访问本地服务),所以即使MariaDB只允许本地连接,模拟器的请求也能通过本地网络到达。而物理设备如果是通过公网访问,就必须满足MariaDB的远程连接配置、防火墙、端口转发这些条件。

需要更换HTTP库吗?

完全不需要!Volley本身没问题,问题出在后端的数据库连接配置上,和HTTP库无关。先把后端的问题解决,Volley就能正常工作了。

额外建议:修复PHP代码的SQL注入风险

你的当前PHP代码存在严重的SQL注入漏洞,很容易被攻击。建议改用预处理语句:

<?php
if ($_SERVER ['REQUEST_METHOD'] == 'POST'){
    require_once("db.php");
    $email = $_POST['email'];
    $password = $_POST['password'];
    $date = $_POST['date'];
    
    // 使用预处理语句防止SQL注入
    $query = "INSERT INTO user (email, password, date) VALUES (?, ?, ?)";
    $stmt = $mysql->prepare($query);
    $stmt->bind_param("sss", $email, $password, $date); // s表示字符串类型
    
    if ($stmt->execute()){
        echo "user created";
    } else{
        echo "user not created: " . $stmt->error; // 输出具体错误
    }
    
    $stmt->close();
    $mysql->close();
}

这样不仅更安全,还能避免因为特殊字符导致的SQL执行错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:14:08