Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment renvoyer l'objet JSON de PHP pour lire à partir de l'application Android

Étant donné que votre message ne mentionne pas de fichier PHP fonctionnel, je l'inclurai par souci d'exhaustivité. Cela pourrait être long (long ) poste....

Donc, d'abord. Ceci est un exemple de fichier PHP stocké sous le nom my_test.php à cet emplacement :c:\wamp\www\some_folder_name\my_test.php (Veuillez consulter l'historique des modifications du code )

Maintenant, laissez-moi vous expliquer les parties importantes de ce PHP. Ces paramètres doivent être configurés pour utiliser vos paramètres :

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

L'adresse IP doit être soit localhost, soit l'adresse IP de l'ordinateur hébergeant la base de données MySQL. De préférence une adresse IP pour pouvoir tester sur des appareils physiques. en utilisant localhost ne fonctionnerait que sur les appareils virtuels.

La prochaine étape consiste à ajouter les colonnes à un tableau qui construira un seul enregistrement (ligne ) dans la réponse JSON. Regardez cette ligne par exemple :

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

Le $stuff["id"] deviendra essentiellement le tag dans l'objet JSON résultant alors que le $row['id'] est ce qui indique le nom de la colonne de la table de votre base de données. Donc le $row["...."] doit être identique aux noms de colonne dans la table DB. Alors que les $stuff["...."] peut être n'importe quoi. Tant que cela a du sens pour vous.

Cette ligne echo(json_encode($response)); va convertir la réponse au format JSON.

Regardons maintenant le code Java. Tout d'abord, il y a une classe qui vous aidera à analyser le résultat. Il a été extrait d'un tutoriel sur un site Web (je ne me souviens plus lequel ). Copiez et collez simplement le code suivant dans une classe Java. Pas besoin de changer quoi que ce soit dans ce fichier. Lisez-le bien pour comprendre comment cela fonctionne. Je l'ai nommé JSONParser (Veuillez consulter l'historique des modifications du code ):

Enfin, comment obtenir réellement le JSON résultant et l'analyser dans une Activity / Fragment .

J'analyse les données dans une AsyncTask , qui est de toute façon nécessaire étant donné que vous allez effectuer une opération réseau. (Veuillez consulter l'historique des modifications du code )

Points à noter dans ce Java :

  1. Cette String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; doit avoir soit une adresse IP telle que 192.168.0.x ou si vous testez sur un appareil virtuel, il devrait être 10.0.2.2 . Le plus ancien (192.. ) ne fonctionnera pas sur un émulateur et le plus récent (10.0... ) ne fonctionnera pas sur un appareil physique.
  2. Dans ceci :String TAG_STUFF = "stuff"; , les "stuff" correspond à ceci du fichier PHP :$response["stuff"] = array(); . Le TAG_STUFF devrait essentiellement utiliser ce qu'il y a dans $response["stuff"] .

J'espère que tout ce qui précède a du sens. Commentez si vous avez besoin d'aide.;-)

MISE À JOUR AVEC LA SOLUTION DE TRAVAIL :

C'est vraiment très bizarre. Mais, j'ai une solution de travail. Lors de l'utilisation du code de l'OP, l'application plante en effet. Faute de temps pour tester pourquoi il plante, je poste plutôt une solution directement.

Tout d'abord, au lieu de conserver testing en tant que classe indépendante, créez-la en tant que classe interne dans MainActivity .

Les tests de classe
class testing extends AsyncTask<Void, Void, Void>   {
....
}

Deuxièmement, déclarez les variables globalement (le jParser , URL_TO_PHP , etc ), par rapport aux déclarations actuelles avant le onPreExecute() . Voir la solution complète ci-dessous pour plus de clarté...

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);
        }
    }
}

Pendant les tests, j'ai également pris une capture d'écran des résultats. C'est ici:

Encore une fois, parce que je suis un peu étiré en ce moment, je ne pourrai pas découvrir ce qui cause vraiment le crash dans le code de l'OP. Mais c'est assez intrigant pour le découvrir...