【问题标题】:org.json.JSONException: End of input at character 0 of with volley and phporg.json.JSONException:在 volley 和 php 的字符 0 处输入结束
【发布时间】:2018-07-23 23:42:33
【问题描述】:

昨天我遇到了下面提到的错误,所以我开始在stackoverflow上寻找类似的问题……但似乎没有一个有帮助:(

我的猜测是我没有得到服务器的响应,但我想不出如何解决这个问题。我在其他一些活动中使用相同的代码(当然还有其他功能),但它们都工作得很好。 唯一改变的是我第一次使用更新表,但我看不出这将如何导致以下错误。

我希望你能帮助我。

奇怪的是如果

$anzahlrows == 1

是真的,并且查询的 php 文件中没有比我在 android 中得到的错误更多的错误(像往常一样):

Register Response: {"success":true,"error_msg":"Sie wurden erfolgreich angelegt!"}
I/jsonResponse: {"success":true,"error_msg":"Sie wurden erfolgreich angelegt!"}

一切正常……

这是我得到的错误:

org.json.JSONException: End of input at character 0 of 

在行

JSONObject jsonResponse = new JSONObject(response);

这是android studio中的代码:

Response.Listener<String> responseListener = new Response.Listener<String>() {


                    //  this gets called on response
                    @Override
                    public void onResponse(String response) {


                        Log.d("Response:", "Register Response: " + response);
                        //  check for boolean success from php
                        try {
                            JSONObject jsonResponse = new JSONObject(response);
                            Log.i("jsonResponse", jsonResponse.toString());
                            boolean success = jsonResponse.getBoolean("success");


                            //  if true from php start LoginActivity
                            if (success){
                                Toast.makeText(RegisterActivity.this, jsonResponse.getString("error_msg"), Toast.LENGTH_LONG).show();
                                Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                                RegisterActivity.this.startActivity(intent);
                            }

                            //  if false build an AlertDialog
                            else {
                                Toast.makeText(RegisterActivity.this, jsonResponse.getString("error_msg"), Toast.LENGTH_LONG).show();
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                };

                //  call register request and transfer string username and password
                RegisterRequest registerRequest = new RegisterRequest(email, password, matrikelnummer, firstName, surname, responseListener);
                RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this);
                queue.add(registerRequest);

这是我的 PHP 文件:

if (isset($_POST["email"]) or isset($_POST["password"]) or isset($_POST["matrikelnummer"]) or isset($_POST["firstName"]) or isset($_POST["surname"])) {

$email = $_POST["email"];
$password = $_POST["password"];
$matrikelnummer = $_POST["matrikelnummer"];
$firstName = $_POST["firstName"];
$surname = $_POST["surname"];

$query = "SELECT * FROM Users WHERE Matrikelnummer ='$matrikelnummer'";
if ($result=mysqli_query($con,$query)) {

    $anzahlrows = mysqli_num_rows($result);


    if($anzahlrows == 1) {


        $query = "UPDATE Users SET email = '$email' ,password = '$password',firstName = '$firstName', surname = '$surname' WHERE Matrikelnummer = '$matrikelnummer'";
        if ($result=mysqli_query($con,$query)) {

            $response["success"] = TRUE;
            $response["error_msg"] = "Sie wurden erfolgreich angelegt!";
            echo json_encode($response);
            exit;

        } else {
            $response["success"] = FALSE;
            $response["error_msg"] = "Fehler bei der INSERT SQL Abfrage";
            echo json_encode($response);
            exit;
        }



    } 
    else {
        $response["success"] = FALSE;
        $response["error_msg"] = "Die angegebene Matrikelnummer ist nicht verfügbar";
        echo json_encode($response);
        exit;


    }
} 
else {
    $response["success"] = FALSE;
    $response["error_msg"] = "Fehler bei der SQL Abfrage";
    echo json_encode($response);
    exit;
}

}
else {
$response["success"] = FALSE;
$response["error_msg"] = "Required parameters missing!";
echo json_encode($response);
exit;
}

日志显示如下:

D/Response:: Register Response: 
W/System.err: org.json.JSONException: End of input at character 0 of 
W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
.
.
.

【问题讨论】:

  • 您声明 ::“一切正常......这是我得到的错误:”如果一切正常,那么问题出在哪里?或者,如果您收到导致错误的响应,请显示导致错误的 JSON 响应!
  • @Barns 如果 $anzahlrows == 1 为真,它可以正常工作......但是当 php 文件应该执行任何它应该发送成功为假的东西时,输出只是什么都没有......或者换句话说,jsonresponse就像你在日志中看到的一样
  • 我通常用我的 PHP 代码做的是在我输入我的 'if (isset($_POST["email"]) ` 代码开始之前创建一个响应。然后在每个 if/else 语句创建一个适当的响应——就像你有的一样,除了我不回显响应并退出。我的最后一个语句是我使用回显响应的地方,这样无论之间发生什么,它都会回显我的响应。我将发布一个示例几分钟后。

标签: php android json exception android-volley


【解决方案1】:

我通常在我的代码进入 if (isset($_POST["email"]) 代码开始之前在我的 PHP 代码中创建一个响应。然后在每个if/else 语句中,我创建一个适当的响应——就像你所做的那样,除了我不回显响应并退出。我的最后陈述是我使用回显响应的地方,这样无论两者之间发生什么,它都会回显我的响应。

<?php

// array for JSON response
$response = array();
$response["success"] = 0;
$response["message"] = "Error before Parameters";

// check for post data
if (isset($_POST["id"])) {

    $id = $_POST['id'];

    // include db connect class
    require_once __DIR__ . '/db_config.php';
    // set vars
    $host = DB_SERVER;
    $db   = DB_DATABASE;
    $user = DB_USER;
    $pass = DB_PASSWORD;
    $charset = 'utf8';

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

    // connecting to db
    $pdo = new PDO($dsn, $user, $pass, $opt);
    $sql = 'SELECT * FROM tblConnectionData WHERE ID = :id;';
    $stmt = $pdo->prepare($sql);
    $res = $stmt->execute(['id' => $id]);

    /* Check the number of rows that match the SELECT statement */
    if ($res) {
        // success
        $response["success"] = 1;
        $response["data"] = array();

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $data = array();
            $data["id"] = $row["ID"];
            $data["state"] = $row["State"];
            $data["state_abbrev"] = $row["StateAbbrev"];
            $data["city"] = $row["City"];

            array_push($response["data"], $data);
        }
    }
    else {
        /* No rows matched -- do something else */
        // required field is missing
        $response["success"] = 0;
        $response["message"] = "No data returned!!";
    }   
}
else {
    $response["success"] = 0;
    $response["message"] = "Parameters are not correct";
}
// echoing JSON response
echo json_encode($response);
?>

这样我总能得到回应。我还使用int 回复我的“成功”标签。这样我就可以通过检查int值而不是试图破译string响应来区分我的客户端代码出了什么问题。

请注意,我也在使用 PDO 和 Prepared Statements。我强烈建议您也使用准备好的语句来防止 SQL 注入。

【讨论】:

  • 对我来说听起来不错,但是如果我只在文件末尾回显一个响应,我的问题的结果怎么会改变。我同意你的看法,这可能是最好的做法,但如果我用 echo json_encode($response) 组织每一种情况,它无论如何都应该向我发送响应....但是在我的应用程序中我根本没有得到任何响应除非 $anzahlrows == 1 :(
  • @PatrickNadler :: 这可能有很多原因。也许你的POST参数有问题。按照我的建议更改代码,您将能够看到,如果您在超出该点之前被“踢出”您的 PHP 代码。
【解决方案2】:

我通过在 php 文件的开头初始化数组来修复它。它在我的其他 php 文件中正常工作,我不知道为什么它解决了我的问题,但它确实解决了。

还是谢谢你的回答!

您是否看到它以这种方式工作的任何原因?

【讨论】:

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