顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

2011年7月7日 星期四

Android 利用 PHP 連結 MySQL

網路上有許多連結資料庫的方法,像是利用JDBC直接連結資料庫或是透過 web server 代為取得資料,在這裡提到的是後者,下圖為實際的操作環境。



本篇所使用的環境套件為 Mysql、Apache、PHP,在此除了利用PHP向DB要資料外並將取回的資料轉成 JSON 格式,接著利用 HTTP 協定傳遞給 Android 程式,接下來將詳細介紹中間的執行步驟及該注意的事項。

首先我們來看一下 PHP 如何向 Mysql 取得資料:

<?php
mysql_connect("資料庫位置","使用者名稱","使用者密碼");
mysql_select_db("資料庫名稱");
mysql_query("set names utf8");
$q=mysql_query("SELECT phone_value from news where id='".$_POST['id']."'");
while($e=mysql_fetch_assoc($q))
$output[]=$e;
print(json_encode($output));
mysql_close();
?>

mysql_connect : 建立與mysql的連線。
mysql_select_db : 選擇要使用哪一個資料庫。
mysql_query : 設定語系,避免取回的文字呈現亂碼,並且設定 SQL 語法。
mysql_fetch_assoc : 利用 SQL 語法取回要求的資料。
json_encode : 利用 json 編碼將取回的資料轉換成 json 格式。
mysql_close : 最後記得要將 mysql 的連線關閉。

當然在檔案格式的選擇方面並不一定只能使用 JSON ,例如使用 XML 或是要自訂格式也都可以,差別在於使用 JSON 或是 XML 的格式,在Android端我們不需要再自己寫parser,並且Android的開發套件裡已經包含了許多工具可以直接使用。

接下來我們來看一下 Android 端該如何的發送參數與接收資訊;此處我們使用的是HTTP協定並利用POST的方式將參數傳至PHP網頁,並取得PHP傳回的資訊,最後將取得的JSON檔案解析出來使用,所以在 Android 端我們將分成三個部分來處理。

第一個部分主要的功能在於使用HTTP傳遞參數並取得資料:
原始碼如下:

1. HttpClient httpclient = new DefaultHttpClient();
2. HttpPost httppost = new HttpPost("php網址");
3. ArrayList<NameValuePair> nameValuePairs =
new ArrayList<NameValuePair>();
4. nameValuePairs.add(new BasicNameValuePair("參數名","參數值"));
5. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
6. HttpResponse response = httpclient.execute(httppost);
7. HttpEntity entity = response.getEntity();
8. is = entity.getContent();


第1、2行 : 使用的是Apache的功能,首先建立一個HttpClient的實體,並且使用Post的方式
傳遞參數。
第3、4行 : 建立了一個存放NameValuePair型別的ArrayList容器,並且將之後要POST的參數名和
參數值放入容器中。
第5、6行 : 實際送出請求,並取得傳回狀態等資訊。
第7、8行 : 取得收到的內容。


接下來將剛剛所取得的Content利用StringBuilder轉換為字串

BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "iso-8859-1"),8
);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
is.close();
result = sb.toString();


最後取得每個JSON物件與值,先利用JSONArray.getJSONObject取得需要的JSON物件,之後再利用此物件的getString或getInt等方法取得相對應的值。

JSONArray jArray = new JSONArray(result);
while(int i = 0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
data1 = json_data.getString("鍵值名稱");
data2 = json_data.getInt("鍵值名稱");
data3 = json_data.getDouble("鍵值名稱");
}


以上為利用PHP取得MySQL資料的大略流程,中間還有許多可以做變化,像是最後取值的部分是不是一定要全部取?還是當有需要時再取所需的部分?這些都可以做一些規劃,讓整體系統更有擴充性或是賦予物件該負的責任。

在MAP的開發過程中,這個連線與取值的部分我是獨立成一個類別,類別中所需要POST的參數與值經由實際創立物件時再另外做設定,要對哪支PHP做呼叫甚至取回哪些值都是等到物件建立後再依照需求作建立,這樣作雖然在建立物件時會多了許多需要設定的步驟,但相對的可以將PHP頁面與Android程式做適當的分割,以減少其耦合度,除此之外這支類別的責任也就很清楚的定義為Android與PHP兩大單位的中間人,未來兩邊有變異,將可以只修改這個類別作對應動作。

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger