Оператор SELECT, вызванный из асинктической задачи HTTP post, терпит неудачу ТОЛЬКО на устройстве galaxy s4

0

На этот раз у меня действительно странная ситуация:
У меня есть asynctask, которая запрашивает php-страницу для получения некоторой информации. Все работает нормально, пока я не попробую одно и то же приложение на Samsung Galaxy s4. На каждом другом устройстве работает запрос. Только на s4 на странице php возвращается "запрос на выбор пользователей" (это мое собственное сообщение об ошибке, когда оператор 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","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();
                }
            }
        }
    }
}

и это страница php, которая получает значения как POST из асинтезы:

<?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 - #

?>

Надеюсь, что теперь это яснее. Пожалуйста, помогите.

Теги:
select
galaxy

1 ответ

0
Лучший ответ

Хорошо, наконец, я получил вопрос:

я не знаю почему, но здесь:

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; }
}

кажется, что значение "день", пройденное галактикой samsung s4, заботится о заглавных буквах, а значение "день", переданное другими устройствами, отсутствует. Поскольку я использую первые буквы дня в функции "getDay()", он работает на галактике s4 и не работает на других устройствах.

Итак, чтобы решить проблему, я назначил каждое строковое значение, исходящее из запроса HTTP POST следующим образом:

$_day = strtolower($_POST["day"]);

и теперь он работает на каждом устройстве.

Спасибо всем за помощь, особенно @MarcB с этим комментарием:

у вас, вероятно, есть базовый if (не удалось) {что-то взорвалось} вместо if (failed) {output actual DB error message} Обработка ошибок -type

как после того, как я изменил это:

$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() вместо оператора ==. Вы уверены, что у вас нет чего-то вроде "thursday\n"? Добавьте echo() и return to getDay(), если ни одна из них не выполняется. Добавьте код, чтобы обработать возвращаемый нуль соответствующим образом. -

Ещё вопросы

Сообщество Overcoder
Наверх
Меню