【问题标题】:App doesn't filter correctly echo's from server应用程序无法正确过滤来自服务器的回声
【发布时间】:2015-08-11 16:36:30
【问题描述】:

我创建了一个从服务器发送和读取数据的应用程序。它应该对收到的响应做出反应(来自服务器的响应正常工作)。问题是我检查的 if 语句中的代码从未执行过,应用程序总是执行 else 块中的代码。我的 PHP 代码是:

<?php  
 require "init.php";  
  $user_name = $_POST["user_name"];    
 $user_pass = $_POST["user_pass"]; 
  $user_name = utf8_encode($user_name);
   $user_pass = utf8_encode($user_pass);
   $sql_query = "SELECT user_name FROM user_info WHERE user_name ='".$user_name."'     AND user_pass = '".$user_pass."' ;";  

 $result = mysqli_query($con, $sql_query);

 if(mysqli_num_rows($result) == 1){

  echo "Login Success..Welcome "; 

 }else{
 echo"null";

  }
 mysqli_close($con); 
  ?>  

这是我的 AsyncTask 类:

public class SendLogData extends AsyncTask <String, Void, String>{


String serverURL = "http://192.168.1.105/myapp/login.php";
Intent startapp ;
private Context mcontext;
private String response;
private String error = null;
ProgressDialog alertDialog;


public SendLogData(Context context, Intent intent) {
startapp = intent;
 mcontext = context;
}

 @Override
 protected void onPreExecute() {

alertDialog = new ProgressDialog(mcontext);
 alertDialog.setMessage("Connecting to server");
}

  @Override
 protected  String doInBackground(String... params) {
 String username = params[0];
 String password = params[1];

try {
URL url = new URL(serverURL);
HttpURLConnection client = (HttpURLConnection) url.openConnection();
client.setRequestMethod("POST");
client.setDoOutput(true);
client.setDoInput(true);
OutputStream outputStream = client.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String data = URLEncoder.encode("user_name", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8") + "&" +
        URLEncoder.encode("user_pass", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8");
bufferedWriter.write(data);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = client.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
String line = "";
while ((line = bufferedReader.readLine())!=null)
{
    response = "";
    response+= line;
}
bufferedReader.close();
inputStream.close();
client.disconnect();
return response;

} catch (IOException e) {
error = e.getMessage();
}

 return null;
}

 @Override
 protected void onPostExecute(String result) {

 if (result.equals("null")){// This is were, the appp never actives the if, and goes right to the else
Toast.makeText(mcontext, "You dont have a account with us.", Toast.LENGTH_LONG).show(); 
}else{
alertDialog.setMessage(result);
alertDialog.show();
mcontext.startActivity(startapp);
 }

  }
}

注意:由于我没有从应用程序中收到任何错误,因此我无法调试它,并且 logcat 没有显示任何相关内容。

【问题讨论】:

  • 看看以“while ((line = bufferedReader.readLine())!=null)”开头的块——你真的想从缓冲阅读器中取出最后一行吗?
  • 是的,我只想要服务器检索到的回声,我不需要阅读其他任何内容。唯一的问题是,如果我从服务器收到“null”,应用程序无法处理它,并直接进入 else 块。
  • 您能否将 Toast 中的“结果”显示为“onPostExecute()”中的第一条语句?顺便说一句,您可以通过编写自己的日志条目来使用内联调试 --> android.util.Log
  • "result" 显示在 doInBackground 中返回的字符串 "response"。因此,如果服务器返回“Login Success..Welcome”,它将显示该文本,并且与 php 的 else 中的 echo 相同。
  • 请原谅我的坚持:“将/应该显示”或“确实显示”?毕竟,我们谈论的是理解意外行为。那么“null”在哪里丢失了呢?

标签: java php android


【解决方案1】:

试试这样的:

try {
    Charset myCharset = Charset.forName("iso-8859-1");
    // and I really hope the name is correct - maybe "ISO-8859-1"
    BufferedReader bufferedReader = new BufferedReader(new 
           InputStreamReader(inputStream, myCharset.newDecoder()));

 // .. process your input here ...
 }
catch(Exception ex)
{
    Log.e("DECODER", ex.getMessage() );
}

【讨论】:

  • 也没有工作。我还尝试使用“Toast.makeText(mcontext, result.length(), Toast.LENGTH_LONG).show();”获得“结果”的长度但它每次都崩溃,也许我收到了一个 int,但系统像字符串一样处理它。
  • @Droid - 将第二个参数设为字符串(如果这是导致崩溃的原因):Toast.makeText(mcontext, " " + result.length(), Toast.LENGTH_LONG).show( );
  • 所以...我真的很抱歉,但我无法重现您的问题,而且我的想法已经不多了。如果你不介意我现在就放弃。但我会支持你的问题,也许其他人会感兴趣并可以帮助你。
  • 好吧,总之,它让我回溯 9,而 echo 中的单词是“perro”,只有 5 个字母,有没有知道什么在回溯我?
  • 空格之类的东西呢?回车,换行等?试试'result.trim();'
【解决方案2】:

感谢@0X0nosugar,我找到了答案,他帮助了我很多。问题是,服务器正在检索的数据带有 4 个空格,所以当我在应用程序中接收具有 4 个字符的“null”时,应用程序正在读取 8 个字符。因此,只需修剪数据,它将 8 字符字符串转换为 4 字符字符串:

if (result.trim().equals("null")){
 Toast.makeText(mcontext, "You dont have a account with us.", Toast.LENGTH_LONG).show(); 
}else{
alertDialog.setMessage(result);
alertDialog.show();
mcontext.startActivity(startapp);
}

不知道用空格填充数据的问题究竟是PHP还是Android的问题,但至少trim()有助于修复它。

【讨论】:

  • 对不起,我突然下线了 - 来自现实生活的电话 ;-) 无论如何,我认为我们都“大胆地去了我们以前没有去过的地方”,因为我知道 PHP 只是因为我读了一本书并且没有任何实验室外的机器人与网络服务器交谈的经验。您的想法是检查字符串长度,这让我想到了空格。所以我们是一个很好的团队!如果有人对您的问题有很好的解释,您可以等待一段时间,如果没有,那么 IMO 您可以让您的答案成为公认的答案。编码愉快!
  • 还是非常感谢,我们在这里见,希望我们有时间可以合作:) 哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
相关资源
最近更新 更多