Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách trả lại Đối tượng JSON từ PHP để đọc từ Ứng dụng Android

Vì bạn đăng không đề cập đến một tệp PHP đang hoạt động, nên tôi sẽ bao gồm nó để hoàn thiện. Đây có thể là một khoảng thời gian dài ( dài ) đăng ....

Vì vậy, đầu tiên. Đây là ví dụ về tệp PHP được lưu trữ với tên my_test.php tại vị trí này:c:\wamp\www\some_folder_name\my_test.php ( Vui lòng xem lịch sử chỉnh sửa cho mã )

Bây giờ, hãy để tôi giải thích các phần quan trọng của PHP này. Các thông số này phải được định cấu hình để sử dụng cài đặt của bạn:

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

Địa chỉ IP phải là máy chủ cục bộ hoặc địa chỉ IP của máy tính lưu trữ cơ sở dữ liệu MySQL. Tốt hơn là một địa chỉ IP để bạn có thể kiểm tra trên các thiết bị vật lý. sử dụng localhost sẽ chỉ hoạt động trên Thiết bị ảo.

Tiếp theo là thêm các cột vào một mảng sẽ tạo một bản ghi duy nhất ( hàng ) trong phản hồi JSON. Hãy xem dòng này chẳng hạn:

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

$stuff["id"] về cơ bản sẽ trở thành thẻ trong Đối tượng JSON kết quả trong khi $row['id'] là những gì cho biết tên cột từ bảng DB của bạn. Vì vậy, $row["...."] phải giống với tên cột trong bảng DB. Trong khi $stuff["...."] có thể là về bất cứ điều gì. Miễn là nó có ý nghĩa với bạn.

Dòng này echo(json_encode($response)); sẽ chuyển đổi phản hồi ở định dạng JSON.

Bây giờ chúng ta hãy nhìn vào mã Java. Đầu tiên, đây là một lớp sẽ giúp bạn phân tích kết quả. Nó đã được lấy ra từ một hướng dẫn trên một trang web ( Tôi không nhớ là cái nào ). Chỉ cần sao chép, dán đoạn mã sau vào một lớp Java. Không cần thay đổi bất cứ điều gì trong tệp này. Hãy đọc kỹ để hiểu nó hoạt động như thế nào. Tôi đặt nó tên là JSONParser ( Vui lòng xem lịch sử chỉnh sửa cho mã ):

Cuối cùng, làm thế nào để thực sự nhận được JSON kết quả và phân tích cú pháp nó trong một Activity / Fragment .

Tôi phân tích cú pháp dữ liệu trong AsyncTask , điều này là bắt buộc vì bạn sẽ thực hiện một hoạt động mạng. ( Vui lòng xem lịch sử chỉnh sửa cho mã )

Những điểm cần lưu ý trong Java này:

  1. Đây String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; cần có địa chỉ IP chẳng hạn như 192.168.0.x hoặc nếu bạn đang thử nghiệm trên một thiết bị ảo, nó phải là 10.0.2.2 . Sớm hơn ( 192 .. ) sẽ không hoạt động trên trình giả lập và phiên bản mới hơn ( 10.0 ... ) sẽ không hoạt động trên thiết bị vật lý.
  2. Trong này:String TAG_STUFF = "stuff"; , "stuff" tương ứng với điều này từ tệp PHP:$response["stuff"] = array(); . TAG_STUFF về cơ bản nên sử dụng cái gì trong $response["stuff"] .

Hy vọng tất cả những điều trên có ý nghĩa. Bình luận nếu bạn cần giúp đỡ.;-)

ĐƯỢC CẬP NHẬT VỚI GIẢI PHÁP LÀM VIỆC:

Điều này thực sự rất kỳ lạ. Nhưng, tôi có một giải pháp làm việc. Khi sử dụng mã OP, ứng dụng thực sự bị treo. Vì thiếu thời gian để kiểm tra lý do tại sao nó bị lỗi, thay vào đó, tôi đăng trực tiếp giải pháp.

Đầu tiên, thay vì giữ testing như một lớp độc lập, hãy tạo nó như một lớp bên trong trở lại MainActivity .

Kiểm tra lớp
class testing extends AsyncTask<Void, Void, Void>   {
....
}

Thứ hai, khai báo các biến trên toàn cầu ( the jParser , URL_TO_PHP , v.v. ), so với các khai báo hiện tại trước onPreExecute() . Xem toàn bộ giải pháp bên dưới để rõ hơn ...

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

Trong khi thử nghiệm, tôi cũng xem xét các kết quả. Nó đây:

Một lần nữa, vì tôi hơi gầy vào lúc này, tôi sẽ không thể đi tìm hiểu điều gì thực sự gây ra sự cố trong mã OP. Nhưng nó đủ hấp dẫn để tìm hiểu ..



  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 - bỏ qua lỗi chèn:mục nhập trùng lặp

  2. Bí danh cột động dựa trên giá trị cột

  3. Tại sao XAMPP không phù hợp để sản xuất?

  4. NHÓM MySQL Theo số lượng

  5. Biểu tượng cảm xúc không được chèn vào nút cơ sở dữ liệu js mysql