Зарегистрироваться в базе данных Android и MySQL - PullRequest
0 голосов
/ 02 мая 2018

Я хочу зарегистрировать пользователей в приложении для Android, используя веб-сервис в базе данных MySQL. Я использую код ниже на стороне php:

<?php
header("Content-type: application/json; charset=utf-8");
require_once("dbconnect.php");
require_once 'jdf.php';

if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
    throw new Exception('Request must be in POST method!');
}
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0){
    throw new Exception('Request must send in json format!');
}
$content = trim(file_get_contents("php://input"));
$decoded = json_decode($content, true);
if(!is_array($decoded)){
    throw new Exception('invalid request!');
}
$res = $decoded;
$data = array();

if(array_key_exists('username',$res)){
    //username exist
    $username = $res['username'];
    $pass = md5($res['password']);
    $mobile = $res['mobile'];
    $stmt = $db->prepare("SELECT * FROM users WHERE username = :a");
    $stmt->bindparam(':a',$username);
    $stmt->execute();
    $c = $stmt->rowCount();
    if($c == 0){
        $date = jdate("Y/m/d H:i",'','','','en');
        $stmt = $db->prepare("INSERT INTO users (mobile, username,  password, reg_date)VALUES(:a, :b, :c, :d)");
        $stmt->bindparam(':a',$mobile);
        $stmt->bindparam(':b',$username);
        $stmt->bindparam(':c',$pass);
        $stmt->bindparam(':d',$date);
        $stmt->execute();
        $s = false;
        $m = 'register successful!';
    }else{
        $s = true;
        $m = 'this user already registered!';
        $res_u = $stmt->fetch();
        $username = $res_u['username'];
        $date = $res_u['reg_date'];
        $data = array('username' => $username, 'date' => $date);
    }
}else{
    $s = true;
    $m = 'username is not sent!';
}

$back = array('error' => $s, 'message' => $m, 'data' => $data);
$json_response = json_encode($back);
echo $json_response;

бу в Android Я новичок и только что нашел образец кода по ссылке ниже: https://www.simplifiedcoding.net/android-volley-tutorial/

Я использую именно коды на этой странице, поэтому я не размещаю их все здесь, просто при регистрации действий у меня есть этот код:

package ir.sample.project;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
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 activity_reg extends AppCompatActivity {
    EditText txtUser, txtMobile, txtPass;
    ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reg);

        progressBar = findViewById(R.id.progressBar);

        //if the user is already logged in we will directly start the profile activity
        if (SharedPrefManager.getInstance(this).isLoggedIn()) {
            finish();
            startActivity(new Intent(this, activity_dashboard.class));
            return;
        }

        txtUser = findViewById(R.id.txt_user);
        txtMobile = findViewById(R.id.txt_mobile);
        txtPass = findViewById(R.id.txt_pass);

        findViewById(R.id.btn_reg).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                registerUser();
            }
        });

        findViewById(R.id.btn_open_log).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
                startActivity(new Intent(activity_reg.this, activity_login.class));
            }
        });
    }

    private void registerUser() {
        final String username = txtUser.getText().toString().trim();
        final String mobile = txtMobile.getText().toString().trim();
        final String password = txtPass.getText().toString().trim();
        progressBar.setVisibility(View.VISIBLE);
        if(TextUtils.isEmpty(username)){
            txtUser.setError("Enter username!");
            txtUser.requestFocus();
        }
        if(TextUtils.isEmpty(mobile)){
            txtMobile.setError("Enter mobile!");
            txtMobile.requestFocus();
        }
        if(TextUtils.isEmpty(password)){
            txtPass.setError("Enter password!");
            txtPass.requestFocus();
        }

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_REGISTER, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                progressBar.setVisibility(View.GONE);

                try {
                    //converting response to json object
                    JSONObject obj = new JSONObject(response);

                    //if no error in response
                    if (!obj.getBoolean("error")) {
                        Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();

                        //getting the user from the response
                        JSONObject userJson = obj.getJSONObject("user");

                        //creating a new user object
                        User user = new User(
                        userJson.getInt("id"),
                        userJson.getString("username"),
                        userJson.getString("mobile")
                        );

                        //storing the user in shared preferences
                        SharedPrefManager.getInstance(getApplicationContext()).userLogin(user);

                        //starting the profile activity
                        finish();
                        startActivity(new Intent(getApplicationContext(), activity_dashboard.class));
                    } else {
                        Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("username", username);
                params.put("mobile",mobile);
                params.put("password",password);
                return params;
            }
        };

        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);

    }


}

Я уже проверил свою сторону php с помощью Fiddler, и она работает хорошо (как исключение), но когда я запускаю приложение и нажимаю кнопку регистрации, ничего не происходит и не работает вообще, никаких ошибок не показывается. Я хочу знать, как найти ошибки в этом коде, потому что я знаю, что будет способ печатать и показывать ошибки, как то, что я делаю в php (я хорош в php). (извините, если мой английский плохой)

ОБНОВЛЕНИЕ 1

после печати ошибок исключения в тосте я получил эту ошибку:

"Value <br of type java.lang.string cannot be converted to JSONObject"

Я гуглил это, и кто-то здесь разместил это для решения:

int jsonStart = response.indexOf("{");
                    int jsonEnd = response.lastIndexOf("}");

                    if (jsonStart >= 0 && jsonEnd >= 0 && jsonEnd > jsonStart) {
                        response = response.substring(jsonStart, jsonEnd + 1);
                    }

Я использовал вышеуказанный код, а затем получил этот:

"expected ' ' after main at character 6 of {main}"

какое-нибудь решение для этой проблемы?

Обратите внимание! На стороне сервера я протестировал его с помощью Fiddler, и регистрация прошла успешно; возвращенный код был в правильном формате json без HTML-кода.

...