MySQL PHP и Android Studio (JSON)

329
14 апреля 2017, 20:24

Собственно вот в чем проблема, пытаюсь подключить БД к приложению в 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";

Answer 1

Вам надо отлаживать всё это дело.

Сперва замените в PHP-скрипте $_POST на обычные строки и посмотрите в браузере, как оно работает.

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

Выводите перед отправкой в приложении параметры в лог. Может, у вас до отправки что-то пропадает.

READ ALSO
Зависает readObject() в ObjectInputStream

Зависает readObject() в ObjectInputStream

Зависает на строчке msg = oisreadObject(); Причем иногда зависает, а иногда нет

235
Получение текста из текущего элемента.Android

Получение текста из текущего элемента.Android

Есть обработчик нажатия на элемент, посредством которого происходит переход на новое Activity

186
Модификация Java-байткода при компиляции

Модификация Java-байткода при компиляции

Какие есть способы изменения Java-байткода во время/после компиляции? Меня интересует возможность за счёт аннотаций модифицировать классы,...

217
проблема с AsyncTask и Thread

проблема с AsyncTask и Thread

Хотел загрузить файл на серверно с потоками проблемы

237