sql >> Base de Datos >  >> RDS >> Mysql

Cómo devolver el objeto JSON de PHP para leer desde la aplicación de Android

Dado que su publicación no menciona un archivo PHP que funcione, lo incluiré en aras de la exhaustividad. Esto podría ser un largo (largo ) publicar....

Entonces, primero. Este es un ejemplo de un archivo PHP que se almacena con el nombre my_test.php en esta ubicación:c:\wamp\www\some_folder_name\my_test.php (Consulte el historial de edición del código )

Ahora, déjame explicarte las partes importantes de este PHP. Estos parámetros deben configurarse para usar su configuración:

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

La dirección IP debe ser localhost o la dirección IP de la computadora que aloja la base de datos MySQL. Preferiblemente una dirección IP para que pueda probar en dispositivos físicos. usando localhost funcionaría solo en dispositivos virtuales.

El siguiente paso es agregar las columnas a una matriz que construirá un solo registro (fila ) en la respuesta JSON. Eche un vistazo a esta línea, por ejemplo:

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

El $stuff["id"] básicamente se convertirá en la etiqueta en el objeto JSON resultante mientras que $row['id'] es lo que indica el nombre de la columna de la tabla de su base de datos. Entonces el $row["...."] tiene que ser idéntico a los nombres de las columnas en la tabla DB. Mientras que $stuff["...."] puede ser casi cualquier cosa. Siempre y cuando tenga sentido para ti.

Esta línea echo(json_encode($response)); se convertirá la respuesta en formato JSON.

Ahora veamos el código Java. Primero en esto hay una clase que lo ayudará a analizar el resultado. Fue sacado de un tutorial de un sitio web (no recuerdo cuál ). Simplemente copie y pegue el siguiente código en una clase de Java. No es necesario cambiar nada en este archivo. Dale una buena lectura para entender cómo funciona. Lo tengo llamado JSONParser (Consulte el historial de edición del código ):

Finalmente, ¿cómo obtendríamos el JSON resultante y lo analizaríamos en una Activity? / Fragment .

Analizo los datos en una AsyncTask , que se requiere de todos modos teniendo en cuenta que realizará una operación de red. (Consulte el historial de edición del código )

Puntos a tener en cuenta en este Java:

  1. Este String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; necesita tener una dirección IP como 192.168.0.x o si está probando en un dispositivo virtual, debería ser 10.0.2.2 . Cuanto antes (192.. ) no funcionará en un emulador y posterior (10.0... ) no funcionará en un dispositivo físico.
  2. En esto:String TAG_STUFF = "stuff"; , las "stuff" corresponde con esto del archivo PHP:$response["stuff"] = array(); . El TAG_STUFF básicamente debería usar lo que está en $response["stuff"] .

Espero que todo lo anterior tenga sentido. Comenta si necesitas ayuda.;-)

ACTUALIZADO CON SOLUCIÓN DE TRABAJO:

Esto es muy raro de hecho. Pero, tengo una solución de trabajo. Cuando se usa el código del OP, la aplicación se bloquea. Por falta de tiempo para probar por qué falla, en su lugar, publico una solución directamente.

Primero, en lugar de seguir testing como una clase independiente, créela como una clase interna en MainActivity .

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

En segundo lugar, declare las variables globalmente (el jParser , URL_TO_PHP , etc ), en comparación con las declaraciones actuales antes de onPreExecute() . Consulte la solución completa a continuación para mayor claridad...

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

Mientras probaba, también tomé una captura de pantalla de los resultados. Aquí está:

Nuevamente, debido a que estoy un poco estirado en este momento, no podré averiguar qué es lo que realmente está causando el bloqueo en el código del OP. Pero es lo suficientemente intrigante como para averiguarlo...