【问题标题】:"Invalid IP address" error caught in android-JSON- MySQL在 android-JSON- MySQL 中发现“无效的 IP 地址”错误
【发布时间】:2015-03-26 17:14:17
【问题描述】:

我正在尝试制作一个连接到 MySQL 数据库并查询数据的应用程序。我不想插入任何数据,只需在给定条目中搜索关键字。我在谷歌上找到了几个教程,这个对我有用。

布局看起来不错,应用启动良好(我在实际的 Nexus 5 上测试了应用)。但是每次单击按钮时,无论文本框中是否有数据,它都会在吐司中显示“无效的IP地址”,我认为这是捕获的错误。我的 PHP 看起来像这样:

$host='*****';
$uname='*****';
$pwd='*****';
$db="*****";
$con = mysql_connect($host,$uname,$pwd) or die("connection failed");
mysql_select_db($db,$con) or die("db selection failed");
$id=$_REQUEST['id'];
$r=mysql_query("select * from ***** where id='$id'",$con);
while($row=mysql_fetch_array($r))
{
$flag[name]=$row[name];
}
print(json_encode($flag));
mysql_close($con);

为什么会出现此错误?我如何让它发挥作用?可以提供所需的任何其他数据。

编辑

安卓代码

public class MainActivity extends Activity {  
    String id;  
    String name;  
    InputStream is=null;  
    String result=null;  
    String line=null;  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        final EditText e_id=(EditText) findViewById(R.id.editText1);  
        Button select=(Button)findViewById(R.id.button1);  
        select.setOnClickListener(new View.OnClickListener() {  
    @Override  
        public void onClick(View v) {  
            // TODO Auto-generated method stub  
            id=e_id.getText().toString();  
            select();  
        }  
    });  
    }  
    public void select()  
    {  
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
    nameValuePairs.add(new BasicNameValuePair("id",id));  
        try  
        {  
        HttpClient httpclient = new DefaultHttpClient();  
            HttpPost httppost = new   HttpPost("http://kanurajb.co.nf/php/search.php");  
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
            HttpResponse response = httpclient.execute(httppost);   
            HttpEntity entity = response.getEntity();  
            is = entity.getContent();  
            Log.e("pass 1", "connection success ");  
    }  
        catch(Exception e) 
    {  
            Log.e("Fail 1", e.toString());  
            Toast.makeText(getApplicationContext(), "Invalid IP Address",  
            Toast.LENGTH_LONG).show();  
    }  
        try
        {  
            BufferedReader reader = new BufferedReader  
                (new InputStreamReader(is,"iso-8859-1"),8);  
                StringBuilder sb = new StringBuilder();  
                while ((line = reader.readLine()) != null)  
        {  
                sb.append(line + "\n");  
            }  
                is.close();  
result = sb.toString();  
            Log.e("pass 2", "connection success ");   
    }  
        catch(Exception e)  
        {  
        Log.e("Fail 2", e.toString());   
    }  
    try  
        {  
            JSONObject json_data = new JSONObject(result);  
            name=(json_data.getString("name"));  
        Toast.makeText(getBaseContext(), "Name : "+name,  
            Toast.LENGTH_SHORT).show();  
        }    
        catch(Exception e)   
        {  
            Log.e("Fail 3", e.toString());    
        }   
    }  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }  
}

【问题讨论】:

  • 请也显示android代码..
  • hmmm,所以你在 android 平台上用 PHP 编码...有趣...
  • 问题出在您的应用程序中。发布你的安卓代码。
  • 我不能在这里发布我的 Java 代码。 这里就是。
  • 又一个 NOMTException .... 不...不是“无效 IP ...”...您只是捕获随机异常并显示无关的 toast catch(Exception e) { Log.e("Fail 1", e.toString()); Toast.makeText(getApplicationContext(), "Invalid IP Address", Toast.LENGTH_LONG).show(); }

标签: php android mysql json


【解决方案1】:

查看答案here..它正确地告诉你如何处理异常。它说..

当应用程序尝试执行 在其主线程上进行网络操作。运行你的代码 AsyncTask:

如下更改您的代码..我已将您的 select() 更改如下..这只是为了让您更好地了解AsyncTask

class RetrieveFeedTask extends AsyncTask<Void, Void, Boolean> {

  private Exception exception;

  protected Boolean doInBackground(String... urls) {
      try {
        Boolean failedflag=false;
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
        nameValuePairs.add(new BasicNameValuePair("id",id));  
        try  
        {  
            HttpClient httpclient = new DefaultHttpClient();  
            HttpPost httppost = new   HttpPost("http://kanurajb.co.nf/php/search.php");  
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
            HttpResponse response = httpclient.execute(httppost);   
            HttpEntity entity = response.getEntity();  
            is = entity.getContent();  
            Log.e("pass 1", "connection success ");  
        }  
        catch(Exception e) 
        {  
            failedflag=true;
            Log.e("Fail 1", e.toString());           
        }  
        try
        {  
            BufferedReader reader = new BufferedReader  
                (new InputStreamReader(is,"iso-8859-1"),8);  
                StringBuilder sb = new StringBuilder();  
                while ((line = reader.readLine()) != null)  
                {  
                    sb.append(line + "\n");  
                }  
                is.close();  
                result = sb.toString();  
                Log.e("pass 2", "connection success ");   
        }  
        catch(Exception e)  
        {  
            failedflag=true;
            Log.e("Fail 2", e.toString());   
        }  
        try  
        {  
            JSONObject json_data = new JSONObject(result);  
            name=(json_data.getString("name"));   
        }    
        catch(Exception e)   
        {  
            failedflag=true;
            Log.e("Fail 3", e.toString());    
        }   
        return failedflag;
  }

  protected void onPostExecute(Boolean flag) { 
      // TODO: do something with the flag
      if(!flag){
          Toast.makeText(getApplicationContext(), "Failed",  
        Toast.LENGTH_LONG).show();
      }
  }
}

如何执行任务:在 MainActivity.java 文件中你可以添加这个 你的 oncreate() 方法中的一行

new RetrieveFeedTask().execute();

别忘了将此添加到AndroidManifest.xml 文件中:

<uses-permission android:name="android.permission.INTERNET"/>

【讨论】:

  • 我对此有点陌生。您能否通过将这个概念适应我的代码来提供更多帮助?提前非常感谢。
  • AsyncTask 的基本工作是凡是必须做的事情,都应该在doInBackground() 中完成,执行完操作后得到的结果将传递给onPostExecute().和@ 987654331@ 您将能够根据doInBackground() 返回的结果更改 UI。请注意,如果您尝试更改 doInBackground() 中的 UI,包括显示 Toast,则会出现错误。因此,所有 Toast 应仅显示在`onPostExecute()`中。
  • 对不起,这对初学者来说有点难以理解。能否请您给我一些我可以复制粘贴并理解的带有 cmets 的代码?
  • 网络操作必须在 AsyncTask 中执行,但只是为了让您抑制错误添加 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy); after`setContentView()` 并且错误将被抑制..但这根本不推荐.
  • 不不,你不能给我完整的代码吗?在这个阶段,我很难将方法和函数拼凑成完整的代码。
猜你喜欢
  • 2014-11-15
  • 2012-06-05
  • 2013-12-22
  • 2014-08-15
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多