Собственно вот в чем проблема, пытаюсь подключить БД к приложению в Android Stuido. Написал php файлы для работы с БД, вроде все логично, коннектится к серверу, но почему то, при попытке логина, JSON выдает ошибку, мол отсутствуют введенные данные.
Сам класс для логина
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class loginMySQL extends Activity {
private static final String TAG = registerMySQL.class.getSimpleName();
private Button btnLogin;
private Button btnLinkToRegister;
private EditText inputLogin;
private EditText inputPassword;
private ProgressDialog pDialog;
private SessionManager session;
private SQLiteHandler db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loginactivity);
inputLogin = (EditText) findViewById(R.id.login_login);
inputPassword = (EditText) findViewById(R.id.login_password);
btnLogin = (Button) findViewById(R.id.login_enter);
btnLinkToRegister = (Button) findViewById(R.id.login_register);
btnLinkToRegister.setBackgroundColor(Color.TRANSPARENT);
// Progress dialog
pDialog = new ProgressDialog(this);
pDialog.setCancelable(false);
// SQLite database handler
db = new SQLiteHandler(getApplicationContext());
// Session manager
session = new SessionManager(getApplicationContext());
// Check if user is already logged in or not
if (session.isLoggedIn()) {
// User is already logged in. Take him to main activity
Intent intent = new Intent(loginMySQL.this, userpanel.class);
startActivity(intent);
finish();
}
// Login button Click Event
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
String login = inputLogin.getText().toString().trim();
String password = inputPassword.getText().toString().trim();
// Check for empty data in the form
if (!login.isEmpty() && !password.isEmpty()) {
// login user
checkLogin(login, password);
} else {
// Prompt user to enter credentials
Toast.makeText(getApplicationContext(),
"Введите данные!", Toast.LENGTH_LONG)
.show();
}
}
});
// Link to Register Screen
btnLinkToRegister.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(),
registerMySQL.class);
startActivity(i);
}
});
}
/**
* function to verify login details in mysql db
* */
private void checkLogin(final String login, final String password) {
// Tag used to cancel the request
String tag_string_req = "req_login";
pDialog.setMessage("Выполняется вход ...");
showDialog();
StringRequest strReq = new StringRequest(Method.POST,
urlHandler.URL_LOGIN, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);
// Now store the user in SQLite
String uid = jObj.getString("user_uniqueid");
JSONObject user = jObj.getJSONObject("user");
String name = user.getString("user_name");
String login = user.getString("user_login");
String middle = user.getString("user_middle_name");
String last = user.getString("user_last_name");
String group = user.getString("user_group");
String created_at = user
.getString("created_at");
// Inserting row in users table
db.addUser(login, name, middle, last, group, uid, created_at);
// Launch main activity
Intent intent = new Intent(loginMySQL.this,
userpanel.class);
startActivity(intent);
finish();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Login Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("user_login", login);
params.put("password", password);
return params;
}
};
// Adding request to request queue
volleyController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
private void showDialog() {
if (!pDialog.isShowing())
pDialog.show();
}
private void hideDialog() {
if (pDialog.isShowing())
pDialog.dismiss();
}
public void onBackPressed() {
new AlertDialog.Builder(this)
.setTitle("Выйти из приложения?")
.setMessage("Вы действительно хотите выйти?")
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
System.exit(0);
}
}).create().show();
}
}
Сам собственно PHP файл для логина. И функция getUserByLoginAndPassword которую он использует.
<?php
require_once 'db_functions.php';
$db = new db_functions();
// json response array
$response = array("error" => FALSE);
if (isset($_POST['user_login']) && isset($_POST['user_password'])) {
// receiving the post params
$user_login = $_POST['user_login'];
$user_password = $_POST['user_password'];
// get the user by login and password
$user = $db->getUserByLoginAndPassword($user_login, $user_password);
if ($user != false) {
// user is found
$response["error"] = FALSE;
$response["uid"] = $user["user_uniqueid"];
$response["user"]["user_login"] = $user["user_login"];
$response["user"]["user_name"] = $user["user_name"];
$response["user"]["user_middle_name"] = $user["user_middle_name"];
echo json_encode($response);
} else {
// user is not found with the credentials
$response["error"] = TRUE;
$response["error_msg"] = "Such login and password dont exist";
echo json_encode($response);
}
} else {
// required post params is missing
$response["error"] = TRUE;
$response["error_msg"] = "Enter login and password";
echo json_encode($response);
}
?>
Функция.
public function getUserByLoginAndPassword($user_login, $user_password) {
$stmt = $this->conn->prepare("SELECT * FROM users_table WHERE user_login = ?");
$stmt->bind_param("s", $user_login);
if ($stmt->execute()) {
$user = $stmt->get_result()->fetch_assoc();
$stmt->close();
// verifying user password
$user_salt = $user['user_salt'];
$user_encrypted_pass = $user['user_encrypted_pass'];
$hash = $this->checkhashSSHA($user_salt, $user_password);
// check for password equality
if ($user_encrypted_pass == $hash) {
// user authentication details are correct
return $user;
}
} else {
return NULL;
}
}
Срабатывает ошибка в $response["error_msg"] = "Enter login and password";
Вам надо отлаживать всё это дело.
Сперва замените в PHP-скрипте $_POST на обычные строки и посмотрите в браузере, как оно работает.
Если работает, как надо, попробуйте записывать в файл на сервере данные, которые приходят. Может до сервера параметры не доходят.
Выводите перед отправкой в приложении параметры в лог. Может, у вас до отправки что-то пропадает.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Зависает на строчке msg = oisreadObject(); Причем иногда зависает, а иногда нет
Есть обработчик нажатия на элемент, посредством которого происходит переход на новое Activity
Какие есть способы изменения Java-байткода во время/после компиляции? Меня интересует возможность за счёт аннотаций модифицировать классы,...