2

I'm a beginner in PHP and i've got this code where both if and else parts are executed in the same "run". I know it's logically impossible but that's what I'm getting.

Here's my PHP Code:

<?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);
}
?>

The required behavior (storing data in the database) is all performed well but the $response I'm getting is the error string i've assigned to when a request title already exists instead of the JSON formatted array of the stored request (Both if and else bodies are executed but i get the result of if body as a response).

A screenshot of the $response using Postman to send the request: enter image description here

A screenshot from my Samsung Galaxy Note 3: enter image description here

I'm also using Galaxy Note 4 for testing and it just shows me a blank Toast message and doesn't start the intent(doesn't move to home screen).

So far the only possible explanation is that the script is being executed twice, however I can't find anywhere that called it a second time.

This is the java code responsible for sending a request with required paramters to the php script above.

 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);
}

Any ideas?

Thanks in advance!

1 Answers1

0

So turns out the problem stemmed from the Java code and not PHP (poor PHP ;P). More accurately, Volley requests have a problem with request timeouts, especially when sending requests using POST method.

So what worked for me was adding this line right before adding the request to the queue:

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

*Replace strReq with your request name. Basically what this line does is that it prevents volley from sending a duplicate request when the first request takes too long.

The original & more datailed answer:

The DefaultRetryPolicy.class's hasAttemptRemaining() class looks like this:

protected boolean hasAttemptRemaining() { return this.mCurrentRetryCount <= this.mMaxNumRetries; } From what I can see, setting the maxNumRetries to 0 will still make that return true if it hasn't done a retry yet.

I fixed it with a

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

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