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

2011年7月14日 星期四

關於Drupal新增content時的資料表變動

目前後台的部分是使用 Drupal 作開發,而行動裝置抓取資料必需直接向資料庫要求,所以對於 Drupal 新增 content 時相關的資料表做了一些觀察。

觀察的環境為 TWAMP 的安裝包,使用版本為 6.22 版,並且安裝了 CCK 及 Views 這兩個基本的模組,所以資料庫的結構上就是依照這樣的安裝所產生的,總共的資料表數量為61個,觀察的資料表為 content 以及 node 這兩個字串為開頭的資料表。



  • 新增 content 類型
首先來看,新增一個 content 類型後,在 node_type 中會新增一筆資料,這筆資料代表的就是剛剛新增的 content 類型,並且此類型的相關設定都會存放在這。



  • 新增 field
接著在此 content 類型中新增一個 field ,新增完這個 field 後,資料庫中會新增一個資料表,資料表的名稱為 content_type_"ContentType名稱" ,而裡面暫時不會有值,至於會有哪些欄位就視不同的 field type 而不同,最基本的欄位會有 nid 及 vid 。

譬如新增的 field type 是 Node reference 的話,那會多一個 field_"連結的node名稱"_nid 的欄位,記錄著連結到哪個 node,而有些 type 則會在未來新增內容時才做動作。

除此之外 content_node_field 及 content_node_field_instance 這兩個資料表,也會新增一筆與 field 設定相關的紀錄,而這兩個的差別在於 content_node_field 像是物件導向概念裡的類別,而 content_node_field_instance 則是經由類別創建出的實例,content_node_field 紀錄的是一般的設定,此設定可套用到其他的 content 類別,content_node_field_instance 則是與某個 content 類別綁住的獨有的設定。



  • 新增 content 內容
接下來新增一個 content 內容,類型為剛剛所創建的 content 類型,在資料庫中會在 node 資料表中寫入一筆記錄,包含了創建的相關訊息,但不包括創建內容;node_comment_statistics 資料表中會有一筆統計紀錄;node_revisions 資料表會存放未來如果有變更的資訊。而實際內容會放在以 content 字串開頭的資料表中,像是前面提到的 Node reference 類型的 field 則會將內容資料放在 content_type_"ContentType名稱" 中,而如果是 text 類型的 field 則會 新增一個專門存放內容的資料表,資料表名稱像是 content_field_name。


以上是我對於新增 content 的流程所做的觀察,但這部分會因為不同的模組及設定而有所不同,不過如果只是要從 Drupal 所建立的資料庫中尋找到自己所需的資料來說,相信已經足夠,由上面可看出,實際內容存放的地方以 content 開頭的資料表為最主要,尤其是 content_type 和 content_field,接下來與建立內容相關的統計資料為 node_comment_statis 資料表,並且可以利用 nid 或是 vid 的值去比對出所需資料。

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