CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: kotix con ben 3 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: kotix con ben 9 Thanks ricevuti negli ultimi sette giorni
Utente del mese: bluemask con ben 49 Thanks ricevuti nell'ultimo mese

Pagina 1 di 2 12 ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 12
Discussione:

connessione client android ad un db tramite server php

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Mar 2013
    Messaggi
    22

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    connessione client android ad un db tramite server php

    Salve a tutti ,ho il seguente problema : cercando nei vari forum su internet ho trovato un modo per interrogare da un client (smartphone android) un database mysql situato sul mio pc di casa tramite apposito e semplice server scritto in php. Peccato che non funzioni.
    Vi posto il codice e vi spiego il problema:
    Il database è semplice
    E' un database MySql (io lo ho chiamato “hellohttp”) che contiene una tabella chiamata “Persone”, dentro la quale abbiamo i campi “id”, “nome”, “cognome”.

    Qui di seguito c’è il codice della pagina “richiestaInfo.php” che risiede sul server e verrà invocata dall’applicazione android per prelevare dei dati dal database:
    codice:
    <?php
    mysql_connect("localhost:3306","root","");
    mysql_select_db("hellohttp");
     
    $q=mysql_query("SELECT * FROM persone WHERE id=".$_REQUEST['idnomerichiesto']);
    while($e=mysql_fetch_assoc($q))
            $output[]=$e;
     
    print(json_encode($output));
     
    mysql_close();
    ?>
    Premetto che io sto usando wamp per lanciare il server da casa
    Non ho fatto altro che creare il database con mysql ,poi ho creato con il blocco notes il file in php e l'ho copiato nella cartella www di wamp e ho avviato il tutto in mkodo che fosse attivo quando qualche client si connettesse.

    Ora vediamo il codice dell’applicazione Android che fa da client e che vuole interrogare il server remoto ed ottenere i dati di un particolare “id”:
    codice:
    public class HelloHttpPostActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            final TextView textviewDatiRicevuti = (TextView) findViewById(R.id.datiRicevuti);
     
            Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
            buttonInviaDati.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    //invio richiesta
                    textviewDatiRicevuti.setText(inviaDati());
                }
            });
        }
     
        public String inviaDati(){
            String result = "";
            String stringaFinale = "";
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("idnomerichiesto","1"));
            InputStream is = null;
     
            //http post
            try{
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost("http://10.0.2.2:8080/helloHttp/richiestaInfo.php");
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();
            }catch(Exception e){
                    Log.e("TEST", "Errore nella connessione http "+e.toString());
            }
            if(is != null){
                //converto la risposta in stringa
                try{
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                        }
                        is.close();
     
                        result=sb.toString();
                }catch(Exception e){
                        Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
                }
     
                //parsing dei dati arrivati in formato json
                try{
                        JSONArray jArray = new JSONArray(result);
                        for(int i=0;i<jArray.length();i++){
                                JSONObject json_data = jArray.getJSONObject(i);
                                Log.i("TEST","id: "+json_data.getInt("id")+
                                        ", cognome: "+json_data.getString("cognome")+
                                        ", nascita: "+json_data.getInt("anno")
                                );
                                stringaFinale = json_data.getInt("id") + " " + json_data.getString("cognome") + " " + json_data.getInt("anno") + "\n\n";
                        }
                }
                catch(JSONException e){
                        Log.e("log_tag", "Error parsing data "+e.toString());
                }
            }
            else{//is è null e non ho avuto risposta
     
            }
     
            return stringaFinale;
        }
    }
    Qui di seguito c’è il semplice codice dell’interfaccia grafica dell’applicazione Android:
    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
     
        <Button
            android:id="@+id/buttonInviaDati"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Invia dati" />
     
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Dati ricevuti:"
            android:textAppearance="?android:attr/textAppearanceLarge" />
     
        <TextView
            android:id="@+id/datiRicevuti"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Per ora nessun dato ricevuto" />
     
    </LinearLayout>
    Inoltre ho aggiunto nel file manifest i seguenti permessi
    codice:
    <uses-permission android:name="android.permission.INTERNET" />
    Il problema che sussiste è che mi da errore nella connessione
    Ho cercato su internet e il problema risiede nel fatto che dovrei separare la richiesta http dal resto del codice usando gli asynctask ma non ci riesco ad applicarli qui
    se potreste darmi una mano magari provando il codice sul vostro pc ,perchè altrimenti non saprei come andare avanti

  2.  
  3. #2
    Baby Droid


    Registrato dal
    Mar 2013
    Messaggi
    22

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ho provato a risolvere questo problema ma ho riscontrato un altro problema
    Vedendo un pò su internet ho modificato così il codice utilizzando l'asynctask per incapsulare la richiesta da inviare al server.
    Tenta di connettersi ma poi mi dà errore nella connessione.
    Se cambio la porta da 8080 a 80 sembra connesso ma poi da errore di JSONException ,infatti ho messo una stampa del risultato e sembra ci sia un errore nella lettura della pagina di 403 forbidden.
    Ora non so proprio dove sbaglio ,come vi ripeto io sto usando wamp
    Vi posto l'ultima versione del codice

    server php
    codice:
    <?php
    mysql_connect("localhost:3306"," root ","");
    mysql_select_db("hellohttp");
     
    $q=mysql_query("SELECT * FROM persone WHERE id=".$_REQUEST['idnomerichiesto']);
    while($e=mysql_fetch_assoc($q))
            $output[]=$e;
     
    print(json_encode($output));
     
    mysql_close();
    ?>
    app client android
    codice:
    package com.hellohttppostactivity;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
             //public String str_finale = "";
         TextView textviewDatiRicevuti;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            // inizializzo la variabile globale
            textviewDatiRicevuti = (TextView) findViewById(R.id.datiRicevuti);
            
            Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
            buttonInviaDati.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    //invio richiesta
                        //textviewDatiRicevuti.setText(inviaDati());
                         HttpGetTask task = new HttpGetTask();
                     task.execute();
                }
            });
        }
        
        
        
        private class HttpGetTask extends AsyncTask<String,String,String>  {
    
            @Override
            protected String doInBackground(String... params) {
                    String result = "";
                String stringaFinale = "";
                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("idnomerichiesto","1"));
                InputStream is = null;
         
                //http post
                try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://192.168.0.2:8080/richiestaInfo.php");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                }catch(Exception e){
                        Log.e("TEST", "Errore nella connessione http "+e.toString());
                }
                if(is != null){
                    //converto la risposta in stringa
                    try{
                            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                            StringBuilder sb = new StringBuilder();
                            String line = null;
                            while ((line = reader.readLine()) != null) {
                                    sb.append(line + "\n");
                            }
                            is.close();
         
                            result=sb.toString();
                    }catch(Exception e){
                            Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
                    }
                    
                    System.out.println(result);
                    
                    //parsing dei dati arrivati in formato json
                    try{
                            JSONArray jArray = new JSONArray(result);
                            for(int i=0;i<jArray.length();i++){
                                    JSONObject json_data = jArray.getJSONObject(i);
                                    Log.i("TEST","id: "+json_data.getInt("id")+
                                            ", cognome: "+json_data.getString("cognome")+
                                            ", nascita: "+json_data.getInt("anno")
                                    );
                                    stringaFinale = json_data.getInt("id") + " " + json_data.getString("cognome") + " " + json_data.getInt("anno") + "\n\n";
                            }
                    }
                    catch(JSONException e){
                            Log.e("log_tag", "Error parsing data "+e.toString());
                    }
                }
                else{//is è null e non ho avuto risposta
         
                }
         
                return stringaFinale;
               
            }
    
            @Override
            protected void onProgressUpdate(String... values) {
               
            }
    
            @Override
            protected void onPostExecute(String result) {
                // aggiorno la textview con il risultato ottenuto
                    textviewDatiRicevuti.setText(result);
            }
         }
    }

  4. #3
    Baby Droid L'avatar di gntgpp89


    Registrato dal
    Sep 2013
    Località
    Roma
    Messaggi
    4
    Smartphone
    Nexus 4

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Premetto di aver letto il tuo codice in maniera molto veloce, ma ho un piccolo dubbio sul tipo di server!! nel senso che non ho capito se utilizzi un server vero e proprio "homemade" oppure lavori in locale con localhost con wamp.

  5. #4
    Baby Droid


    Registrato dal
    Mar 2013
    Messaggi
    22

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Per ora sto facendo delle prove all'interno della stessa rete locale ,e sto utilizzando wamp.
    Successivamente l'idea era quella di metterlo su uno spazio web apposito.

    Puoi aiutarmi a capire cos'è che non funziona?

  6. #5
    Baby Droid L'avatar di gntgpp89


    Registrato dal
    Sep 2013
    Località
    Roma
    Messaggi
    4
    Smartphone
    Nexus 4

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    carica tutto il sito su uno spazio gratuito come altervista per provare...hai anche la possibilità di fare il db con phpmyadmin... Io in locale la vedo dura!

  7. #6
    Baby Droid


    Registrato dal
    Mar 2013
    Messaggi
    22

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Scusami ma che cosa cambia se lo testo in locale.
    Se lo mettessi su un sito l'unica differenza dovrebbe essere che invece di mettere 192.168.0.2 ... dovrei mettere il link del sito
    Non capisco

    Perchè su altri forum ho letto che funziona così facendo ,ma evidentemente sbaglio qualcosa
    Ultima modifica di giulio110; 29-09-13 alle 11:51

  8. #7
    Baby Droid L'avatar di gntgpp89


    Registrato dal
    Sep 2013
    Località
    Roma
    Messaggi
    4
    Smartphone
    Nexus 4

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Allora con XAMPP non dovrebbero esserci problemi. Ma quando si testano cose del genere è meglio provare subito su siti hosting veri, con wamp controlla che inserendo l'ip del pc in questione "quello che ospita il file php" in un altro pc ti visualizzi la pagina e funziona tutto correttamente, altrimenti può essere che devi sistemare i permessi lettura - scrittura. Il 403 è accesso NEGATO! per questo ti dico di provare a fare queste cose prima. Ovviamente il problema può essere nel parsing e nel come gestisci l'output del json e come lo accogli dentro l'app android.

  9. #8
    Baby Droid


    Registrato dal
    Mar 2013
    Messaggi
    22

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Allora io ho acceso wamp ,ho messo il server online.
    Ricordo che il file richiestaInfo.php è presente nella cartella www di wamp

    Ho provato a fare una prova dal browser dello smartphone digitando
    http://192.168.0.2//richiestaInfo.php?idnomerichiesto=1
    e mi dà questo errore

    FORBIDDEN
    You don't have permission to access /richiestaInfo.php on this server

    Perchè succede questo?Se faccio la prova sullo stesso computer il risultato che mi esce è corretto
    Ah ovviamente il cellulare è connesso al router ,quindi alla stessa rete Wifi

  10. #9
    Baby Droid L'avatar di gntgpp89


    Registrato dal
    Sep 2013
    Località
    Roma
    Messaggi
    4
    Smartphone
    Nexus 4

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Vedi!! lo sapevo!!! in pratica devi modificare il file httpd.conf è il file di configurazione di apache. aggiungi l ip del secondo pc e ottieni i permessi! se non ricordo male devi aggiungere:
    Allow from (ip del tuo secondo pc senza modificare altro) // non mettere le parentesi

    Scrivilo sotto quello che già esiste, che in pratica è quello del pc 1.

    Prova e vedi se accedi e o quali errori dà.

  11. #10
    Baby Droid


    Registrato dal
    Mar 2013
    Messaggi
    22

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Sembra proprio che funzioni
    Ti ringrazio
    Ora faccio altre prove e se trovo altri problemi scrivo qui sul forum o al massimo su un altro post
    Grazie ancora

Pagina 1 di 2 12 ultimoultimo
Ultima pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy