我有一个评分栏,用户可以在这里对产品进行评分。当用户选择他们的评分时,应用程序应该将评分连同用户名和产品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查询中有一个错误,应该检查日志。