基于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
相关产品推荐
相关产品推荐

