Android Studio Java操作MySQL查询时函数返回Null问题求助
问题原因与修复方案
1. 核心问题:SQL语句拼接语法错误
你拼接SQL的时候没有加必要的空格,最终生成的SQL语句是非法的,MySQL执行报错,接口返回非JSON结果,触发异常后直接返回了初始的"Null"值:
原拼接逻辑生成的错误SQL示例:
SELECT ... FROM PRIVEWHERE specialite LIKE ...OR nom LIKE ...OR adresse LIKE ...
PRIVE和WHERE直接连在一起、各OR条件前没有空格,完全不符合SQL语法规范。
2. 第二个触发异常的问题:SELECT字段缺失
你查询语句中只选择了8个字段:longitude,latitude, mobile, horaire,email,adresse,jours, type,但后续JSON解析时要读取specialite、nom两个未查询的字段,会直接抛出JSONException,导致逻辑中断返回初始值。
3. 额外隐患:SQL注入风险
直接在客户端拼接SQL语句并传输到服务端执行,存在严重的SQL注入漏洞,建议改为客户端仅传搜索关键词spec,SQL语句写在PHP服务端,并用参数绑定处理查询条件。
修复后的核心代码
仅修改SQL拼接部分即可解决返回Null的问题:
RequestBody formBody = new FormBody.Builder() .add("msg", "SELECT longitude,latitude, mobile, horaire,email,adresse,jours, type, specialite, nom "+ " FROM PRIVE "+ " WHERE specialite LIKE '%"+spec+"%' "+ " OR nom LIKE '%"+ spec +"%' "+ " OR adresse LIKE '%"+ spec +"%'") .build();
另外注意LatLng构造参数顺序错误,就算拿到数据标记位置也会偏移,正确写法应为:
// LatLng第一个参数是纬度latitude,第二个是经度longitude LatLng mihoubi = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));
排查建议
你可以在catch块中增加日志打印,输出异常信息和接口返回的原始内容,可快速定位后续可能出现的问题:
catch (IOException | JSONException e) { e.printStackTrace(); // 打印接口返回的原始内容 if (response[0] != null && response[0].body() != null) { try { Log.d("RAW_RESPONSE", response[0].body().string()); } catch (IOException ex) { ex.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Manel
相关产品推荐
相关产品推荐

