sql >> Databasteknik >  >> RDS >> Mysql

Hur man returnerar JSON-objekt från PHP för att läsa från Android-appen

Eftersom du inlägg inte nämner en fungerande PHP-fil kommer jag att inkludera den för fullständighetens skull. Detta kan vara en lång (lång ) inlägg....

Så först. Detta är ett exempel på en PHP-fil som lagras med namnet my_test.php in på den här platsen:c:\wamp\www\some_folder_name\my_test.php (Se redigeringshistoriken för koden )

Låt mig nu förklara de viktiga delarna av denna PHP. Dessa parametrar bör konfigureras för att använda dina inställningar:

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

IP-adressen ska vara antingen localhost eller IP-adressen för den dator som är värd för MySQL-databasen. Gärna en IP-adress så att du kan testa på fysiska enheter. med localhost skulle bara fungera på virtuella enheter.

Nästa steg är att lägga till kolumnerna i en array som kommer att konstruera en enda post (rad ) i JSON-svaret. Ta en titt på den här raden till exempel:

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

$stuff["id"] kommer i princip att bli taggen i det resulterande JSON-objektet medan $row['id'] är det som indikerar kolumnnamnet från din DB:s tabell. Så $row["...."] måste vara identiska med kolumnnamnen i DB-tabellen. Medan $stuff["...."] kan vara precis vad som helst. Så länge det är vettigt för dig.

Denna rad echo(json_encode($response)); kommer att konvertera svaret i ett JSON-format.

Låt oss nu titta på Java-koden. Först ut i detta är en klass som hjälper dig att analysera resultatet. Det togs bort från en handledning från en webbplats (Jag kommer inte ihåg vilken ). Bara kopiera och klistra in följande kod i en Java-klass. Du behöver inte ändra något i den här filen. Läs den ordentligt för att förstå hur den fungerar. Jag har den som heter JSONParser (Se redigeringshistoriken för koden ):

Slutligen, hur skulle man faktiskt få den resulterande JSON och tolka den i en Activity / Fragment .

Jag analyserar data i en AsyncTask , vilket ändå krävs med tanke på att du kommer att utföra en nätverksoperation. (Se redigeringshistoriken för koden )

Punktar att notera i denna Java:

  1. Denna String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; måste ha antingen en IP-adress som 192.168.0.x eller om du testar på en virtuell enhet bör den vara 10.0.2.2 . Den tidigare (192.. ) fungerar inte på en emulator och senare (10.0... ) fungerar inte på en fysisk enhet.
  2. I detta:String TAG_STUFF = "stuff"; , "stuff" motsvarar detta från PHP-filen:$response["stuff"] = array(); . TAG_STUFF bör i princip använda vad som finns i $response["stuff"] .

Hoppas allt ovan är vettigt. Kommentera om du behöver hjälp.;-)

UPPDATERAD MED FUNKTIONSLÖSNING:

Det här är verkligen väldigt konstigt. Men jag har en fungerande lösning. När du använder OP:s kod kraschar programmet verkligen. I brist på tid för att testa varför det kraschar lägger jag istället upp en lösning direkt.

Först, istället för att behålla testing som en oberoende klass, skapa den som en inre klass tillbaka i MainActivity .

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

För det andra, deklarera variablerna globalt (jParser , URL_TO_PHP , etc ), jämfört med de nuvarande deklarationerna före onPreExecute() . Se den fullständiga lösningen nedan för klarhet...

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

Medan jag testade tog jag också en skärmdump av resultaten. Här är det:

Återigen, eftersom jag är lite tunn just nu, kommer jag inte att kunna ta reda på vad som verkligen orsakar kraschen i OP:s kod. Men det är tillräckligt spännande för att ta reda på det...



  1. PostgreSQL konverterade fel från tidsstämpel utan tidszon till tidsstämpel med tidszon

  2. Skapa en tillfällig tabell i en SELECT-sats utan en separat CREATE TABLE

  3. cc1:fel:okänt kommandoradsalternativ -Wno-null-konvertering inom installation av python-mysql på mac 10.7.5

  4. mysql-tjänsten startar inte/lägger på - timeout (Ubuntu, MariaDB)