Envoi de données de Android studio à php

Fermé
Bill - Modifié le 29 mai 2017 à 11:43
palcabodi Messages postés 20 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 15 juillet 2017 - 15 juil. 2017 à 17:35
Salut à tous,

Bon l'intitulé n'est pas très clair je l'accorde. J'espère que la suite le sera plus (les codes ne s'affichent pas correctement, si quelqu'un sait comment je peux faire...):
Je fais une application qui nécessite d'envoyer des données à ma BDD à laquelle j'accède grâce au localhost/phpmyadmin.
J'ai donc créé un code en php qui permet de se connecter à la BDD, et un autre qui permet de lui envoyer des données. Ces codes marchent (testés avec ARC de Google pour ceux qui connaissent).

Côté Android Studio, les données sont censées être envoyées en cliquant sur un bouton qui passe d'une activité à une autre. J'ai créé pour cela une classe "AddDataAsyncTask" qui extends "AsyncTask". C'est à priori la partie "doInBackground" qui nous concerne. Je l'ai récupérée sur un tuto parce que sans Apache (qui a été supprimé sur les dernières versions), je ne trouvais pas comment faire. Je vous met ça en-dessous :

protected Void doInBackground(Void... params) {
   Map<String,String> dataToSend = new HashMap<>();
   dataToSend.put("id",hisid);
   dataToSend.put("name", hisname);
   dataToSend.put("age", hisage);
   dataToSend.put("job", hisjob);
   dataToSend.put("gender", hisgender);
   dataToSend.put("date_trip", hisdate);
   dataToSend.put("mode_trip", hismode);
   dataToSend.put("time_trip", histime);
   dataToSend.put("crowded_trip", hiscrowded);
   dataToSend.put("from_trip", hisfrom);
   dataToSend.put("to_trip", histo);
   dataToSend.put("majo_gender",hismajogender);
   dataToSend.put("majo_origin",hismajoorigin);

  String encodedStr = getEncodedData(dataToSend);

   BufferedReader reader = null;

   try {
      URL url = new URL(urlAdd);
      HttpURLConnection con = (HttpURLConnection) url.openConnection();
      con.setRequestMethod("POST");
      con.setDoOutput(true);
      OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
      writer.write(encodedStr);
   }
   catch (Exception e) {
      e.printStackTrace();
   }
   finally {
      if(reader != null) {
         try {
            reader.close();
         } 
         catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
   return null;
}



Il semblerait que ce soit mon getEncodedData qui ne fonctionne pas... J'ai testé plein de trucs, certains crashent l'appli quand je clique sur le fameux bouton, d'autres ne perturbent pas le fonctionnement de l'appli mais ne modifient pas la base de données. Ca ressemble globalement à ça:

private String getEncodedData(Map<String,String> data) {
   StringBuilder sb = new StringBuilder();
   for(String key : data.keySet()) {
      String value = null;
      try {
         value = URLEncoder.encode(data.get(key),"UTF-8");
      } 
      catch (UnsupportedEncodingException e) {
         e.printStackTrace();
      }
      if(sb.length()>0){
         sb.append("&");
      }

      sb.append(key + "=" + value);
   }

   return sb.toString();
}



Franchement je ne sais pas quoi vous dire de plus, j'ai testé plein de trucs, que ce soit de mon imagination ou trouvés sur des forums, mais rien n'y fait, ma base de données est toujours vide. Donc si quelqu'un a déjà fait un truc du genre et est prêt à m'aider ce serait super! N'hésitez pas à me poser des questions quelles qu'elles soient!

Merci,

Jérémy

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.


A voir également:

5 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
29 mai 2017 à 11:46
Hello,

ma base de données est toujours vide.
Côté serveur, tu reçois les données? As-tu regardé dans la console de Studio si tu as une erreur? As-tu essayé en pas-à-pas?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
29 mai 2017 à 19:04
Salut Bill,

BunoCS a raison, j'ajouterai que pour déboguer côté serveur, tu devrais consulter les logs du serveur http.

Sinon, dans les "trainings" de Google, pour gérer les connexions, Google propose d'utiliser Volley, la bibliothèque http de Google.

https://developer.android.com/training/volley/index.html

Ces exemples sont simplifiés avec des requêtes GET ou JSON, mais tu peux aussi faire du POST, avec un StringRequest et les arguments à encoder dans un HashMap, comme là :

http://androidtechpoint.blogspot.com/2017/02/sending-post-request-over-internet-using-android-volley.html

Sur ce site, il y a aussi du code Php d'exemple pour récupérer le contenu POSTé

(non testé)

Dal
0
Désolé mes connaissances en informatique sont limitées et c'est ma première application :/
Que sont les logs du serveur http et comment puis-je les consulter?
Je teste les liens que tu m'as donné, merci beaucoup!
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
30 mai 2017 à 17:36
Les "logs du serveur http" sont les journaux produits par le serveur Web, la façon de les trouver dépend du serveur utilisé (Apache, Nginx, IIS,...), du système d'exploitation sur lesquels ils tournent, et de leur configuration.

Par exemple, sur un système Debian Linux faisant fonctionner Apache 2, les logs sont habituellement dans
/var/log/apache2/
, regarder
access.log
et
error.log
, qui sont les journaux de connexions et d'erreurs.

Si tu n'as pas un hébergement dédié, ton hébergeur peut éventuellement te mettre à disposition ces logs sur ton interface d'administration.

Dal
0
D'accord merci pour les explications... J'ai relancé et dans la partie
access.log
j'ai simplement ceci:

::1 - - [30/May/2017:11:43:05 -0400] "GET /phpmyadmin/sql.php?server=1&db=diversitynyc&table=initial&pos=0&token=6550f4cac3efda39a34cc11fdf5006d8 HTTP/1.1" 200 14583 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

::1 - - [30/May/2017:11:43:12 -0400] "GET /phpmyadmin/js/whitelist.php?lang=fr&db=diversitynyc&token=97eab64c1b4158626d427cf0d2180204&v=4.6.5.2 HTTP/1.1" 200 475 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

::1 - - [30/May/2017:11:43:12 -0400] "GET /phpmyadmin/js/messages.php?lang=fr&db=diversitynyc&token=97eab64c1b4158626d427cf0d2180204&v=4.6.5.2 HTTP/1.1" 200 9621 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

::1 - - [30/May/2017:11:43:13 -0400] "POST /phpmyadmin/navigation.php?ajax_request=1&token=97eab64c1b4158626d427cf0d2180204 HTTP/1.1" 200 2233 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

::1 - - [30/May/2017:11:43:13 -0400] "GET /phpmyadmin/index.php?ajax_request=1&recent_table=1&token=97eab64c1b4158626d427cf0d2180204&no_debug=true&_nocache=1496158993442841613 HTTP/1.1" 200 1454 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

::1 - - [30/May/2017:11:43:13 -0400] "GET /phpmyadmin/navigation.php?ajax_request=1&token=97eab64c1b4158626d427cf0d2180204&aPath=cm9vdA%3D%3D.ZGl2ZXJzaXR5bnlj&vPath=cm9vdA%3D%3D.ZGl2ZXJzaXR5bnlj&pos=0&pos2_name=&pos2_value=&searchClause=&searchClause2=&_nocache=1496158993671505691 HTTP/1.1" 200 1852 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"


Rien dans la partie
error.log
. Cela ne veut pas vraiment dire qu'il n'y a aucune erreur, mais en tout cas pas au niveau du serveur à priori.

En utilisant Volley, ça ne marche pas non plus :/

PS: j'ai essayé ces mêmes codes sur un autre PC (pas encore avec Volley par contre) et j'ai les mêmes problèmes. Je commence à désespérer un peu là ^^
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
30 mai 2017 à 18:32
Les connexions concernent toutes des requêtes à des scripts Php sous /phpmyadmin, il semble donc que rien n'arrive sur ton serveur Web.

Tu parles de test "sur un autre PC", j'imagine que tu testes avec ARC. Peut-être un firewall sur la machine que tu utilises ou le réseau que tu utilises bloque-t-il les requêtes ?

Tu peux aussi consulter les logs de ARC, que tu peux trouver comme indiqué là https://developer.android.com/chrome-os/intro.html#bestpractices

As-tu tenté d'installer l'APK sur un vrai téléphone et tester son fonctionnement à partir de là ?
0
D'accord, c'est bien ce qu'il me semblait, mais au moins je suis sûr maintenant que rien n'arrive au serveur.

Quand je parlais de tester sur un autre PC je parlais de tester l'application... j'ai repris toute l'application+script php+base de données, et je n'ai toujours rien sur ma BDD une fois l'application utilisée :/
Sinon, mon script php oui je l'ai testé avec ARC, aucun problème! Ma BDD contient désormais qques lignes ;)

Je vais consulter les logs et essayer d'installer l'APK sur mon téléphone (je sais pas comment on fait mais je devrais facilement trouver ça)

Encore merci pour l'aide!
0
Bonsoir et merci,

Je n'ai aucune erreur dans la console de Studio, et en faisant pas-à-pas j'ai découvert que je n'entrais jamais dans la partie "try" du doInBackground, je n'arrive pas à comprendre pourquoi :/
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
30 mai 2017 à 09:03
Comment lances-tu ton AsyncTask?
0
Comme ceci... j'ai enlevé tout ce qui était superflu ;)

public class tripsecondpart extends AppCompatActivity {
String urlAdd="http://192.168.15.32/enis_android_club/add_dbadd.php";
AddDataAsyncTask AddData;
String message;
int success;

@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tripsecondpart);


btnnexttrip.setOnClickListener(new View.OnClickListener(){
public void onClick (View view) {

AddData =new AddDataAsyncTask();
AddData.execute();

startActivityForResult(myIntent,0);

}
});
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
palcabodi Messages postés 20 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 15 juillet 2017
15 juil. 2017 à 17:35
https://www.simplifiedcoding.net/android-mysql-tutorial-to-perform-basic-crud-operation/ (Insertion de données dans une base de données utilisant mysql à partir d'une smartphone android

https://www.simplifiedcoding.net/json-parsing-in-android/ Recupérer les information à partir d'une base de données mysql à partir d'une smartphone android)

veuillez lire ce 2 tuto, ceci pourait vous aider. moi j'ai essayé , cela marche correctement.
0