Java — пытается отобразить информацию о пользователе из базы данных в моем приложении Android

Я работал над этим некоторое время. Первое, что я попробовал — это сохранить вошедшего в систему пользователя в сеансе, а затем попытаться использовать эту переменную позже, например, так:

login.php

<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST'){

$sessionid = session_id();

require_once('connect.inc.php');

$sql = "SELECT username, password FROM USER WHERE username = ?";

$stmt = $conn->prepare($sql);

$username = $_POST["username"];
$password = $_POST["password"];

$stmt->bind_param("s", $username);

$stmt->execute();

$stmt->bind_result($user, $pass);

while($stmt->fetch()){
$verify = password_verify($password, $pass);
}

if($verify){
$_SESSION["username"] = $username;
echo 'connected';
echo $sessionid;
}else{
echo 'check details';
}

mysqli_close($conn);
}
?>

Затем я беру ответ логина в сообщении и делю его на две переменные. Ответ на вход в систему и идентификатор сеанса. Я беру идентификатор сессии и сохраняю в общих настройках. Я пытаюсь сохранить идентификатор сеанса в своем методе java, чтобы получить доступ к пользователю сеанса. Вот мой код Java для попытки получить пользователя:

GetUserData Java метод

private void getUserData() {

SharedPreferences sharedPreferences = getSharedPreferences(Config.sharedPref, Context.MODE_PRIVATE);
String sessionId = sharedPreferences.getString(Config.SID, "SessionID");

StringRequest stringRequest = new StringRequest(Request.Method.GET, Config.SERVER_ADDRESS + "GetUserData.php?PHPSESSID=" + sessionId,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {

JSONObject jsonObject = null;
try {
//json string to jsonobject
jsonObject = new JSONObject(response);

//get json sstring created in php and store to JSON Array
result = jsonObject.getJSONArray(Config.json_array);

//get username from json array
getUserInfo(result);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

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

private void getUserInfo(JSONArray jsonArray){
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject json = jsonArray.getJSONObject(i);

userInfo.add(json.getString(Config.getUsername));
} catch (JSONException e) {

}
}
}

Вот php-файл, который пытается вызвать метод java:

GetUserData.php

<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'GET'){

$username = $_SESSION['username'];

$sql = "SELECT * FROM USER WHERE username = '$username'";

require_once('connect.inc.php');

$run = mysqli_query($conn, $sql);
$result = array();

while($row = mysqli_fetch_array($run)){
array_push($result, array(
'id' => $row['id'],
'fname' => $row['fname'],
'lname' => $row['lname'],
'username' => $row['username'],
'email' => $row['email'],
));
}

echo json_encode(array('result'=>$result));

mysqli_close($conn);
}
?>

При отладке массив ‘result’ пуст, поэтому по какой-то причине

      $sql = "SELECT * FROM USER WHERE username = '$username'";

не работает. Я знаю, что это как-то связано с сессиями, но я не уверен, где проблема.

Моя следующая попытка будет попытаться просто сохранить зарегистрированного пользователя в общих настройках, а затем вызвать эту переменную из php-файла и запустить запрос для отображения информации о пользователе с этой переменной. Как бы я это сделал?

Спасибо.

0

Решение

Что вы будете делать, это отправлять запрос, когда пользователь вводит имя пользователя и пароль на сервер, как вы сделали здесь. Обратите внимание, я изменил ваш код.

String enterUsername = «username»;
String enterPassword = «xxxxxx»;

String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s&param2=%2$s", enteredUsername, enteredPassword);

StringRequest stringRequest = new StringRequest(Request.Method.GET, uri,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {

JSONObject jsonObject = null;
try {
// parse the response object and store user id and data in sharedpreference.
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

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

Убедитесь, что пользователь не зарегистрирован, добавьте его в свою базу данных и верните уникальный идентификатор базы данных пользователя плюс другие данные, которые вы хотите.

затем сохраните идентификатор пользователя и имя пользователя в SharedPreference

SharedPreferences sharedPreferences = getSharedPreferences(Config.sharedPref, Context.MODE_PRIVATE);
sharedPreferences.Editor edit = prefs.edit();
edit.putStringSet("Personal Information", set);
edit.commit();

Сначала необходимо проверить, сохранен ли идентификатор пользователя в настройках, чтобы определить, является ли пользователь зарегистрированным пользователем. если пользователь не зарегистрирован, покажите форму входа, иначе перенаправьте пользователя на страницу активности профиля.

0

Другие решения

У меня уже есть класс входа, который гарантирует, что пользователь зарегистрирован. Я просто пытаюсь получить информацию о пользователе из базы данных, как я уже сказал. Вот метод входа, который я, вероятно, должен был предоставить:

private void login(){
final String username = txtUsrnm.getText().toString().trim();
final String password = txtPswrd.getText().toString().trim();

//create string request
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "Login.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
String responseOne = response.substring(0,9);
String responseTwo = response.substring(9);
if(responseOne.equalsIgnoreCase(Config.logInMessage)){
//create shared pref
SharedPreferences sharedPreferences = Login.this.getSharedPreferences(Config.sharedPref, Context.MODE_PRIVATE);
//editor stores values to the shared pref
SharedPreferences.Editor editor = sharedPreferences.edit();
//add values
editor.putBoolean(Config.sharedPrefBool, true);
editor.putString(Config.username, username);
editor.putString(Config.password, password);
editor.putString(Config.SID, responseTwo);
editor.commit();

Intent intent = new Intent(Login.this, Home.class);
startActivity(intent);
}else{
//display error message
Toast.makeText(Login.this, "Wrong Username or Password", Toast.LENGTH_LONG).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//from android.com: A Map is a data structure consisting of a set of keys and
// values in which each key is mapped to a single value. The class of the objects
// used as keys is declared when the Map is declared, as is the class of the
// corresponding values.
Map<String,String> hashMap = new HashMap<>();

//maps specified string key, username and password, to specified string value
hashMap.put(Config.username, username);
hashMap.put(Config.password, password);

return hashMap;
}
};

//add string request to queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
0

По вопросам рекламы [email protected]