iT邦幫忙

1

Android 連接mysql失敗(資料寫入)

各位前輩好,最近初學android開發想和資料庫連動。

資料庫目前是本機的xampp -> phpmyadmin,

可以成功讀取資料但卻無法寫入資料,

做法都是利用php連接,

試過HttpURLConnection和OkHttpClient都失敗,

(有加入權限)

外觀只有一個button跟textview,

檢查過php檔案的路徑,有將模擬器加入環境變數,LOG也沒有甚麼異常,

但php仍然得不到資料,希望可以點醒我哪裏設置錯誤,非常感謝。

https://ithelp.ithome.com.tw/upload/images/20200525/20127342YxyLHM19Ug.jpg
使用的模擬器↑

https://ithelp.ithome.com.tw/upload/images/20200525/20127342jeCqtvWsjT.jpg
環境變數↑

https://ithelp.ithome.com.tw/upload/images/20200525/20127342pLxlaTg0m4.jpg
php位置↑

https://ithelp.ithome.com.tw/upload/images/20200525/20127342MVds6PIxDq.jpg
資料庫可成功開啟↑

https://ithelp.ithome.com.tw/upload/images/20200525/20127342BWu5F1lT5h.jpg
php程式碼以及模擬器瀏覽器可成功讀取↑

https://ithelp.ithome.com.tw/upload/images/20200525/20127342Kv9Quc2xnp.jpg
log的內容↑

MainActivity.java

package com.example.connect;

import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private TextView textView;

    OkHttpClient client = new OkHttpClient().newBuilder().build();

    FormBody formBody = new FormBody.Builder()
            .add("id", "3")
            .add("name", "abc")
            .build();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread = new Thread(multiThread);
                thread.start();
            }
        });
    }

    private Runnable multiThread = new Runnable(){
        @Override
        public void run() {
            Request request = new Request.Builder()
                    .url("http://10.0.2.2/SendData.php")
                    .post(formBody)
                    .build();

            Call call = client.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String result = response.body().string();
                    Log.i("success", result);
                }
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e("fail", e.toString());
                }
            });
        }
    };
}
evanchen iT邦新手 4 級 ‧ 2020-05-25 18:03:31 檢舉
建議可以先用Postman測試你的PHP程式是不是正常,也就是你的Web API。
等Postman測過了,再來看Android,比較不會兩個問題混在一起。


Postman:https://www.postman.com/
poilol555 iT邦新手 5 級 ‧ 2020-05-26 13:23:28 檢舉
感謝您的回答,發現是沒有設定好Content-type,postman和okhttp中修改後就可以正常運作了。

2 個回答

1
Franky Chen
iT邦研究生 3 級 ‧ 2020-05-25 20:58:30
最佳解答

資料庫目前是本機的xampp -> phpmyadmin

PHPMyAdmin 是管理介面不是資料庫......

xampp 裡面包的資料庫叫MySQL
PHPMyAdmin是讓你管理用的GUI不是資料庫
PHPMyAdmin vs MySQL

這個差很多......

然後你的LOG有說......

Notice: Trying to get property 'id' of non-object  in C:\xampp\htdocs\SendData.php on line 4
Notice: Trying to get property 'name' of non-object  in C:\xampp\htdocs\SendData.php on line 5

你的PHP

$obj = json_decode($json);

json_decode()完是物件+陣列
你要全部轉成陣列要用json_decode($json,true);
https://www.php.net/manual/en/function.json-decode.php
然後$_POST本來就是陣列了
你可以直接print_r($_POST);看看
所以如果你只是要把POST過去的id,nameecho出來的話你的PHP其實只要

<?php
echo $_POST['id'];
echo $_POST['name'];

就這樣......

poilol555 iT邦新手 5 級 ‧ 2020-05-26 13:24:35 檢舉

感謝您的回答,因為網路上看到兩種做法,查詢後才知道是application/json和/x-www的區別,後來都用json傳送成功了。

3

由於你貼圖片,我就懶的打程式了。

其實在你「php程式碼以及模擬器瀏覽器可成功讀取」上面那張圖來看。
根本就沒有拿到值。旁邊的錯誤訊息都已經很清楚的告訴你找不到對應的索引值了。
你怎麼會覺得是成功的?

Franky Chen iT邦研究生 3 級 ‧ 2020-05-26 13:16:25 檢舉

哎.....貼圖

poilol555 iT邦新手 5 級 ‧ 2020-05-26 13:27:00 檢舉

感謝您的回答,一開始以為是url設定錯誤,才參照網路上檢查模擬器是否能打開php,修改程式碼後有確實收到資料。

我要發表回答

立即登入回答