从HTTP post-asynctask调用的SELECT语句仅在galaxy s4设备上失败


SELECT statement called from HTTP post asynctask fails ONLY on galaxy s4 device

这次我遇到了一个非常奇怪的情况:
我有一个异步任务,它查询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。–