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页面上转储它们
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这里也没有人记录这些错误。“沙鼠太累了,无法旋转轮子消息”是处理发送给公众的错误消息的首选安全方法,因为它不会揭示应用程序上的特定缺陷