【问题标题】:Why doesn't the function get data from php in android?为什么函数不能从android中的php获取数据?
【发布时间】:2015-11-12 13:56:57
【问题描述】:

我想在发布数据后得到响应,但它失败了。我想创建一个登录系统,我已经成功地将数据提交到 php 文件,现在一切正常我想从相同的函数获得响应,但我无法知道问题出在哪里。

这里是Java函数:

public class PostDataGetRes extends AsyncTask<String, String, String> {

        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... strings) {
            try {


                postRData();


            } catch (NullPointerException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String lenghtOfFile) {
            // do stuff after posting data
        }
    }

    public void postRData() {
        String result = "";
        InputStream isr = null;
        final String email = editEmail.getText().toString();
        final String pass = editPass.getText().toString();
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://website.com/appservice.php");

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("id", email));
            nameValuePairs.add(new BasicNameValuePair("stringdata", pass));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
            resultView.setText("Inserted");
            HttpEntity entity = response.getEntity();
            isr = entity.getContent();

            //convert response to string
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(isr,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                isr.close();

                result=sb.toString();
            }
            catch(Exception e){
                Log.e("log_tag", "Error  converting result "+e.toString());
            }

            //parse json data
            try {
                String s = "";
                JSONArray jArray = new JSONArray(result);

                for(int i=0; i<jArray.length();i++){
                    JSONObject json = jArray.getJSONObject(i);
                    s = s +
                            "Name : "+json.getString("first_name")+"\n\n";

                    //"User ID : "+json.getInt("user_id")+"\n"+
                    //"Name : "+json.getString("first_name")+"\n"+
                    //"Email : "+json.getString("email")+"\n\n";
                }

                resultView.setText(s);

            } catch (Exception e) {
                // TODO: handle exception
                Log.e("log_tag", "Error Parsing Data "+e.toString());
            }


        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
        resultView.setText("Done");
    }

这里是php代码:

if($id){
        $query =  mysql_query("SELECT first_name FROM users where email = '$id' ");
        while($row=mysql_fetch_assoc($query)){
            $selectedData[]=$row;
        }
        print(json_encode($selectedData));
    }

请帮助我到目前为止我已经尝试过但无法取得任何结果。请帮助我如何在查询执行后从 php 文件中获得响应。

【问题讨论】:

  • 究竟有什么问题?您在您的 android 应用程序中看不到响应,或者您的网站没有打印任何内容?并且可以肯定,你说没有抛出异常?
  • @mastah 我想从 php 文件中获取响应...实际上我正在发布具有相同功能的数据并且它工作正常但现在我想在发布数据后得到响应。
  • 其实我想创建登录功能。所以我已经成功地将数据发布到 php 文件,现在我想用相同的功能从那里得到响应......
  • 我们已经知道了。你能从你的网站得到任何回应吗?你开始实现登录功能了吗?
  • 是的,我已经从我的网站上检查了 php 代码是否正常工作,我想在 android 上得到响应

标签: java php android android-activity


【解决方案1】:

首先确保您从您的网站获得正确的 JSON 对象 - 尝试将其打印为 Toast.makeText()。只要网络浏览器保持html cmets 远离,android 就会得到它的响应。

AsyncTask 对象和类不是按照您提供的方式设计的,您也不能在doInBackground() 中进行任何 UI 操作。 AsyncTask 以不阻止 GUI 的方式制作。 这是一个没有太大不同的示例,它如何使用您在 AsyncTask 类中的方法:

class Logging extends AsyncTask<String,String,Void>{
    JSONObject json=null;
    String output="";
    String log=StringCheck.buildSpaces(login.getText().toString());
    String pas=StringCheck.buildSpaces(password.getText().toString());
    String url="http://www.mastah.esy.es/webservice/login.php?login="+log+"&pass="+pas;

    protected void onPreExecute() {
        Toast.makeText(getApplicationContext(), "Operation pending, please wait", Toast.LENGTH_SHORT).show();
     }

