我一直在尝试向php脚本发送POST请求,以更新MySQL数据库中表的值。我最近一直在使用RetroFit,并已使用它为基于POST的操作发送了很多POST请求。我不知道是否会出现问题,因为我违反了HTTP最佳做法,该做法建议使用PUT进行更新操作,但我也尝试从客户端发送PUT请求,尽管结果相同。当我检查它们时,数据库值未更改。这是我从RetroFit发送HTTP发布请求的代码。
final JsonDataAPI API = RetroFitClient.getInstance().getAPI();
Map<String, String> voteParams = new HashMap<String, String>();
voteParams.put("pollID", String.valueOf(pollID));
voteParams.put("optText", rb1.getTag().toString());
Call <ArrayList<PollOpt>> voteCall = API.makeVote(voteParams);
voteCall.enqueue(new Callback<ArrayList<PollOpt>>() {
@Override
public void onResponse(Call<ArrayList<PollOpt>> call, Response<ArrayList<PollOpt>> response) {
if(!response.isSuccessful()){
Toast.makeText(PollPage.this, "Vote Unsuccessful for vote 2",
Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(PollPage.this, "Vote Successful for vote 2",
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ArrayList<PollOpt>> call, Throwable t) {
Log.d("TAG", "Vote Failure: " + t.getMessage());
Log.d("TAG", "FailureURL rb2: " + call.request().url().toString());
}
});
请求的URL很好,它甚至在onFailure函数中打印该请求,该函数在没有响应的情况下会触发,尽管我不希望响应。
这也是请求也被发送的PHP API代码的一部分 Vote.php :
'
method = $_SERVER['REQUEST_METHOD'];
switch($method){
case "POST":
if(isset($_POST["optText"]) && isset($_POST["pollID"])){
$optText = $_POST["optText"];
$pollID = (int) $_POST["pollID"];
$query = "UPDATE polloption SET frequency = frequency + 1 WHERE pollID = " . $pollID . " AND optText = '". $optText ."'";
$conn = new mysqli($host, $user, $pass, $database);
if ($conn->connect_error)
die($conn->connect_error);
if(mysqli_query($conn, $query)){
echo "Updated Poll Frequency";
} else{
echo "Failed to Update Poll Frequency";
}
}
break;'
我已经使用AJAX脚本测试了PHP代码,发现您可以在AJAX请求响应中看到phps回显数据,而在Android中,当您使用GET以外的方法发送HTTP请求并确定错误而又没有错误时,您基本上处于黑暗中必须使用AJAX请求单独测试每个文件。在使用具有不同参数的AJAX脚本多次测试服务器后,我看不到为什么通过RetroFit发送POST请求时频率值没有更新。
任何对此的建议将不胜感激!
答案 0 :(得分:0)
不要使用 isset($_POST["optText"]) && isset($_POST["pollID"]) 从基于 Json 的 body 请求中获取值,只需使用
$post_body = file_get_contents('php://input');
对于 php