Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara mengembalikan Objek JSON dari PHP untuk dibaca dari Aplikasi Android

Karena Anda memposting tidak menyebutkan file PHP yang berfungsi, saya akan memasukkannya demi kelengkapan. Ini bisa jadi panjang (panjang ) posting....

Jadi, pertama. Ini adalah contoh file PHP yang disimpan dengan nama my_test.php di lokasi ini:c:\wamp\www\some_folder_name\my_test.php (Silakan lihat riwayat edit untuk kode )

Sekarang, izinkan saya menjelaskan bagian penting dari PHP ini. Parameter ini harus dikonfigurasi untuk menggunakan pengaturan Anda:

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

Alamat IP harus berupa localhost atau alamat IP komputer yang menghosting database MySQL. Lebih disukai alamat IP sehingga Anda dapat menguji pada perangkat fisik. menggunakan localhost hanya akan berfungsi di Perangkat Virtual.

Selanjutnya adalah menambahkan kolom ke array yang akan membuat satu record (baris ) dalam respons JSON. Lihatlah baris ini misalnya:

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

$stuff["id"] pada dasarnya akan menjadi tag di Objek JSON yang dihasilkan sedangkan $row['id'] adalah yang menunjukkan nama kolom dari tabel DB Anda. Jadi $row["...."] harus identik dengan nama kolom dalam tabel DB. Sedangkan $stuff["...."] bisa apa saja. Selama itu masuk akal bagi Anda.

Baris ini echo(json_encode($response)); akan mengkonversi tanggapan ke dalam format JSON.

Sekarang mari kita lihat kode Java. Pertama dalam ini adalah kelas yang akan membantu Anda menguraikan hasilnya. Itu diambil dari tutorial dari situs web (Saya tidak ingat yang mana ). Cukup salin tempel kode berikut di kelas Java. Tidak perlu mengubah apa pun dalam file ini. Bacalah dengan baik untuk memahami cara kerjanya. Saya memberinya nama JSONParser (Silakan lihat riwayat edit untuk kode ):

Terakhir, bagaimana cara mendapatkan JSON yang dihasilkan dan menguraikannya dalam Activity / Fragment .

Saya mengurai data dalam AsyncTask , yang tetap diperlukan mengingat Anda akan melakukan operasi jaringan. (Silakan lihat riwayat edit untuk kode )

Hal-hal yang perlu diperhatikan dalam Java ini:

  1. Ini String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; harus memiliki alamat IP seperti 192.168.0.x atau jika Anda menguji pada perangkat virtual, seharusnya 10.0.2.2 . Sebelumnya (192.. ) tidak akan berfungsi pada emulator dan yang lebih baru (10.0... ) tidak akan berfungsi di perangkat fisik.
  2. Dalam hal ini:String TAG_STUFF = "stuff"; , "stuff" sesuai dengan ini dari file PHP:$response["stuff"] = array(); . TAG_STUFF pada dasarnya harus menggunakan apa yang ada di $response["stuff"] .

Semoga semua hal di atas masuk akal. Komentar jika Anda membutuhkan bantuan.;-)

DIPERBARUI DENGAN SOLUSI KERJA:

Ini memang sangat aneh. Tapi, saya punya solusi yang berfungsi. Saat menggunakan kode OP, aplikasi memang crash. Karena kurangnya waktu untuk menguji mengapa crash, saya malah memposting solusi secara langsung.

Pertama, alih-alih menyimpan testing sebagai kelas independen, buat sebagai kelas dalam kembali di MainActivity .

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

Kedua, deklarasikan variabel secara global (jParser , URL_TO_PHP , dll ), dibandingkan dengan deklarasi saat ini sebelum onPreExecute() . Lihat solusi lengkap di bawah ini untuk kejelasan...

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

Saat pengujian, saya juga mengambil tangkapan layar dari hasilnya. Ini dia:

Sekali lagi, karena saya agak kurus saat ini, saya tidak akan bisa mencari tahu apa yang sebenarnya menyebabkan crash dalam kode OP. Tapi cukup menarik untuk mengetahuinya..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql LOAD DATA INFILE dengan kunci utama peningkatan otomatis

  2. MySQL 'secure-file-priv' tidak mengizinkan memuat data infile, bahkan dari folder aman yang dialokasikan

  3. Masalah basis data Laravel 5

  4. Bagaimana cara menghubungkan aplikasi Android ke database MySQL?

  5. Bagaimana cara menghapus spasi antar baris di Textarea?