    @Override
    protected Void doInBackground(String... params) {
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        request.addHeader("User-Agent", "User-Agent");
        HttpResponse response;
        try {
            response = client.execute(request);
            BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line="";
            StringBuilder result = new StringBuilder();
            while ((line = br.readLine()) != null) {
                result.append(line);
            }
            output=result.toString();
        } catch (ClientProtocolException e) {
            Toast.makeText(getApplicationContext(), "Connection problems", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), "Conversion problems", Toast.LENGTH_LONG).show();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void w) {
        try {
            json = new JSONObject(output);
            if(json.getInt("err")==1){
                Toast.makeText(getApplicationContext(), json.getString("msg"), Toast.LENGTH_LONG).show();
            }else{
                String id_user="-1";
                Toast.makeText(getApplicationContext(), json.getString("msg"), Toast.LENGTH_LONG).show();
                JSONArray arr = json.getJSONArray("data");
                for(int i =0;i<arr.length();i++){
                    JSONObject o = arr.getJSONObject(i);
                    id_user = o.getString("id_user");
                }
                User.getInstance().setName(log);
                User.getInstance().setId(Integer.valueOf(id_user));
                Intent i = new Intent(getApplicationContext(),Discover.class);
                startActivity(i);
            }
        } catch (JSONException e) {
        }
        super.onPostExecute(w);
    }   
}

PHP文件内容:

$data = array(
    'err' => 0,
    'msg' => "",
    'data' => array(),
);

$mysqli = new MySQLi($dbhost,$dbuser,$dbpass,$dbname);
if($mysqli->connect_errno){
    $data['err'] = 1;
    $data['msg'] = "Brak polaczenia z baza";
    exit(json_encode($data));
}

if(isset($_GET['login']) && isset($_GET['pass'])){
    $mysqli->query("SET CHARACTER SET 'utf8';");
    $query = $mysqli->query("SELECT banned.id_user FROM banned JOIN user ON user.id_user = banned.id_user WHERE user.login ='{$_GET['login']}' LIMIT 1;");
    if($query->num_rows){
        $data['err']=1;
        $data['msg']="User banned";
        exit(json_encode($data));
    }else{
        $query = $mysqli->query("SELECT login FROM user WHERE login='{$_GET['login']}' LIMIT 1;");
        if($query->num_rows){
            $query = $mysqli->query("SELECT pass FROM user WHERE pass ='{$_GET['pass']}' LIMIT 1;");
            if($query->num_rows){
                $data['msg']="Logged IN!";
                $query = $mysqli->query("SELECT id_user FROM user WHERE login='{$_GET['login']}' LIMIT 1;");
                $data['data'][]=$query->fetch_assoc();
                exit(json_encode($data));
            }else{
                $data['err']=1;
                $data['msg']="Wrong login credentials.";
                exit(json_encode($data));
            }
        }else{
            $data['err']=1;
            $data['msg']="This login doesn't exist.";
            exit(json_encode($data));
        }
    }
}else{
    $data['err']=1;
    $data['msg']="Wrong login credentials";
    exit(json_encode($data));
}

我已经为我的应用创建了小字典$data。我使用它的err 键作为标志来知道是否出现任何错误,msg 通知用户操作结果和data 发送JSON 对象。

如果 if(response == true) 存在,你想要做的事情类似于我在 AsyncTask 中的 onPostExecute(Void w) 方法中使用的构造:

if(json.getInt("err")==1){
    //something went wrong
}else{
    //everything is okay, get JSON, inform user, start new Activity
}

这也是我使用$data['data'] 获得JSON 响应的方式:

if($query->num_rows){
        while($res=$query->fetch_assoc()){
            $data['data'][]=$res;
        }
        exit(json_encode($data));
}

【讨论】:

  • 如果你需要我可以包含php 我正在访问的文件。
  • 是的,你可以添加 php 文件,你能告诉我我可以在哪里添加 if 语句.. 我的意思是我可以在哪里添加这个if(response == true){startActivity(new Intent(MainActivity.this, DashboardActivity.class));}
  • @AyazShah 如果您仍有问题,请告知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2020-08-27
相关资源
最近更新 更多