PHP if-else机构都在执行

时间:2018-05-18 11:23:21

标签: java php android json if-statement

我是PHP的初学者,我有这个代码,其中if和else部分都在同一个“run”中执行。我知道这在逻辑上是不可能的,但这就是我所得到的。

这是我的PHP代码:

<?php

require_once 'create_request_form.php';

$db = new create_request_form();

// json response array
$response = array("error" => FALSE);

if (isset($_POST['rqTitle']) && isset($_POST['rqMname']) && isset($_POST['rqUname']) && isset($_POST['rqBranch']) && isset($_POST['rqText']) && isset($_POST['rqMinPrice']) && isset($_POST['rqMaxPrice']) && isset($_POST['rqImage']) && isset($_POST['rqCategory']) && isset($_POST['rqDateTime'])) {

    // receiving the post params
    $rqTitle = $_POST['rqTitle'];
    $rqMname = $_POST['rqMname'];
    $rqUname = $_POST['rqUname'];
    $rqBranch = $_POST['rqBranch'];
    $rqText = $_POST['rqText'];
    $rqMinPrice = $_POST['rqMinPrice'];
    $rqMaxPrice = $_POST['rqMaxPrice'];
    $rqImage = $_POST['rqImage'];
    $rqCategory = $_POST['rqCategory'];
    $rqDateTime = $_POST['rqDateTime'];


    // check if there is a request  with the same title
    if ($db->checkReqTitle($rqTitle)) {
        // Request already exists
        $response["error"] = TRUE;
        $response["error_msg"] = "Request already exists with the title: " . $rqTitle;
        echo json_encode($response);
    } else {
        // create a new request
        $request = $db->StoreReqInfo($rqTitle, $rqMname, $rqUname, $rqBranch, $rqText, $rqMinPrice, $rqMaxPrice, $rqImage, $rqCategory, $rqDateTime);

        if ($request) {
            // request stored successfully
            $response["error"] = FALSE;
            $response["request"]["rqTitle"] = $request["rqTitle"];
            $response["request"]["rqMname"] = $request["rqMname"];
            $response["request"]["rqUname"] = $request["rqUname"];
            $response["request"]["rqBranch"] = $request["rqBranch"];
            $response["request"]["rqText"] = $request["rqText"];
            $response["request"]["rqMinPrice"] = $request["rqMinPrice"];
            $response["request"]["rqMaxPrice"] = $request["rqMaxPrice"];
            $response["request"]["rqImage"] = $request["rqImage"];
            $response["request"]["rqCategory"] = $request["rqCategory"];
            $response["request"]["rqDateTime"] = $request["rqDateTime"];

            echo json_encode($response);

        } else {
            // request failed to store
            $response["error"] = TRUE; 
            $response["error_msg"] = "An error occurred while creating the request. Please try again.";
            echo json_encode($response);
        }
     }
} else {
    $response["error"] = TRUE;
    $response["error_msg"] = "Required parameter is missing!";
    echo json_encode($response);
}
?>

所需行为(在数据库中存储数据)都表现良好,但我得到的 $ response 是我已经分配给请求标题而不是存储请求的JSON格式数组(如果执行 else 主体,则如果主体作为响应,则得到的结果)。< / p>

使用Postman发送请求的$ response屏幕截图: enter image description here

三星Galaxy Note 3的截图: enter image description here

我也在使用Galaxy Note 4进行测试,它只显示一个空白的Toast消息并且没有启动意图(不会移动到主屏幕)。

到目前为止,唯一可能的解释是脚本正在执行两次,但是我找不到第二次调用它的地方。

这是java代码,负责向上面的php脚本发送带有必需参数的请求。

 private void storeRequest(final String rTitle, final String rMname, final String rUname,
                          final String rBranch, final String rText,  final String rMinPrice,
                          final String rMaxPrice, final String imagePath, final String rCategory) {

    // Tag used to cancel the request
    String cancel_req_tag = "request";

    //A progress dialog message to let the user know they are being registered
    progressDialog.setMessage("Please wait while we add your request...");
    showDialog();

    //creating a StringRequest to send the registration info to the script
    // at the server for processing
    StringRequest strReq = new StringRequest(Request.Method.POST,
            URL_FOR_REQUEST, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d(TAG, "Request Response: " + response.toString());
            hideDialog();

            try { //json objects must be surrounded by try catch statement
                JSONObject jObj = new JSONObject(response);
                boolean error = jObj.getBoolean("error");

                if (!error) { // error is set to false, meaning no error

                    // Launch home activity
                    Intent intent = new Intent(CreateRequestActivity.this, HomeActivity.class);
                    startActivity(intent);
                    finish();

                } else {

                    String errorMsg = jObj.getString("error_msg");
                    Toast.makeText(CreateRequestActivity.this, errorMsg, Toast.LENGTH_LONG).show();
                }



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

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Error: " + error.getMessage());
            Toast.makeText(CreateRequestActivity.this,
                    error.getMessage(), Toast.LENGTH_LONG).show();
            hideDialog();
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            // Posting params to register url
            Map<String, String> params = new HashMap<String, String>();
            params.put("rqTitle", rTitle);
            params.put("rqText", rText);
            params.put("rqMname", rMname);
            params.put("rqUname", rUname);
            params.put("rqBranch", rBranch);
            params.put("rqMinPrice", rMinPrice);
            params.put("rqMaxPrice", rMaxPrice);
            params.put("rqImage", imagePath);
            params.put("rqCategory", rCategory);
            params.put("rqDateTime", DateFormat.getDateTimeInstance().format(new Date()));
            return params;
        }
    };
    // Adding request to request queue
    AppSingleton.getInstance(getApplicationContext()).addToRequestQueue(strReq, cancel_req_tag);
}

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

因此,结果出现了源自Java代码而不是PHP(可怜的PHP; P)的问题。更准确地说,Volley请求在请求超时方面存在问题,尤其是在使用POST方法发送请求时。

那么对我有用的是在将请求添加到队列之前添加此行:

strReq.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));

*将 strReq 替换为请求名称。基本上这条线的作用是它可以防止凌空在第一个请求花费太长时间时发送重复请求。

原作&amp;更多数据回答:

  

DefaultRetryPolicy.class的hasAttemptRemaining()类如下所示:

     

protected boolean hasAttemptRemaining(){           return this.mCurrentRetryCount&lt; = this.mMaxNumRetries;       }       从我所看到的,将maxNumRetries设置为0仍将使得如果尚未重试则返回true。

     

我用

修复了它      

request.setRetryPolicy(new DefaultRetryPolicy(0,-1,0);

来源:Android Volley makes 2 requests to the server when retry policy is set to 0