更新3
现在一切正常。我使用了this和this,而不是我用于POST的内容。
更新2
我刚刚注意到,如果我按降序排列更新,看起来组织得更好。
我在我的OP(下方)中编辑了我的代码,添加了一些注释,并使用ReadHttpResponse(String url)
中的here
替换了输入流阅读器。这使我将我的PHP脚本分为update.php和get.php而不是updateandget.php。
事实证明,get.php工作正常,在有限的意义上它只是查询数据(不发布任何值)。处理与该URL的连接的update.php或Java代码在某种程度上搞乱了。
至少我发现我没有正确发布。我还更新了OP以显示update.php。
OP
这是运行AsyncTask的doInBackground()的代码
try{
//HttpURLConnection<-url.openConnection()
URL url = new URL(address);
HttpURLConnection conn =(HttpURLConnection) url.openConnection(); //remember to close
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(false);
// Write data to Server
//exctract parameters
String username = (String)arg0[0];
String lastLong = (String)arg0[1];
String lastLat = (String)arg0[2];
//encode parameters
String data = URLEncoder.encode("username", "UTF-8")+ "=" + URLEncoder.encode(username, "UTF-8");
data += "&" + URLEncoder.encode("lastLong", "UTF-8")+ "=" + URLEncoder.encode(lastLong, "UTF-8");
data += "&" + URLEncoder.encode("lastLat", "UTF-8")+ "=" + URLEncoder.encode(lastLat, "UTF-8");
//Build outputstream handler (socket?)
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
//write,flush,close
wr.writeBytes( data );
wr.flush();
wr.close();
// Read Server Response
//BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//StringBuilder sb = new StringBuilder();
//String line = null;
//String returnmessage="";
//while((line = reader.readLine()) != null)
//{
// returnmessage="There is something at least";
// sb.append(line);
// break;
//}
//reader.close();
conn.disconnect();
//return returnmessage;
return ReadHttpResponse("http://www.pixeldonut.com/testing/tutorial/get.php");
}catch(Exception e){
return new String("Exception: " + e.getMessage());
}
阅读没有问题,(或使用ReadHttpResponse)。显然有其他一切问题。
update.php:
<?php //lastknownlocation updateandget
//open con
$con=mysqli_connect("details");
if (mysqli_connect_errno($con))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
die();
}
//=========================================================statistics snippet
if(array_key_exists('REMOTE_ADDR', $_SERVER)){
$ip=$_SERVER['REMOTE_ADDR'];
$address=$_SERVER['SERVER_ADDR'];
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)){
$ip2=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip2="_";
}
$query="INSERT INTO statistics (ip,ip2,address) VALUES (";
$query.="'$ip','$ip2','$address'";
$query.=")";//echo $query;
$db_return=mysql_query($query);
if(!$db_return){
//echo "Your entry was unsuccessfully logged.";
}else{
//echo "Your entry was successfully logged.";
}
}
//==============================================================================
//update-insert
$username = $_POST['username'];
$param1= $_POST['param1'];
$param2= $_POST['param2'];
$query = "UPDATE users SET";
$query .=" param1='$param1'";
$query .=",param2='$param2' ";
$query .="WHERE username='$username'";//echo $query;
$result = mysqli_query($con,$query);
if(!result){
//couldnt find user, aborting
die();
}
//close con
mysqli_close($con);
?>
感谢您的持续支持和热情,Ebichuhamster。
答案 0 :(得分:1)
我看到一些可能是导致问题的原因。或者至少他们值得关注以避免将来出现问题:
<强>爪哇强>
实施看起来很不错。我将添加一些代码来检查您的请求的HTTP状态代码并添加更多代码,以确保即使发生错误也可以关闭连接和流。我建议使用抽象库而不是HttpURLConnection
。如果您选择DavidWebb,您的代码将如下所示,您可以确定所有流都已关闭,正确的标头已设置以及其他一些内容:
String username = "scott";
String lat = "47.49706";
String lng = "12.63244";
Webb webb = Webb.create();
Response<String> response = webb
.post("http://my-server:8888/updateandget.php")
.param("username", username)
.param("param1", lng)
.param("param2", lat)
.readTimeout(10000)
.connectTimeout(15000)
.asString();
if (response.isSuccess()) {
String json = response.getBody();
// go on
} else {
// handle error
if (response.getStatusCode() >= 500) {
// a server error, in case of "503 Service Unavailable" retry later?
}
}
<强> PHP 强>
在日志记录片段中输出echo "Your entry was unsuccessfully logged.";
。这会产生不正确的JSON。因为你只得到<br/>
这不是你现在的问题。
更新语句似乎是正确的,但它可能是一个安全问题,因为它是为SQL注入打开的。
获得结果的陈述可能有两个问题:
"SELECT username,param1,param2FROM table WHERE username!='$username'";
寻找解决方案
我建议你首先尝试检查你的PHP脚本是否已经到达,通过将其更改为绝对没有任何东西,但返回一些静态JSON内容(你知道结构)。如果可行,您可以添加越来越多的语句,看看它是否有效。
答案 1 :(得分:0)
同样有问题,我尝试使用:
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
它有效。以前我只使用OutputStream
,当我的Android应用程序向我的mysql服务器(本地)发送请求时,它给我空$ _POST。