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

基于Volley实现Android与PHP+MySQL登录并返回用户ID至其他Activity

实现登录功能并返回用户ID到其他Activity

我来帮你搞定这个登录的事儿!首先先把你的PHP脚本补全优化,再一步步讲Android端怎么实现登录并把用户ID传递给其他Activity~

一、完善你的登录PHP脚本

你的原脚本没写完,我帮你补全并改成返回JSON格式的响应,这样Android端处理起来更方便:

<?php
// 数据库配置
$DB_USER='user';
$DB_PASS='pass';
$DB_HOST='localhost';
$DB_NAME='db';

// 初始化响应数组,统一返回格式
$response = array('success' => false, 'message' => '', 'user_id' => null);

// 先检查必填参数是否存在
if (!isset($_POST['username']) || !isset($_POST['password'])) {
    $response['message'] = '缺少用户名或密码参数';
    echo json_encode($response);
    exit;
}

$username = trim($_POST['username']);
$password = trim($_POST['password']);

// 连接数据库
$con = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (!$con) {
    $response['message'] = '数据库连接失败: ' . mysqli_connect_error();
    echo json_encode($response);
    exit;
}

// 注意:你的原表名是`tABLE`,建议改成规范的名称比如`users`,避免语法问题
$sql = mysqli_prepare($con, "SELECT UserID FROM users WHERE UserName=? AND Password=?");
if (!$sql) {
    $response['message'] = '预处理语句创建失败: ' . mysqli_error($con);
    echo json_encode($response);
    mysqli_close($con);
    exit;
}

// 绑定参数到预处理语句
mysqli_stmt_bind_param($sql, "ss", $username, $password);
// 执行查询
if (!mysqli_stmt_execute($sql)) {
    $response['message'] = '查询执行失败: ' . mysqli_stmt_error($sql);
    echo json_encode($response);
    mysqli_stmt_close($sql);
    mysqli_close($con);
    exit;
}

// 存储查询结果并检查是否有匹配用户
mysqli_stmt_store_result($sql);
if (mysqli_stmt_num_rows($sql) == 1) {
    // 绑定结果到变量,获取用户ID
    mysqli_stmt_bind_result($sql, $user_id);
    mysqli_stmt_fetch($sql);
    $response['success'] = true;
    $response['message'] = '登录成功';
    $response['user_id'] = $user_id;
} else {
    $response['message'] = '用户名或密码错误';
}

// 关闭资源
mysqli_stmt_close($sql);
mysqli_close($con);

// 返回JSON格式响应
echo json_encode($response);
?>

重点提醒:你的脚本里密码是明文存储的,这非常不安全!建议用password_hash()加密存储密码,登录时用password_verify()验证,这个是必须优化的安全点!

二、Android端登录Activity实现

1. 登录界面布局(activity_login.xml)

先做一个简单的登录表单:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"
        android:inputType="text"/>

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="textPassword"
        android:layout_marginTop="16dp"/>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录"
        android:layout_marginTop="24dp"/>

</LinearLayout>

2. 登录Activity逻辑(LoginActivity.java)

这里用OkHttp做网络请求,记得先在build.gradle(Module)里添加依赖:implementation 'com.squareup.okhttp3:okhttp:4.11.0'

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class LoginActivity extends AppCompatActivity {

    private EditText etUsername, etPassword;
    private Button btnLogin;
    private OkHttpClient client;

    // 替换成你的服务器上登录脚本的地址
    private static final String LOGIN_URL = "http://你的服务器IP或域名/login.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        btnLogin = findViewById(R.id.btn_login);
        client = new OkHttpClient();

        btnLogin.setOnClickListener(v -> {
            String username = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString().trim();

            if (username.isEmpty() || password.isEmpty()) {
                Toast.makeText(LoginActivity.this, "请填写完整信息", Toast.LENGTH_SHORT).show();
                return;
            }

            // 发起登录请求
            sendLoginRequest(username, password);
        });
    }

    private void sendLoginRequest(String username, String password) {
        RequestBody formBody = new FormBody.Builder()
                .add("username", username)
                .add("password", password)
                .build();

        Request request = new Request.Builder()
                .url(LOGIN_URL)
                .post(formBody)
                .build();

        client.newCall(request).enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(okhttp3.Call call, IOException e) {
                // 网络请求失败,切回主线程提示
                runOnUiThread(() -> Toast.makeText(LoginActivity.this, "网络连接失败", Toast.LENGTH_SHORT).show());
            }

            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    String responseStr = response.body().string();
                    runOnUiThread(() -> {
                        try {
                            JSONObject jsonObj = new JSONObject(responseStr);
                            boolean isSuccess = jsonObj.getBoolean("success");
                            String msg = jsonObj.getString("message");

                            Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();

                            if (isSuccess) {
                                // 获取用户ID
                                int userId = jsonObj.getInt("user_id");

                                // 方式1:通过Intent返回给调用当前Activity的页面(适合用startActivityForResult启动的场景)
                                Intent resultIntent = new Intent();
                                resultIntent.putExtra("USER_ID", userId);
                                setResult(RESULT_OK, resultIntent);
                                finish();

                                // 方式2:如果需要全局使用用户ID,也可以存到SharedPreferences
                                /*
                                SharedPreferences sp = getSharedPreferences("user_info", MODE_PRIVATE);
                                sp.edit().putInt("user_id", userId).apply();
                                */
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(LoginActivity.this, "数据解析失败", Toast.LENGTH_SHORT).show();
                        }
                    });
                } else {
                    runOnUiThread(() -> Toast.makeText(LoginActivity.this, "服务器响应异常", Toast.LENGTH_SHORT).show());
                }
            }
        });
    }
}

3. 在其他Activity中获取用户ID

场景1:通过Intent返回获取

如果是用startActivityForResult启动LoginActivity,在调用的Activity里重写onActivityResult方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 100是自定义的请求码,要和启动时一致
    if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
        int userId = data.getIntExtra("USER_ID", -1);
        if (userId != -1) {
            // 这里就可以使用用户ID了,比如展示或者做后续业务处理
            Toast.makeText(this, "登录成功,用户ID:" + userId, Toast.LENGTH_SHORT).show();
        }
    }
}

启动LoginActivity的代码:

Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, 100);

场景2:通过SharedPreferences全局获取

如果存在SharedPreferences里,其他Activity直接读取即可:

SharedPreferences sp = getSharedPreferences("user_info", MODE_PRIVATE);
int userId = sp.getInt("user_id", -1);
if (userId != -1) {
    // 使用用户ID做业务逻辑
}

必做的配置和安全提醒

  • 在AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET"/>
  • Android 9及以上默认禁止明文HTTP请求,要么把服务器改成HTTPS(推荐),要么在res/xml下创建network_security_config.xml并在Manifest的application标签里配置android:networkSecurityConfig="@xml/network_security_config"
  • 一定要给密码加密,不要明文存储在数据库里!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:11:20