【问题标题】:PHP: $_POST is not working, and GET method is shown on the browser insteadPHP:$_POST 不起作用,而是在浏览器上显示 GET 方法
【发布时间】:2015-11-13 14:19:59
【问题描述】:

我编写了一个代码来接收来自 android 客户端的 POST 变量。在Android端发出POST请求时,PHP会接收到每个变量并进行下一步处理。

<?php

if (isset($_POST['tag']) && !empty($_POST['tag'])) {

    $tag = $_POST['tag'];

    // get the variables.
    $name = $_POST['name'];
    $email = $_POST['email'];
    $password = $_POST['password'];

    // response Array
    $response = array();

    require_once 'mysql/DB_Functions.php';
    $db = new DB_Functions();

    // check for tag type
    if ($tag == 'login') {

        // check for user
        $user = $db->getUserByEmailAndPassword($email, $password);
        if ($user != false) {
            // user found
            $response["error"] = FALSE;
            $response["uid"] = $user["unique_id"];
            $response["user"]["name"] = $user["name"];
            $response["user"]["email"] = $user["email"];
            $response["user"]["created_at"] = $user["created_at"];
            $response["user"]["updated_at"] = $user["updated_at"];
            echo json_encode($response);
        } else {
            // user not found
            // echo json with error = 1
            $response["error"] = TRUE;
            $response["error_msg"] = "Incorrect email or password!";
            echo json_encode($response);
        }
    } else if ($tag == 'register') {

        // check if user is already exists

        if ($db->userExists($email)) {

            // user already exists - error response
            $response["error"] = TRUE;
            $response["error_msg"] = "User already exists";
            echo json_encode($response);
        } else {

            // store user
            $user = $db->storeUser($name, $email, $password);

            if ($user) {
                // user successfully saved to MySQL database.
                $response["error"] = FALSE;
                $response["uid"] = $user["unique_id"];
                $response["user"]["name"] = $user["name"];
                $response["user"]["email"] = $user["email"];
                $response["user"]["created_at"] = $user["created_at"];
                $response["user"]["updated_at"] = $user["updated_at"];

                echo json_encode($response);

            } else {
                // user failed to store
                $response["error"] = TRUE;
                $response["error_msg"] = "Error occured in Registartion";
                echo json_encode($response);
            }
        }
    } else {
        // user failed to store
        $response["error"] = TRUE;
        $response["error_msg"] = "Unknow 'tag' value. It should be either 'login' or 'register'";
        echo json_encode($response);
    }
} else {
    $response["error"] = TRUE;
    $response["error_msg"] = "Operation failed due to the missing tag!";
    echo json_encode($response);
}

var_dump($_SERVER['REQUEST_METHOD'], $_POST);
?>

但是当我在网络上打开这个原始 PHP 文件并查看它的外观时,我发现了一些非常奇怪的东西。它说如下。

{"error":true,"error_msg":"Operation failed due to the missing tag!"}string(3) "GET" array(0) { }

那个“GET”是我认为很奇怪的那个,因为在 PHP 或 Android 端我从未使用过 GET 方法,它存在于浏览器中。这是怎么发生的?我必须做些什么才能将其更改为 POST?

编辑:

这是请求 POST 方法的 Android 部分。此处使用 Volley 库。

Map<String, String> params = new HashMap<>();
params.put("tag", "register");
params.put("name", name);
params.put("email", email);
params.put("password", password);

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.POST, ServerURL.URL_REGISTER, new JSONObject(params), new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        Log.d(TAG_REGISTER, "Register Response: " + response.toString());
        pDialog.dismiss();

        try {
            JSONObject jObj = new JSONObject(response.toString());
            boolean error = jObj.getBoolean("error");
            if (!error) {
                // User successfully stored in MySQL
                // Now store the user in sqlite
                String uid = jObj.getString("uid");

                JSONObject user = jObj.getJSONObject("user");
                String name = user.getString("name");
                String email = user.getString("email");
                String created_at = user
                        .getString("created_at");

                // Inserting row in users table
                db.addUserIntoSQLite(name, email, uid, created_at);

                Toast.makeText(getActivity(), "User successfully registered. Try login now!", Toast.LENGTH_LONG).show();

                // Launch main activity
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                getActivity().overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
                startActivity(intent);
                getActivity().finish();

            } else {

                // Error occurred in registration. Get the error
                // message
                String errorMsg = jObj.getString("error_msg");
                Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
            }
        } catch (JSONException e) {
            Toast.makeText(getActivity(), "JSONException: " + e.getMessage(), Toast.LENGTH_LONG).show();
        }

    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e(TAG_REGISTER, "Registration Error: " + error.getMessage());
        Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show();
        pDialog.dismiss();
    }
}) {

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json; charset=utf-8");
        return headers;
    }
};

RequestQueue queue = Volley.newRequestQueue(getActivity());
queue.add(jsonObjectRequest);

}

【问题讨论】:

  • 你能显示发出这个请求的代码吗?是android还是html?
  • GET 是请求方法。如果您在浏览器中正常打开此文件,它是使用GET 方法打开的,您在输出中看到的原因是var_dump($_SERVER['REQUEST_METHOD'], $_POST);。 (请注意,它不仅仅是"GET" 本身,整个string(3) "GET" 属于一起)。另外,如果你var_dump($_GET),你得到了什么,还是和$_POST一样是空的?
  • 看起来参数根本没有传递给脚本。显示提交数据的表单的源代码。
  • @DarylGill 我上传了 Android 部分。谢谢
  • @ROAL 每当我向服务器发送带有标签的请求时,我什么都没有收到,所以它总是返回标签丢失。

标签: php android post android-volley


【解决方案1】:

正如 cmets 中所述,您不能只在浏览器中打开文件并期望 POST 请求发生。你只能使用该方法实现GET请求。

我不确定您的方法为什么不起作用,但鉴于您的 IF 语句失败,您可以轻松测试正在传递的数据类型。在您的第一个 IF 条件之前尝试执行以下操作:

var_dump($_POST); echo '====='; var_dump($_GET);

这样,当您发出POST 请求时,您就可以知道正在传递什么样的数据。从那里您可以调试和调整您的IF 条件,因为这似乎是主要问题。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2011-09-08
    • 2013-07-12
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多