Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да върнете JSON обект от PHP за четене от приложението за Android

Тъй като публикацията ви не споменава работещ PHP файл, ще го включа за пълнота. Това може да е дълго (дълго ) пост....

И така, първо. Това е пример за PHP файл, който се съхранява с името my_test.php на това място:c:\wamp\www\some_folder_name\my_test.php (Моля, вижте историята на редактирането на кода )

Сега, нека обясня важните части на този PHP. Тези параметри трябва да бъдат конфигурирани да използват вашите настройки:

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

IP адресът трябва да бъде или localhost, или IP адресът на компютъра, хостващ MySQL базата данни. За предпочитане е IP адрес, за да можете да тествате на физически устройства. използвайки localhost ще работи само на виртуални устройства.

Следващото е добавяне на колоните към масив, който ще създаде един запис (ред ) в JSON отговора. Разгледайте този ред например:

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

$stuff["id"] по същество ще се превърне в таг в получения JSON обект, докато $row['id'] е това, което показва името на колоната от таблицата на вашата DB. Така че $row["...."] трябва да са идентични с имената на колоните в DB таблицата. Докато $stuff["...."] може да бъде почти всичко. Стига да има смисъл за вас.

Този ред echo(json_encode($response)); ще преобразува отговора във формат JSON.

Сега нека разгледаме Java кода. На първо място в това е клас, който ще ви помогне да анализирате резултата. Беше свален от урок от уебсайт (не помня кой ). Просто копирайте и поставете следния код в Java клас. Няма нужда да променяте нищо в този файл. Прочетете го добре, за да разберете как работи. Имам го с името JSONParser (Моля, вижте историята на редактирането на кода ):

И накрая, как всъщност да получите получения JSON и да го анализирате в Activity / Fragment .

Анализирам данните в AsyncTask , което така или иначе е необходимо, като се има предвид, че ще извършвате мрежова операция. (Моля, вижте историята на редактирането на кода )

Точки за отбелязване в тази Java:

  1. Този String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; трябва да има или IP адрес, като 192.168.0.x или ако тествате на виртуално устройство, то трябва да е 10.0.2.2 . Колкото по-рано (192.. ) няма да работи на емулатор и по-късен (10.0... ) няма да работи на физическо устройство.
  2. В това:String TAG_STUFF = "stuff"; , "stuff" съответства на това от PHP файла:$response["stuff"] = array(); . TAG_STUFF по принцип трябва да използва какво в $response["stuff"] .

Дано всичко по-горе има смисъл. Коментирайте, ако имате нужда от помощ.;-)

АКТУАЛИЗИРАНО С РАБОТНО РЕШЕНИЕ:

Това наистина е много странно. Но имам работещо решение. Когато използвате кода на OP, приложението наистина се срива. Поради липса на време да тествам защо се срива, вместо това публикувам директно решение.

Първо, вместо да поддържате testing като независим клас, създайте го като вътрешен клас обратно в MainActivity .

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

Второ, декларирайте променливите глобално (jParser , URL_TO_PHP и др. ), в сравнение с текущите декларации преди onPreExecute() . Вижте пълното решение по-долу за яснота...

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

Докато тествах, направих и екранна снимка на резултатите. Ето го:

Отново, тъй като в момента съм малко тънък, няма да мога да отида да разбера какво наистина причинява срива в кода на OP. Но е достатъчно интригуващо, за да разберете...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да ограничите заявката SHOW TABLES

  2. Mysql - изтриване от множество таблици с една заявка

  3. Как да ограничите стойност на колона в SQLite / MySQL

  4. Изберете множество дубликати на полета от MySQL база данни

  5. Получаване на връзката неуспешно:php_network_getaddresses:getaddrinfo неуспешно:Име или услуга не са известни