Mysql
 sql >> Database >  >> RDS >> Mysql

Come restituire l'oggetto JSON da PHP da leggere dall'app Android

Poiché il tuo post non menziona un file PHP funzionante, lo includerò per completezza. Questo potrebbe essere un lungo (lungo ) posta....

Quindi, prima. Questo è un esempio di un file PHP memorizzato con il nome my_test.php in questa posizione:c:\wamp\www\some_folder_name\my_test.php (Consulta la cronologia delle modifiche per il codice )

Ora, lascia che ti spieghi le parti importanti di questo PHP. Questi parametri devono essere configurati per utilizzare le tue impostazioni:

$DB_HOST = 'YOUR_IP_ADDRESS';
$DB_UNAME = 'MYSQL_USERNAME';
$DB_PWD = 'MYSQL_USER'S_PASSWORD';
$DB_DATABASE = 'DATABASE_NAME';

L'indirizzo IP deve essere localhost o l'indirizzo IP del computer che ospita il database MySQL. Preferibilmente un indirizzo IP in modo da poter testare su dispositivi fisici. utilizzando localhost funzionerebbe solo su dispositivi virtuali.

Il passo successivo consiste nell'aggiungere le colonne a un array che costruirà un singolo record (riga ) nella risposta JSON. Dai un'occhiata a questa riga per esempio:

$stuff["id"] = $row['id'];

Il $stuff["id"] diventerà sostanzialmente il tag nell'oggetto JSON risultante mentre $row['id'] è ciò che indica il nome della colonna dalla tabella del tuo DB. Quindi il $row["...."] deve essere identico ai nomi delle colonne nella tabella DB. Mentre il $stuff["...."] può essere qualsiasi cosa. Finché ha senso per te.

Questa riga echo(json_encode($response)); converterà la risposta in un formato JSON.

Ora diamo un'occhiata al codice Java. Il primo in questa è una classe che ti aiuterà ad analizzare il risultato. È stato tolto da un tutorial da un sito web (non ricordo quale ). Basta copiare e incollare il seguente codice in una classe Java. Non è necessario modificare nulla in questo file. Dagli una buona lettura per capire come funziona. L'ho chiamato JSONParser (Consulta la cronologia delle modifiche per il codice ):

Infine, come ottenere effettivamente il JSON risultante e analizzarlo in un'Activity / Fragment .

Analizzo i dati in un AsyncTask , che è comunque necessario considerando che si eseguirà un'operazione di rete. (Consulta la cronologia delle modifiche per il codice )

Punti da notare in questo Java:

  1. Questa String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; deve avere un indirizzo IP come 192.168.0.x o se stai testando su un dispositivo virtuale, dovrebbe essere 10.0.2.2 . Il precedente (192.. ) non funzionerà su un emulatore e il successivo (10.0... ) non funzionerà su un dispositivo fisico.
  2. In questo:String TAG_STUFF = "stuff"; , il "stuff" corrisponde a questo dal file PHP:$response["stuff"] = array(); . Il TAG_STUFF dovrebbe fondamentalmente usare cosa c'è in $response["stuff"] .

Spero che tutto quanto sopra abbia senso. Commenta se hai bisogno di aiuto.;-)

AGGIORNATO CON SOLUZIONE DI LAVORO:

Questo è davvero molto strano. Ma ho una soluzione funzionante. Quando si utilizza il codice dell'OP, l'applicazione si arresta in modo anomalo. Per mancanza di tempo per testare il motivo per cui si arresta in modo anomalo, sto invece pubblicando una soluzione direttamente.

Primo, invece di continuare a testing come classe indipendente, creala come classe interna in MainActivity .

class testing extends AsyncTask<Void, Void, Void>   {
....
}

In secondo luogo, dichiara le variabili globalmente (il jParser , URL_TO_PHP , ecc ), rispetto alle attuali dichiarazioni prima di onPreExecute() . Per maggiore chiarezza, vedere la soluzione completa di seguito...

public class MainActivity extends Activity {

    JSONParser jParser;
    String URL_TO_PHP = "http://testbox.site50.net/test.php";
    String TAG_SUCCESS = "success";
    String TAG_STUFF = "stuff";

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

    ....

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                new testing().execute();
                break;
            default:
                break;
        }

    }

    private class testing extends AsyncTask<Void, Void, Void> {

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

        @Override
        protected Void doInBackground(Void... args) {

            /* Building Parameters */
            List<NameValuePair> params = new ArrayList<>();

            /* getting JSON string from URL */
            JSONObject json = jParser.makeHttpRequest(URL_TO_PHP, "GET", params);

            try {
                /* Checking for SUCCESS TAG */
                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    JSONArray JAStuff = json.getJSONArray(TAG_STUFF);

                    /** CHECK THE NUMBER OF RECORDS **/
                    int intStuff = JAStuff.length();

                    if (intStuff != 0) {

                        for (int i = 0; i < JAStuff.length(); i++) {
                            JSONObject JOStuff = JAStuff.getJSONObject(i);
                            Log.e("ALL THE STUFF", JOStuff.toString());
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }
    }
}

Durante il test, ho anche preso uno screenshot dei risultati. Ecco qui:

Ancora una volta, poiché al momento sono un po 'stretto, non sarò in grado di scoprire cosa sta realmente causando l'arresto anomalo nel codice dell'OP. Ma è abbastanza intrigante scoprirlo..