这次我遇到了一个非常奇怪的情况:
我有一个异步任务,它查询php页面以检索一些信息。一切都很好,直到我在三星Galaxy s4上尝试了同样的应用程序。在其他所有设备上,查询都有效。只有在s4上,php页面才会返回"select users query failed"(当select语句失败时,这是我自己的自定义错误消息)。有人有什么建议吗?
- 我确信从设备发送的值是正确的,因为我可以在发送之前注销它们
- 我确信值会到达php页面,因为我可以将它们转储到php页面上
但是SELECT语句仍然仅在s4时失败。从另一个设备调用的具有完全相同值的完全相同的语句可以工作。
疯狂的事情。。。。
下面是调用php页面的异步任务:
private class AsyTask extends AsyncTask<ArrayList<String>, Void, JSONObject> {
HttpResponse response;
HttpEntity entity;
InputStream instream;
protected void onPreExecute() {
pb.setVisibility(View.VISIBLE);
}
@Override
protected JSONObject doInBackground(ArrayList<String>... arg0) {
ArrayList<String> passed = arg0[0];
HttpClient cli_req = new DefaultHttpClient();
HttpPost cli_post = new HttpPost(Checkup.getDB_LINK()+"cal_geteventlist.php");
try {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("mail", passed.get(0)));
nameValuePairs.add(new BasicNameValuePair("dayevent", passed.get(1)));
nameValuePairs.add(new BasicNameValuePair("day", passed.get(2)));
nameValuePairs.add(new BasicNameValuePair("time", passed.get(3)));
Log.d("Sending value","Mail: "+passed.get(0));
Log.d("Sending value","dayevent: "+passed.get(1));
Log.d("Sending value","day: "+passed.get(2));
Log.d("Sending value","time: "+passed.get(3));
cli_post.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
response = cli_req.execute(cli_post); //response from the PHP file
if(response.getStatusLine().getStatusCode() == 200){
Log.d("Async Task","answerswer ready");
entity = response.getEntity();
if(entity != null){
instream = entity.getContent();
JSONObject jsonResponse = new JSONObject(Checkup.convertStreamToString(instream));
return jsonResponse;
} else {
return null;
}
}
} catch(Exception e){
return null;
}
return null;
}
@Override
public void onPostExecute(JSONObject result) {
if (result != null) {
if (result.has("result")) {
try {
if (result.getString("result").matches("success")) {
ArrayList<DayEvents> tList = new ArrayList<DayEvents>();
JSONArray jArr = result.getJSONArray("dayevents");
int c = 0;
while (c < jArr.length()) {
JSONObject tmp = jArr.getJSONObject(c);
tList.add(new DayEvents(tmp.getString("nick"),tmp.getString("email"),tmp.getString("idpos"),tmp.getString("eventtype"),tmp.getString("year"),null));
c++;
}
setList(tList);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
这是从asynctask:接收POST值的php页面
<?php
include 'cal_config.php';
$_mail = $_POST["mail"];
$_dayevent = $_POST["dayevent"];
$_day = $_POST["day"];
$_time = $_POST["time"];
$conn = mysqli_connect($_dbIp,$_dbUte,$_dbPass,$_dbDbase) or die("Connection failed");
$qCoordEvent = "SELECT X(coords),Y(coords) FROM event_ute WHERE dayeventute='".$_dayevent."'";
$rCoordEvent = mysqli_query($conn,$qCoordEvent) or die(exErr("Getting dayevent coords failed"));
$wCoords = mysqli_fetch_row($rCoordEvent);
$lat_event = $wCoords[0];
$lon_event = $wCoords[1];
$qLocalize = "SELECT *, ( 6371 * acos( cos( radians(loc_lat) ) * cos( radians(" . $lat_event . ") ) * cos( radians(" . $lon_event . ") - radians(loc_long) ) + sin( radians(loc_lat) ) * sin( radians(" . $lat_event . ") ) ) ) AS distance FROM ANA_EVENT HAVING distance < loc_range ORDER BY distance";
$rLocalize = mysqli_query($conn,$qLocalize) or die(exErr("Getting localized event by coords failed"));
$count = mysqli_num_rows($rLocalize);
$c = 0;
while ($tmp = mysqli_fetch_assoc($rLocalize)) {
if ($c == ($count-1)) { $ifv = "'"; }
else { $ifv = "', "; }
$locString .= "'".$tmp["email"].$ifv;
$c++;
}
$selDay = getDay($_day);
$qFinal = "SELECT idpos,email,nick,eventtype,year FROM ANA_EVENT WHERE email IN (".$locString.") AND ((".$selDay[0]."='1' AND MAKETIME(".getTime($_orario).") BETWEEN ".$selDay[1]." AND ".$selDay[2].") OR (disp_tut='1' AND MAKETIME(".getTime($_orario).") BETWEEN disp_tut_from AND disp_tut_to) OR (".$selDay[0]."='1' AND ".$selDay[1]."=".$selDay[2].") OR (disp_tut='1' AND disp_tut_from=disp_tut_to)) ORDER BY year";
$rFinal = mysqli_query($conn,$qFinal) or die(exErr("Final selection query failed")); //this is where ONLY galaxy s4 fails!
$i = 0;
while ($res = mysqli_fetch_assoc($rFinal)) {
if ($res["email"] == $_mail) { continue; }
$dati[$i] = $res;
$i++;
}
$resultArray["result"] = "success";
$resultArray["dayevents"] = $dati;
echo json_encode($resultArray);
//# - FUNCTION SECTION - #
function getDay($g) {
if ($g == "monday") { $a[0] = "disp_mon"; $a[1] = "disp_mon_from"; $a[2] = "disp_mon_to"; return $a; }
if ($g == "tuesday") { $a[0] = "disp_tue"; $a[1] = "disp_tue_from"; $a[2] = "disp_tue_to"; return $a; }
if ($g == "wednesday") { $a[0] = "disp_wed"; $a[1] = "disp_wed_from"; $a[2] = "disp_wed_to"; return $a; }
if ($g == "thursday") { $a[0] = "disp_thu"; $a[1] = "disp_thu_from"; $a[2] = "disp_thu_to"; return $a; }
if ($g == "friday") { $a[0] = "disp_fri"; $a[1] = "disp_fri_from"; $a[2] = "disp_fri_to"; return $a; }
if ($g == "saturday") { $a[0] = "disp_sat"; $a[1] = "disp_sat_from"; $a[2] = "disp_sat_to"; return $a; }
if ($g == "sunday") { $a[0] = "disp_sun"; $a[1] = "disp_sun_from"; $a[2] = "disp_sun_to"; return $a; }
}
function getTime($t) {
$exploded = explode(":",$t);
return $exploded[0].",".$exploded[1].", 00";
}
function exErr($errMsg) {
$resultArray["result"] = "failed";
$resultArray["errmsg"] = $errMsg;
echo json_encode($resultArray);
exit;
}
//# - FUNCTION SECTION END - #
?>
我希望现在情况更清楚了。请帮忙。
好的,我终于得到了问题:
我不知道为什么,但在这里:
function getDay($g) {
if ($g == "monday") { $a[0] = "disp_mon"; $a[1] = "disp_mon_from"; $a[2] = "disp_mon_to"; return $a; }
if ($g == "tuesday") { $a[0] = "disp_tue"; $a[1] = "disp_tue_from"; $a[2] = "disp_tue_to"; return $a; }
if ($g == "wednesday") { $a[0] = "disp_wed"; $a[1] = "disp_wed_from"; $a[2] = "disp_wed_to"; return $a; }
if ($g == "thursday") { $a[0] = "disp_thu"; $a[1] = "disp_thu_from"; $a[2] = "disp_thu_to"; return $a; }
if ($g == "friday") { $a[0] = "disp_fri"; $a[1] = "disp_fri_from"; $a[2] = "disp_fri_to"; return $a; }
if ($g == "saturday") { $a[0] = "disp_sat"; $a[1] = "disp_sat_from"; $a[2] = "disp_sat_to"; return $a; }
if ($g == "sunday") { $a[0] = "disp_sun"; $a[1] = "disp_sun_from"; $a[2] = "disp_sun_to"; return $a; }
}
三星galaxy s4传递的值"day"似乎关心大写字母,而其他设备传递的值则不关心。当我在函数"getDay()"中将日期名称的第一个字母大写时,它在galaxy s4上有效,在其他设备上不起作用。
因此,为了解决这个问题,我分配了来自HTTPPOST请求的每个字符串值,如下所示:
$_day = strtolower($_POST["day"]);
现在它适用于所有设备。
感谢大家的帮助,特别是对@MarcB的评论:
你可能有一个基本的if(failed){somethingblowd},而不是
if (failed) {output actual DB error message}
类型的错误处理
在我更改后:
$rCoordEvent = mysqli_query($conn,$qCoordEvent) or die(exErr("Final selection query failed"));
这个:
$rCoordEvent = mysqli_query($conn,$qCoordEvent) or die(exErr(mysqli_error($conn)));
并且最终得到了来自SELECT查询的真实错误消息。
我也想引用@greenapps,因为我认为这是一个很好的观点:
请尝试使用strcmp()而不是==运算符。你确定你没有"星期四"之类的东西吗?如果if都不成立,则添加一个echo()和一个return到getDay()。添加代码以适当地处理返回的null。–