Board logo

標題: 8-1-1 讀取資料集 [打印本頁]

作者: 小誌    時間: 2011-4-20 09:53     標題: 8-1-1 讀取資料集

8-1-1   讀取資料集
要讀取mysql_query()函數所取得的資料,就必須先了解資料表的結構,如果我們將資料表作大部的分解,則可區分為欄位抬頭與資料表內容(欄位資料)兩大部分:
[attach]5634[/attach]
圖8-2  大部分解資料表。

「欄位抬頭」是由數個「欄位名稱」所組合而成,如下圖的欄位抬頭就是由「姓名」、「出生年月日」、「身分證字號」、「住址」、「家長」、「電話」、「科別」等欄位名稱所組合而成:
[attach]5629[/attach]
圖8-3  「欄位抬頭」的結構。
作者: 小誌    時間: 2011-4-20 09:54

而「資料表內容」則是由多筆「資料錄(Record)」所集合而成;而每一筆的資料錄又是由多個「欄位(Field)」所組成:
[attach]5635[/attach]
圖8-4   「資料表內容」的結構。

所以,我們可以把資料庫的結構分析如圖8-5,以文字來解釋就是:「資料欄位組成資料錄,資料錄組成資料表,資料表組成資料庫」。
[attach]5631[/attach]
圖8-5  資料庫檔案結構分析。
作者: 小誌    時間: 2011-4-20 09:56

Field物件
資料庫中最小的資料單位為『欄位』,也就是Field物件,Filed物件擁有三個屬性,分別為『Name』(欄位名稱)、『Value』(欄位資料值)、『Type』(欄位資料型態,例如:數字、文字、日期....等等)等三種:
[attach]5633[/attach]
圖8-6  欄位(Field)結構。

要得知資料表中共有多少個欄位可使用「mysql_num_fields()」函數:
mysql_num_fields() 函數
  1. int mysql_num_fields ( int result)
複製代碼
當我們知道資料表中共有多少個欄位就可利用「mysql_field_name()」函數列舉各個欄位的抬頭:
mysql_field_name() 函數
  1. int mysql_field_name ( int result [, int offset])
複製代碼
如果我們要將全部欄位名稱列舉出來,可利用下列這段程式碼:
  1.            //將回傳結果存放於變數中
  2.       $datalist=mysql_query($SQL);
  3.       //取得欄位數量
  4.       $fieldnum=mysql_num_fields($datalist);
  5.       //列出欄位抬頭
  6.       for ($x=0 ;$x<$fieldnum;$x++)
  7.          {
  8.           echo mysql_field_name($datalist,$x) . "<br>";
  9.          }
複製代碼
使用「mysql_field_type()」函數則可列舉出每個欄位的儲存資料型態:
mysql_field_type() 函數
  1. string mysql_field_type ( int result [, int offset])
複製代碼
如果我們要將全部欄位的儲存資料型態列舉出來,可利用下列這段程式碼:
  1. //將回傳結果存放於變數中
  2.       $datalist=mysql_query($SQL);
  3.       //取得欄位數量
  4.       $fieldnum=mysql_num_fields($datalist);
  5.       //列出欄位資料型態
  6.       for ($x=0 ;$x<$fieldnum;$x++)
  7.          {
  8.           echo mysql_field_type($datalist,$x) . "<br>";
  9.          }
複製代碼

作者: 小誌    時間: 2011-4-20 10:04

Fields 集合物件
Field物件的集合就是Fields集合物件,對比於資料庫的組織結構來看,欄位的集合就構成『資料錄』,每一筆的資料錄(Fields集合物件)是由多個「欄位(Field)」所組成,也就說資料錄是採用「陣列」的方式集合多個欄位而成;換言之:「資料錄就是欄位陣列」。
[attach]5636[/attach]
圖8-7  欄位陣列。

所以我們可以利用「mysql_fetch_array()」函數取得一筆資料錄:
mysql_fetch_array() 函數
  1. array mysql_fetch_array ( int result_identifier ,int [result_type])
複製代碼
result_identifier是必要參數,而result_type則是非必要參數,result_type有下列三種可能值:
取得一筆資料錄後,即可利用陣列特性取得取得特定欄位的欄位資料,如下列程式敘述:(範例ex08_05.php)
  1.       //資料庫存在,建立SQL命令字串
  2.       $SQL="SELECT * FROM stuentlist";
  3.       //將回傳結果存放於變數中
  4.       $datalist=mysql_query($SQL);
  5.       //將資料錄轉換為欄位陣列集合
  6.       $fielddatas=mysql_fetch_array($datalist);
  7.       //取出註標編號為0的欄位資料
  8.       echo $fielddatas[0] . "<br>";
  9.       //取出班級座號欄位的資料
  10.       echo $fielddatas["班級座號"];
複製代碼
利用「mysql_featch_array()」函數取得一筆資料錄,我們可以數字的元素陣列註標編號(欄位編號)或元素陣列字串註標(欄位抬頭)取得特定欄位內的資料。
作者: 小誌    時間: 2011-4-20 10:06

注意:
假若資料表中的欄位名稱以中文命名(繁體中文),則利用「mysql_featch_array()」函數取得一筆資料錄後,若以元素陣列字串註標(欄位抬頭)取得特定欄位內的資料時,例如範例ex08_05.php將會發生如圖8-8的「Undefined index」錯誤,此錯誤的發生在於提取資料的校對字元表沒有正確的對應:
[attach]5637[/attach]
圖8-8  提取欄位資料發生錯誤。

為了解決「Undefined index」錯誤的問題,可在使用mysql_query()函數執行SQL命令(SELECT命令)之前,先利用mysql_query()函數指定提取資料的校對字元表:
mysql_query("set character set big5");
因此,範例ex08_05.php應修正如下:
ex08_05a.php
  1. <?
  2.     $conn = mysql_connect("127.0.0.1", "root", "12345a");
  3.     if(@mysql_select_db("STUDENTS", $conn))
  4.      {
  5.       //資料庫存在,建立SQL命令字串
  6.       $SQL="SELECT * FROM studentlist";
  7.       //指定提取資料的校對字元表
  8.       //mysql_query("set character set big5");
  9.       //將回傳結果存放於變數中
  10.       $datalist=mysql_query($SQL);
  11.       //將資料錄轉換為欄位陣列集合
  12.       $fielddatas=mysql_fetch_array($datalist, MYSQL_BOTH);
  13.       //取出註標編號為0的欄位資料
  14.       echo $fielddatas[0] . "<br>";
  15.       //取出班級座號欄位的資料
  16.       echo $fielddatas["班級座號"];
  17.      }
  18.     else
  19.      {
  20.       echo "資料庫不存在";
  21.      }
  22. ?>
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)