【问题标题】:For some reason, $_SESSION is not working in Android application由于某种原因,$_SESSION 在 Android 应用程序中不起作用
【发布时间】:2016-06-04 16:07:04
【问题描述】:

我正在尝试将登录的用户存储在新会话中,从数据库中获取信息,将其放入 json 数组,然后在 android 中获取数组并在布局中显示结果。但是,当我运行该应用程序时,从 php 文件返回的数组为空。但是,如果我要在 Postman 等不同的程序中测试 php 文件,我会得到正确的响应

{"result":[{"id":"12","fname":"C","lname":"Wei","username":"cw","email":"werrs.‌​com"}]}

这里是php文件和java方法。

<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'GET'){

    $username = $_SESSION['username'];

    $sql = "SELECT * FROM USER WHERE username = '$username'";

    require_once('connect.inc.php');

    $run = mysqli_query($conn, $sql);
    $result = array();

    while($row = mysqli_fetch_array($run)){
        array_push($result, array(
            'id' => $row['id'],
            'fname' => $row['fname'],
            'lname' => $row['lname'],
            'username' => $row['username'],
            'email' => $row['email'],
        ));
    }

    echo json_encode(array('result'=>$result));

    mysqli_close($conn);
}
?>

在 Postman 中,它成功获取了登录用户,但在 android 中却没有。

    private void getUserData() { StringRequest stringRequest = new 
    StringRequest(Request.Method.GET,              
            Config.SERVER_ADDRESS + "GetUserData.php",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    JSONObject jsonObject = null;
                    try {
                        //json string to jsonobject
                        jsonObject = new JSONObject(response);

                        //get json sstring created in php and store to JSON Array
                        result = jsonObject.getJSONArray(Config.json_array);

                        //get username from json array
                        getUserInfo(result);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });

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

private void getUserInfo(JSONArray jsonArray){
    for(int i = 0; i < jsonArray.length(); i++) {
        try {
            JSONObject json = jsonArray.getJSONObject(i);

            userInfo.add(json.getString(Config.getUsername));
        } catch (JSONException e) {

        }
    }
}

【问题讨论】:

    标签: java php android mysql session


    【解决方案1】:

    为了在服务器端检索先前启动的会话,您的请求必须包含会话 ID(该先前会话的)作为 GET 参数。

    PHP 的默认值是 PHPSESSID=XXXX。

    Cookie 是 Postman 不会失败的原因。 PHP 自动为带有相应会话 ID 的 cookie 附加标头。

    【讨论】:

    • 我是否使用哈希图来执行此操作?
    • 只需以最适合您需要的格式存储先前获得的会话 ID,并将其附加到以下请求:Config.SERVER_ADDRESS + "GetUserData.php?PHPSESSID=" + myPreviousStoredSessionId
    • 我卡住了:/ 不过还是感谢您的帮助
    • 我无法弄清楚如何获取会话 ID 并将其存储在 java 文件中的变量中。我看到我可以使用 seesion_id() 来获取 id,但我似乎无法将其存储在任何地方。
    • 您可以通过 header: header('X-Session-Id: ' . session_id()) 在 php 中发送它或通过 json: json_encode(['sessionId' => session_id()] 回显它)。在您的 android 应用中,只需存储会话 ID 并在以下请求中使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多