麻辣家族討論版版's Archiver

小誌 發表於 2011-4-20 09:53

8-1-1 讀取資料集

[color=DarkRed][size=4][b]8-1-1   讀取資料集[/b][/size][/color]
要讀取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

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

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

小誌 發表於 2011-4-20 10:04

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

所以我們可以利用「mysql_fetch_array()」函數取得一筆資料錄:
[color=Magenta]mysql_fetch_array() 函數[/color][code]array mysql_fetch_array ( int result_identifier ,int [result_type])[/code]result_identifier是必要參數,而result_type則是非必要參數,result_type有下列三種可能值:
[list]
[*]MYSQL_NUM:回傳的資料陣列只包含數字索引。
[*]MYSQL_ASSOC:回傳的資料陣列只包含文字(欄位名稱)索引。
[*]MYSQL_BOTH:回傳的資料陣列包含數字、文字(欄位名稱)索引兩者,此為預設值。
[/list]取得一筆資料錄後,即可利用陣列特性取得取得特定欄位的欄位資料,如下列程式敘述:(範例ex08_05.php)[code]      //資料庫存在,建立SQL命令字串
      $SQL="SELECT * FROM stuentlist";
      //將回傳結果存放於變數中
      $datalist=mysql_query($SQL);
      //將資料錄轉換為欄位陣列集合
      $fielddatas=mysql_fetch_array($datalist);
      //取出註標編號為0的欄位資料
      echo $fielddatas[0] . "<br>";
      //取出班級座號欄位的資料
      echo $fielddatas["班級座號"];[/code]利用「mysql_featch_array()」函數取得一筆資料錄,我們可以數字的元素陣列註標編號(欄位編號)或元素陣列字串註標(欄位抬頭)取得特定欄位內的資料。

小誌 發表於 2011-4-20 10:06

[b][color=Red]注意:[/color][/b]
假若資料表中的欄位名稱以中文命名(繁體中文),則利用「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[code]<?
    $conn = mysql_connect("127.0.0.1", "root", "12345a");
    if(@mysql_select_db("STUDENTS", $conn))
     {
      //資料庫存在,建立SQL命令字串
      $SQL="SELECT * FROM studentlist";
      //指定提取資料的校對字元表
      //mysql_query("set character set big5");
      //將回傳結果存放於變數中
      $datalist=mysql_query($SQL);
      //將資料錄轉換為欄位陣列集合
      $fielddatas=mysql_fetch_array($datalist, MYSQL_BOTH);
      //取出註標編號為0的欄位資料
      echo $fielddatas[0] . "<br>";
      //取出班級座號欄位的資料
      echo $fielddatas["班級座號"];
     }
    else
     {
      echo "資料庫不存在";
     }
?>[/code]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供