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

Sådan returneres JSON Object fra PHP for at læse fra Android App

Da du poster ikke nævner en fungerende PHP-fil, vil jeg inkludere den for fuldstændighedens skyld. Dette kan være langt (langt ) indlæg....

Så først. Dette er et eksempel på en PHP-fil, der er gemt med navnet my_test.php på dette sted:c:\wamp\www\some_folder_name\my_test.php (Se redigeringshistorikken for koden )

Lad mig nu forklare de vigtige dele af denne PHP. Disse parametre skal konfigureres til at bruge dine indstillinger:

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

IP-adressen skal enten være localhost eller IP-adressen på den computer, der hoster MySQL-databasen. Gerne en IP-adresse, så du kan teste på fysiske enheder. ved hjælp af localhost ville kun virke på virtuelle enheder.

Det næste er at tilføje kolonnerne til et array, der vil konstruere en enkelt post (række ) i JSON-svaret. Tag et kig på denne linje for eksempel:

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

$stuff["id"] vil grundlæggende blive tagget i det resulterende JSON-objekt, mens $row['id'] er det, der angiver kolonnenavnet fra din DB's tabel. Så $row["...."] skal være identisk med kolonnenavnene i DB-tabellen. Mens $stuff["...."] kan være næsten alt. Så længe det giver mening for dig.

Denne linje echo(json_encode($response)); vil konvertere svaret i et JSON-format.

Lad os nu se på Java-koden. Først op i dette er en klasse, der vil hjælpe dig med at analysere resultatet. Det blev fjernet fra et selvstudie fra et websted (Jeg kan ikke huske hvilken ). Bare kopier og indsæt følgende kode i en Java-klasse. Det er ikke nødvendigt at ændre noget i denne fil. Læs det godt for at forstå, hvordan det fungerer. Jeg har det navngivet JSONParser (Se redigeringshistorikken for koden ):

Til sidst, hvordan ville man faktisk få den resulterende JSON og parse den i en Activity / Fragment .

Jeg analyserer dataene i en AsyncTask , hvilket er påkrævet alligevel, i betragtning af at du skal udføre en netværksoperation. (Se redigeringshistorikken for koden )

Punkter at bemærke i denne Java:

  1. Denne String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; skal enten have en IP-adresse såsom 192.168.0.x eller hvis du tester på en virtuel enhed, skal den være 10.0.2.2 . Jo tidligere (192.. ) vil ikke fungere på en emulator og den senere (10.0... ) virker ikke på en fysisk enhed.
  2. I dette:String TAG_STUFF = "stuff"; , "stuff" svarer til dette fra PHP-filen:$response["stuff"] = array(); . TAG_STUFF skal grundlæggende bruge hvad der er i $response["stuff"] .

Håber alt ovenstående giver mening. Kommenter hvis du har brug for hjælp.;-)

OPDATERET MED FUNKTIONSLØSNING:

Det her er virkelig meget mærkeligt. Men jeg har en fungerende løsning. Når du bruger OP's kode, går applikationen faktisk ned. I mangel af tid til at teste, hvorfor det går ned, poster jeg i stedet en løsning direkte.

Først i stedet for at beholde testing som en uafhængig klasse, opret den som en indre klasse tilbage i MainActivity .

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

For det andet skal du erklære variablerne globalt (jParser , URL_TO_PHP osv. ), i modsætning til de nuværende erklæringer før onPreExecute() . Se den komplette løsning nedenfor for klarhed...

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

Mens jeg testede, tog jeg også et screengrab af resultaterne. Her er det:

Igen, fordi jeg er strakt lidt tynd i øjeblikket, vil jeg ikke være i stand til at finde ud af, hvad der virkelig forårsager nedbruddet i OP'ens kode. Men det er spændende nok at finde ud af..



  1. Grundlæggende om PostgreSQL Schema Management

  2. Sådan bruger du ORDER BY inde i UNION

  3. T-SQL:Hvordan bruger man parametre i dynamisk SQL?

  4. RODBC odbcDriverConnect() forbindelsesfejl