使用Android Volley将用户选择的评级发送到服务器并用json响应刷新评级栏时出错


Error sending user selected rating to server and refreshing ratingbar with json response using Android Volley?

我有一个评分栏,用户可以在这里对产品进行评分。当用户选择他们的评分时,应用程序应该将评分连同用户名和产品id一起发送到服务器。然后服务器应该计算平均总体评分并将其作为响应返回。然后,RatingBar应该会刷新该产品的总体评级。不幸的是,在测试时,评级系统不起作用,产生的错误没有任何意义或暗示问题。我已经在详细、调试和错误模式下尝试了logcat,但仍然得到了相同的结果。我尝试过检索/发送"浮动评级",但结果相同。我还在Click上添加了一条"吐司"消息,以确认评级正在处理中。我不知道这里出了什么问题,想知道我的系统是否正确运行?如果没有,我该怎么做才能确保系统正常工作?我将本教程转换为使用Volley库,但保持PHP评级代码不变。

这是logcat响应

    04-03 17:48:02.538 20253-20253/com.curtrostudios.testapp E/new_rating: Rating Update Error: null
    04-03 17:48:02.562 20253-20253/com.curtrostudios.testapp D/Volley: [1] Request.finish: 10328 ms: [ ] http://localhost/testapp/updateRating.php 0x1b9800e3 NORMAL 8

如果我使用POST参数在浏览器中尝试此操作,我会收到HTTP 500错误

    http://localhost/demoapp/updateRating.php?pid=1&userid=1&ratingpnt=3

这是我的PHP代码

    <?
    //load and connect to MySQL database stuff
    require("config.php");
    // Check Duplicate
    $strSQL = "SELECT * FROM rating WHERE 1 AND ProductID = '".$_POST["pid"]."' 
    AND UserID = '".$_POST["userid"]."'  ";
    $objQuery = mysql_query($strSQL);
    $obResult = mysql_fetch_array($objQuery);
    if($obResult)
    {
        $arr['StatusID'] = "0"; 
        $arr['Error'] = "Duplicate Vote!";  
        $arr['Rating'] = "0";   
        mysql_close($objConnect);
        echo json_encode($arr);
        exit();
    }
    /*** Insert rating ***/
    $strSQL = "INSERT INTO rating (ProductID,UserID,RatingPoint) 
        VALUES (
            '".$_POST["pid"]."',
            '".$_POST["userid"]."',
            '".$_POST["ratingpnt"]."'
            ) ";
    $objQuery = mysql_query($strSQL);
    /*** Update Rating Average ***/
    $strSQL = " UPDATE products SET
        prod_rating = (SELECT AVG(RatingPoint) FROM rating WHERE ProductID = '".$_POST["pid"]."')
        WHERE pid = '".$_POST["pid"]."' ";
    $objQuery = mysql_query($strSQL);
    // Return New Rating Point
    $strSQL = "SELECT * FROM products WHERE 1 AND pid = '".$_POST["pid"]."'  ";
    $objQuery = mysql_query($strSQL);
    $obResult = mysql_fetch_array($objQuery);
    if($obResult)
    {
        $arr['StatusID'] = "1"; 
        $arr['Error'] = ""; 
        $arr['Rating'] = $obResult["Rating"];   
    }
    /**
        $arr['StatusID'] // (0=Failed , 1=Complete)
        $arr['Error'] // Error Message
        $arr['Rating'] // New Rating Point
    */
    mysql_close($objConnect);
    echo json_encode($arr);
?>

这是我的评分栏

    final String rating = intent.getStringExtra("rating");
prodRating = (RatingBar)findViewById(R.id.ratingBar);
        prodRating.setNumStars(5);
        prodRating.setMax(5);
        prodRating.setStepSize(0.1f);
        prodRating.setRating(Float.valueOf(rating));
        prodRating.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
            @Override
            public void onRatingChanged(RatingBar ratingBar, float newRating, boolean fromUser) {
                    updateRating(pid, uid, ratingBar.getRating());
            }
        });

这是更新评级的功能

    public void updateRating(final String pid, final String userid,
                            final Float strNewRating) {
        StringRequest strReq = new StringRequest(Request.Method.POST,
                AppConfig.URL_UPDATE_RATING, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d(AppConfig.TAG_NR, "Update Rating Response: " + response.toString());
                try {
                    JSONObject jObj = new JSONObject(response);
                    boolean error = jObj.getBoolean("error");
                    // Check for error node in json
                    if (!error) {
                        // rating successfully posted
                        String newRate = jObj.getString("prod_rating");
                        prodRating.setRating(Float.valueOf(newRate));
                        Log.d(AppConfig.TAG_NR, "New rating:" + newRate);

                    } else {
                        // Error updating rating. Get the error message
                        String errorMsg = jObj.getString("error_msg");
                        Toast.makeText(getApplicationContext(),
                                errorMsg, Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    // JSON error
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(AppConfig.TAG_NR, "Rating Update Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        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("pid",pid);
                params.put("userid", userid);
                params.put("ratingpnt", Float.valueOf(strNewRating).toString());
                return params;
            }
        };
        // Adding request to request queue
        VolleyController.getInstance().addToRequestQueue(strReq, AppConfig.TAG_NR);
    }

在php中,使用截击时需要sid。您的发送pid。您可能在SQL查询中有一个错误,应该检查日志。