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

Php 从HTTP post asynctask调用的SELECT语句仅在galaxy s4设备上失败,php,android,select,galaxy,Php,Android,Select,Galaxy,这次我遇到了一个非常奇怪的情况: 我有一个asynctask,它查询php页面以检索一些信息。在我在三星Galaxy s4上尝试相同的应用程序之前,一切都很正常。在其他每一台设备上,查询都有效。只有在s4上,php页面才会返回“select users query failed”(select语句失败时,这是我自己的自定义错误消息)。有人有什么建议吗 我确信从设备发送的值是正确的,因为我可以在发送之前将它们注销 我确信这些值会出现在php页面上,因为我可以在php页面上转储它们 但是SELE

这次我遇到了一个非常奇怪的情况:
我有一个asynctask,它查询php页面以检索一些信息。在我在三星Galaxy s4上尝试相同的应用程序之前,一切都很正常。在其他每一台设备上,查询都有效。只有在s4上,php页面才会返回“select users query failed”(select语句失败时,这是我自己的自定义错误消息)。有人有什么建议吗

  • 我确信从设备发送的值是正确的,因为我可以在发送之前将它们注销
  • 我确信这些值会出现在php页面上,因为我可以在php页面上转储它们
但是SELECT语句仍然仅在s4中失败。从另一个设备调用的值完全相同的语句也可以工作

疯狂的事情

下面是调用php页面的asynctask:

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","answer 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();
                }
            }
        }
    }
}
私有类AsyTask扩展了AsyncTask{
HttpResponse响应;
http实体;
流内输入流;
受保护的void onPreExecute(){
pb.setVisibility(View.VISIBLE);
}
@凌驾
受保护的JSONObject doInBackground(ArrayList…arg0){
通过的ArrayList=arg0[0];
HttpClient cli_req=new DefaultHttpClient();
HttpPost cli_post=newhttppost(Checkup.getDB_LINK()+“cal_geteventlist.php”);
试一试{
ArrayList nameValuePairs=新的ArrayList(4);
添加(新的BasicNameValuePair(“邮件”,passed.get(0));
添加(新的BasicNameValuePair(“dayevent”,passed.get(1));
添加(新的BasicNameValuePair(“day”,passed.get(2));
添加(新的BasicNameValuePair(“时间”,passed.get(3));
Log.d(“发送值”,“邮件:+已传递.获取(0));
Log.d(“发送值”,“dayevent:”+已通过.get(1));
Log.d(“发送值”,“日期:”+passed.get(2));
Log.d(“发送值”,“时间:”+通过.get(3));
cli_post.setEntity(新的UrlEncodedFormEntity(nameValuePairs,“UTF-8”);
response=cli_req.execute(cli_post);//来自PHP文件的响应
if(response.getStatusLine().getStatusCode()==200){
Log.d(“异步任务”、“应答就绪”);
entity=response.getEntity();
如果(实体!=null){
instream=entity.getContent();
JSONObject jsonResponse=新的JSONObject(Checkup.convertStreamToString(instream));
返回jsonResponse;
}否则{
返回null;
}
}
}捕获(例外e){
返回null;
}
返回null;
}
@凌驾
public void onPostExecute(JSONObject结果){
如果(结果!=null){
如果(result.has(“result”)){
试一试{
if(result.getString(“result”).matches(“success”)){
ArrayList tList=新的ArrayList();
JSONArray jArr=result.getJSONArray(“dayevents”);
int c=0;
而(c
这是从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传递的“日”值似乎与大写字母有关,而其他设备传递的“日”值则与大写字母无关。当我将函数“getDay()”中日期名称的第一个字母大写时,它在galaxy s4上工作,在其他设备上不工作

因此,为了解决这个问题,我将来自HTTP POST请求的每个字符串值分配如下:

$_day = strtolower($_POST["day"]);
现在它可以在所有设备上工作

谢谢大家的帮助, 特别是对@MarcB的评论:

您可能有一个基本的if(failed){something blow up},而不是
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()而不是==运算符。您确定没有类似“星期四”的内容吗?添加一个echo()和一个getDay()返回,如果if中没有一个保持不变。添加代码以适当地处理返回的null


您没有显示任何代码,只提供了模糊的症状。所以我们帮不了你。但是,如果你的DB代码与这里的普通海报的质量相匹配,你可能会有一个基本的
if(failed){something blow-up}
而不是'if(failed){output actual DB error message}类型的错误处理。真的很抱歉,我会编辑它,让它更清楚…我hope@MarcB我需要使用函数exer()吗在我的php脚本中,如下所示:exer(mysqli_error($conn));要知道你在说什么错误?我看到很多三星手机的问题。我敢打赌fn设备上有一个jar文件,它与应用程序中的jar文件同名。如果你能告诉我们“什么东西爆炸了”的消息是在哪里生成的,以及你正在使用的罐子@MarcB这里也没有人记录这些错误。“沙鼠太累了,无法旋转轮子消息”是处理发送给公众的错误消息的首选安全方法,因为它不会揭示应用程序上的特定缺陷