【问题标题】:Error org.json.JSONException: End of input at character 0 of错误 org.json.JSONException:在字符 0 处输入结束
【发布时间】:2018-09-20 05:24:43
【问题描述】:

我的登录代码有什么问题,当我注册时它工作正常并且用户可以成功注册,但是当我尝试登录时,我收到错误“在字符 0 处输入结束”

这是我的 Login.php 代码

<?php
include "connect.php";
if ($_SERVER['REQUEST_METHOD']=='POST') {

    $email = $_POST['email'];
    $password = $_POST['password'];

    $sql = "SELECT * FROM User WHERE email='$email' ";

    $response = mysqli_query($conn, $sql);

    $result = array();
    $result['login'] = array();

    if ( mysqli_num_rows($response) === 1 ) {

        $row = mysqli_fetch_assoc($response);

        if ( password_verify($password, $row['password']) ) {

            $index['name'] = $row['name'];
            $index['email'] = $row['email'];

            array_push($result['login'], $index);

            $result['success'] = "1";
            $result['message'] = "success";
            echo json_encode($result);

            mysqli_close($conn);

        } else {

            $result['success'] = "0";
            $result['message'] = "error";
            echo json_encode($result);

            mysqli_close($conn);

        }
    }

}
?>

这是我在 android studio (Login.java) 中的登录代码

package com.m99.ml99.everyday;

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

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class Login extends AppCompatActivity {

private EditText email, password;
private Button btn_login;
private TextView link_regist;
private ProgressBar loading;
private static String URL_LOGIN= 
"https://hanymina43.000webhostapp.com/Login.php";


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

    loading = findViewById(R.id.loading);
    email = findViewById(R.id.email);
    password = findViewById(R.id.password);
    btn_login = findViewById(R.id.btn_login);
    link_regist = findViewById(R.id.link_regist);

    btn_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String mEmail = email.getText().toString().trim();
            String mPass = password.getText().toString().trim();

            if (!mEmail.isEmpty() || !mPass.isEmpty()) {
                Login(mEmail, mPass);
            } else {
                email.setError("Please insert email");
                password.setError("Please insert password");
            }
        }
    });

    link_regist.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(Login.this, Register.class));
        }
    });

}

private void Login(final String email, final String password) {

    loading.setVisibility(View.VISIBLE);
    btn_login.setVisibility(View.GONE);

    StringRequest stringRequest = new StringRequest(Request.Method.POST, 
URL_LOGIN,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        String success = jsonObject.getString("success");
                           JSONArray jsonArray =
jsonObject.getJSONArray("login");

                        if (success.equals("1")) {

                            for (int i = 0; i < jsonArray.length(); i++) {

                                JSONObject object = 
jsonArray.getJSONObject(i);

                                String name = 
  object.getString("name").trim();
                                String email = 
  object.getString("email").trim();
                                loading.setVisibility(View.GONE);


                            }

                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                        loading.setVisibility(View.GONE);
                        btn_login.setVisibility(View.VISIBLE);
                        Toast.makeText(Login.this, "Error " +e.toString(), 
Toast.LENGTH_SHORT).show();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    loading.setVisibility(View.GONE);
                    btn_login.setVisibility(View.VISIBLE);
                    Toast.makeText(Login.this, "Error " +error.toString(), 
Toast.LENGTH_SHORT).show();
                }
            })
    {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("email", email);
            params.put("password", password);
            return params;
        }
    };

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

}
}

谁能告诉我我的代码哪里出了问题,我不认为是服务器,因为我在同一台服务器上运行注册,它工作正常谢谢。

【问题讨论】:

  • 为什么要标记为c#?
  • 警告:您对SQL Injections 持开放态度,应该真正使用参数化Prepared Statements,而不是像那样手动构建查询。特别是因为您根本没有逃避用户输入!
  • 请向我们展示完整的错误信息。您还应该使用 Postman 之类的工具测试您的登录脚本(或创建一个简单的 Web 表单以发布到登录脚本)并检查 API 是否按预期工作,或者您是否从中收到任何错误消息。
  • 一个建议是确保通过您的代码的所有路由都返回一些结果 - 所以如果 if ($_SERVER['REQUEST_METHOD']=='POST') { 失败,返回一些内容说使用了无效方法等。
  • 我尝试使用 Postman 测试 api,这是我收到的消息
    通知:未定义索引:/storage/ssd5/239/ 中的电子邮件4104239/public_html/Login.php 第 6 行

    注意:未定义索引:/storage/ssd5 中的密码/239/4104239/public_html/Login.php 第 7 行

标签: php android json database


【解决方案1】:

检查new JSONObject调用之前从服务器接收到的JSON格式。

如果它是有效的 JSON,则在您的问题中发布从 API 收到的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多