Ошибка дооснащения: DB BEGIN_OBJECT, но была STRING (когда я изменил сервер, на котором находится Api) - PullRequest
0 голосов
/ 15 ноября 2018

при импорте моей БД с сервера на локальный сервер на моем ПК с использованием XAMPP, затем я пытаюсь извлечь данные из БД с помощью JSON Api и Retrofit. Я обнаружил, что ошибка

java.lang.IllegalStateException: Ожидаемый BEGIN_OBJECT, но в строке 1 путь 1 столбца 1 $

был STRING, я помещаю файлы Api.php и DB.php в файл C: \ xampp \ htdocs \ и заполняю детали БД из PHPMyAdminСервер БД после того, как я импортирую его в PHPMyAdmin, так что я думаю, что все в порядке.Я думаю, что ошибка в Api.php и Моем приложении. Это просто страница входа в MainActivity.java.

Api.php

    <?php

include 'DB.php';
$db = DB::getInstance();
header("Content-Type: application/json;charset=utf-8");

function UserLoginMethod($username , $password , $lat, $long){
    global $db;
    $sql = "SELECT * FROM users WHERE user_email = ? AND  user_password = ?
             LIMIT 1";
    $user_info = $db->query($sql, [$username, $password]);


    CheckIsEmpty($user_info);
    //echo $db->getSQL();
    echo PrintJSON($user_info[0]);

}

switch (@$_GET['function']) {
    case "Login":
        UserLoginMethod(@$_GET['user_email'], @$_GET['user_password'], $_GET['user_location_latitude'], $_GET['user_location_longitude']);
        break;


}



function CheckIsEmpty($query) {
    if (is_null($query)||empty($query)){
        die (json_encode(array('error' => 'no items funded.'),JSON_FORCE_OBJECT));
    }
}
function PrintJSON($q){
    $j = json_encode($q);
    if (count($j) > 0 && !is_null($q) )
        return $j;
    else
        die (json_encode(array('error' => 'no items funded.'),JSON_FORCE_OBJECT));
}


function CreateDieError($body){
    die (json_encode(array("error" => $body),JSON_FORCE_OBJECT));
}

?>

ApiClient.java Для подключения к серверу

public class ApiClient {

    public static final String BASE_URL = "http://192.168.1.38/";
    public static final String PATH_URL = "/file/";//Path For Api

    static Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit==null){

            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();
        }
        return retrofit;
    }
}

ApiInterface.java

public interface ApiInterface {

    @Headers("Content-type: application/json")
    @GET(ApiClient.PATH_URL+"Api.php")
    Call<UserAccount> Login(@Query("function") String function, @Query("user_email") String email, @Query("user_password") String password,
                            @Query("user_location_latitude") Double Latitude,
                            @Query("user_location_longitude") Double Longitude);

}

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

        final Button loginBtn = findViewById(R.id.loginBtn);
        TextView signupTxt = findViewById(R.id.txtSignup);
        TextView forgetPassTxt = findViewById(R.id.txtForgetPassword);

        loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);

            EditText emailEditeText = findViewById(R.id.edtEmail);
            EditText passEditeText = findViewById(R.id.edtPassword);

            UserLogin(apiInterface, emailEditeText, passEditeText);
        }
    });


 private void UserLogin(ApiInterface apiInterface, EditText emailEditeText, 
        EditText passEditeText){
        Call<UserAccount> call = apiInterface.Login("Login", emailEditeText.getText().toString(), Utility.md5(passEditeText.getText().toString()), Utility.myLocation.getLatitude(), Utility.myLocation.getLongitude());
            //make a call to server
        call.enqueue(new Callback<UserAccount>() {
            @Override
            public void onResponse(Call<UserAccount> call, Response<UserAccount> response) {

                String errorBody = response.errorBody().toString();

                Log.d("Message", "code..."+response.code() + " message..." + response.message()+" body..."+errorBody);

                boolean check = response.isSuccessful();
                Log.i("log12", String.valueOf(check));
                String val = response.body().getError();
                Log.i("log1",val);
                if (val == null) {
                    prefManager.setLogin(true, response.body());
                    Toast.makeText(LoginActivity.this, " Login success" + response.body().getUsername(), Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
                }else {
                    if (response.body().getError().equals("no items funded.")){
                        Toast.makeText(LoginActivity.this, "check Email and Password", Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(LoginActivity.this, response.body().getError(), Toast.LENGTH_SHORT).show();
                        Log.e("error", response.body().getError());
                    }
                }
            }

            @Override
            public void onFailure(Call<UserAccount> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Network Error", Toast.LENGTH_SHORT).show();
                Log.e("login",t.getLocalizedMessage());
            }
        });
    }

UserAccount.java

    public class UserAccount {

    private int userID;
    private String username;
    private String user_email;
    private String user_phone;
    private String user_password;
    private Double user_location_latitude;
    private Double user_location_longitude;

    private String error;

    // getter and setter  
}

. Любые предложения могут помочь.Большое спасибо

Решение : Проблема в Api именно при функции count (). Я изменяю ее на функцию empty (), и она работает хорошо.

1 Ответ

0 голосов
/ 15 ноября 2018

изменить PATH_URL = "/file/" на "file/"

...