¿Por qué la función no obtiene datos de php en android?
Quiero obtener respuesta después de los datos de post, pero falla. Quiero crear un sistema de inicio de sesión, he enviado con éxito los datos al archivo php, todo está funcionando bien ahora Quiero obtener la respuesta de la misma función, pero soy incapaz de saber dónde está el problema.
Aquí está la función de Java:
- Utilizando GCM para enviar notificaciones en la aplicación, devuelve InvalidRegistration error
- Extraer datos de la clave pública de RSA
- Detectar si la aplicación de Android se ha instalado en el dispositivo mediante una página web móvil: PHP y JS
- Cómo leer datos fragmentados de archivo de archivo Gap de teléfono en Android
- ¿Cómo guarda de forma segura una orden en la nube, si no puede verificar el pago desde la nube?
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"); }
Y aquí está el código 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)); }
Por favor, ayúdame He intentado hasta ahora, pero no pude lograr ningún resultado. Por favor, ayúdame cómo puedo obtener respuesta de archivo php después de la ejecución de la consulta.
- Servidor ByetHost que pasa valores html "Comprobación de su navegador" con JSON String
- Android JSON HttpClient para enviar datos al servidor PHP con HttpResponse
- Subir una imagen de Android a la base de datos MySQL
- SyncML con Android y servicio Web de PHP
- Subir varios archivos de imagen al servidor php desde la aplicación android
- Interacción con Android App con Laravel Action methods
- Problema problemático para la integración de FaceBook
- Httpclient desaconsejado
Al principio asegúrese de obtener el objeto JSON
correcto de su sitio web – intente imprimirlo como Toast.makeText()
. En cuanto a los navegadores web mantener los comentarios html
distancia, android se obtiene en respuesta.
AsyncTask
objetos y clases de AsyncTask
no están diseñados para que se hagan de la forma en que se proporcionan y tampoco se pueden realizar operaciones de interfaz de usuario en doInBackground()
. AsyncTask
se hace de una manera de no bloquear GUI. Este es un ejemplo no muy diferente de cómo utiliza métodos que tiene en la clase 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); } }
Contenido del archivo 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)); }
He creado allí pequeño diccionario $data
para mi aplicación. Utilicé su llave del err
como bandera para saber si cualquier error apareció, msg
para informar al usuario sobre los resultados de la operación y los data
para enviar los objetos de JSON
.
La cosa que usted quisiera hacer con if(response == true)
si había existido es similar a la construcción que utilicé en mi onPostExecute(Void w)
método en AsyncTask
:
if(json.getInt("err")==1){ //something went wrong }else{ //everything is okay, get JSON, inform user, start new Activity }
También aquí es la forma en que usé $data['data']
para obtener la respuesta de JSON
:
if($query->num_rows){ while($res=$query->fetch_assoc()){ $data['data'][]=$res; } exit(json_encode($data)); }
- Android.view.InflateException: Línea # 1 del archivo XML binario: Error al inflar la clase <unknown>
- Google Analytics para Android v2 Seguimiento de campaña no funciona